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

映射的概念
    存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程就称为存储器映射,如下图所示的4gb空间(从block0-block7每个block512m)。在梳理stm32芯片的内部架构中提到的被控单元flash、ram、fsmc和apb等功能部件共同排列在这4gb的地址空间内。在编程的时候,可以通过他们的地址找到他们,然后通过c语言对它们进行数据的读和写操作。
存储器映射
    在这 4gb 的地址空间中,arm 已经粗线条的平均分成了 8 个块,每块 512mb,每个块也都规定了用途,具体分类见如下表格。在这 8 个 block 里面,有 3 个块非常重要,也是我们最关心的三个块。block0 用来设计成内部flash,block1 用来设计成内部 ram,block2 用来设计成片上的外设。其中,block2 用于设计片内的外设,根据外设的总线速度不同,block 被分成了ahb、apb1、apb2。
存储器本身没有地址,给存储器分配地址的过程叫存储器映射,那什么叫寄存器映射?寄存器到底是什么?在存储器 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 端口全部输出高电平 #define gpiob_odr (unsigned int *)(gpiob_base+0x0c)* gpiob_odr = 0xff;  


外壳冲压技术的优势及应用行业
Type-C有哪些优势
曾鸣分析智能电网 泛在电力物联网与能源革命
ACS(非对称共面波导)天线仿真案例分享
网络安全是新基建的基石,离开网络安全一切都是空谈
STM32单片机中C语言操作寄存器的原理
Teknek让技术颠覆传统 NEPCON ASIA 2021邀您来看
雷曼光电荣膺2023行家极光奖三大年度奖项
为什么选择软件定义GNSS模拟器?优势有这些
汇顶科技进入触控IC市场 商业化NB-Ito即将推出
5G时代运营该如何实现转型
长江存储迎来荷兰光刻机,国产SSD固态硬盘将更上一层楼
AMD公布2023年第二季度财报 总营业额达54亿美元
山东:提升制造业供给体系质量,加快关键核心技术突破
水产品抗生素残留检测仪产品说明
人工智能如何助力Entel提升效率
Mouser开始备货TI TPSM846C24电源模块
安捷伦E4438C信号发生器输出功率低维修
智能变电站的作用
国内SSD卖得最好的是哪些品牌