0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32单片机中C语言操作寄存器的原理

单片机与嵌入式 来源:单片机与嵌入式 2023-11-30 14:08 次阅读

映射的概念

存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程就称为存储器映射,如下图所示的4GB空间(从block0-block7每个block512M)。在梳理STM32芯片的内部架构中提到的被控单元FLASH、RAM、FSMC和APB等功能部件共同排列在这4GB的地址空间内。在编程的时候,可以通过他们的地址找到他们,然后通过C语言对它们进行数据的读和写操作。

8d6e0094-8f36-11ee-939d-92fbcf53809c.png

存储器映射

在这 4GB 的地址空间中,ARM 已经粗线条的平均分成了 8 个块,每块 512MB,每个块也都规定了用途,具体分类见如下表格。在这 8 个 Block 里面,有 3 个块非常重要,也是我们最关心的三个块。Block0 用来设计成内部FLASH,Block1 用来设计成内部 RAM,Block2 用来设计成片上的外设。其中,Block2 用于设计片内的外设,根据外设的总线速度不同,Block 被分成了AHB、APB1、APB2。

8d98e502-8f36-11ee-939d-92fbcf53809c.png

存储器本身没有地址,给存储器分配地址的过程叫存储器映射,那什么叫寄存器映射?寄存器到底是什么?在存储器 Block2 这块区域,设计的是片上外设,它们以四个字节为一个单元,共 32bit,每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作。我们可以找到每个单元的起始地址,然后通过 C 语言指针的操作方式来访问这些单元,如果每次都是通过这种地址的方式来访问,不仅不好记忆还容易出错,这时我们可以根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。

通过C语言操作寄存器的例子

GPIOB端口的输出数据寄存器ODR的地址是0x40010C0C,ODR寄存器是32bit,低16bit有效,对应着16个外部IO,写0、1对应的IO则输出低、高电平。现在我们通过C语言指针的操作方式,让GPIOB的16个IO都输出高电平,见如下代码。

// GPIOB 端口全部输出 高电平 
*(unsigned int*)(0x4001 0C0C) = 0xFFFF;

0x40010C0C在我们看来是GPIOB端口ODR的地址,但是在编译器看来,这只是一个普通的变量,是一个立即数,要想让编译器也认为是指针,我们得进行强制类型转换,把它转换成指针,即(unsigned int *)0x4001 0C0C,然后再对这个指针进行*操作。

通过绝对地址访问内存单元不好记忆且容易出错,可以通过寄存器的方式来操作,具体见如下代码。

//GPIOB端口全部输出高电平
#defineGPIOB_ODR(unsignedint*)(GPIOB_BASE+0x0C)
*GPIOB_ODR=0xFF;

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6036

    文章

    44555

    浏览量

    635031
  • 寄存器
    +关注

    关注

    31

    文章

    5342

    浏览量

    120301
  • 存储器
    +关注

    关注

    38

    文章

    7487

    浏览量

    163809
  • STM32
    +关注

    关注

    2270

    文章

    10899

    浏览量

    355886
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136772

原文标题:STM32单片机中C语言操作寄存器的原理

文章出处:【微信号:单片机与嵌入式,微信公众号:单片机与嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32单片机C语言基础知识

    C语言单片机开发的必备基础知识,本文列举了部分STM32学习中比较常见的一些C
    发表于 09-21 17:21 4564次阅读

    STM32单片机使用寄存器是如何进行操作

    以下实例为STM32单片机使用寄存器进行操作的一个头文件的代码因为直接对寄存器进行
    发表于 07-15 06:15

    51单片机汇编语言教程_单片机的特殊功能寄存器

    51单片机汇编语言教程:7课单片机的特殊功能寄存器
    发表于 01-19 15:26 0次下载

    STM32库函数和寄存器应该如何操作

    从开始接触51单片机,到现在开始转型学习功能更加强大的STM32f407系列,学习过程引入了库函数及相应操作,当时赶着进度做点东西出来,有点不求甚解。现在返回来求索:相比于原来51
    发表于 09-10 17:26 3次下载
    <b class='flag-5'>STM32</b>库函数和<b class='flag-5'>寄存器</b>应该如何<b class='flag-5'>操作</b>

    51单片机特殊功能寄存器C51程序的定义详细说明

    具有位寻址能力,它们的字节地址都能被8整除,即字节地址是以8或0为尾数的。为了能直接访问这些SPR,Franklin C51提供了一种自主形式的定义方法,这种定义方法与标准C语言不兼容,只适合与对MCS-51系列
    发表于 07-22 17:37 1次下载
    51<b class='flag-5'>单片机</b>特殊功能<b class='flag-5'>寄存器</b>在<b class='flag-5'>C</b>51程序<b class='flag-5'>中</b>的定义详细说明

    STM32单片机不完全手册之寄存器版本

    STM32单片机不完全手册之寄存器版本
    发表于 07-31 16:10 0次下载

    单片机寄存器

    单片机寄存器其实就相当于一个变量,只不过这个变量在固定的地址,有一个特殊的名称(当然也不强制)。初学者对寄存器操作比较困难的原因不是汇编语言
    发表于 11-10 18:35 11次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>寄存器</b>

    C语言操作在(单片机)寄存器的应用

    C语言操作寄存器的应用本文参考另一篇博客写成附链接,个人感觉内容过多不便于吸收,就写了这篇博客。整体思想:设置一个位就是设置该位为1,
    发表于 11-29 10:06 8次下载
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>位<b class='flag-5'>操作</b>在(<b class='flag-5'>单片机</b>)<b class='flag-5'>寄存器</b><b class='flag-5'>中</b>的应用

    32单片机 C语言 寄存器(四)

    32单片机C语言相关知识以及寄存器地址名称映射分析
    发表于 11-29 10:06 12次下载
    32<b class='flag-5'>单片机</b> <b class='flag-5'>C</b><b class='flag-5'>语言</b> <b class='flag-5'>寄存器</b>(四)

    C语言寄存器操作

    C语言寄存器操作
    发表于 01-13 12:56 6次下载
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>:<b class='flag-5'>寄存器</b><b class='flag-5'>操作</b>

    STM32寄存器操作

    STM32寄存器操作在使用STM32单片机编程时一般都用ST给的库函数编程,库函数编程的底层就是对单片
    发表于 01-13 15:43 19次下载
    <b class='flag-5'>STM32</b>的<b class='flag-5'>寄存器</b><b class='flag-5'>操作</b>

    STM32单片机C语言操作寄存器的原理

    存储本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储分配地址的过程就称为存储映射
    发表于 02-08 17:08 0次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>单片机</b><b class='flag-5'>中</b><b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>操作</b><b class='flag-5'>寄存器</b>的原理

    C语言操作寄存器的常见手法

    使用C语言寄存器赋值时,常常需要用到C语言的位操作方法。把
    的头像 发表于 03-12 09:06 3352次阅读

    单片机寄存器有哪些 单片机寄存器怎么理解 寄存器单片机的关系

    单片机寄存器是一种特殊的存储器件,用于存储和处理程序的数据和指令。可以将单片机寄存器看作是CPU内部的工作区域,类似于人的大脑,用于暂时存
    发表于 04-01 15:47 6304次阅读

    单片机工作寄存器作用 单片机常用专用寄存器

    除了通用寄存器(如累加、通用寄存器等),单片机还会有特定功能的寄存器,如定时
    的头像 发表于 04-08 14:46 7551次阅读