RTOS训练营C语言基础-使用C语言封装寄存器

创建时间:2022/2/21 15:03
更新时间:2022/3/30 14:32
作者:gi51wa2j
标签:bingo, C, RTOS训练营, 细节知识

视频讲解链接:https://www.100ask.net/detail/v_61289ebce4b0adcd5a9c684a/3?from=term_6128b5469d408_KtUH9u&type=25&parent_pro_id=

1. STM32的总线结构

2. STM32的存储结构

大多数嵌入式微控制器都是统一编址,使用相同的指令访问内存和IO;
PC电脑X86等采用独立编址,内存空间是4G,IO空间是单独的64K,分别使用不同的指令访问。
以修改GPIOB为例子
嵌入式操作外设,其实就是通过给CPU指令,让其通过地址总线和数据总线来在对应外设的寄存器地址(在内存的地址位置处),对应位置上按照其手册功能,写入对应的值(0/1),然后CPU就可以执行相应的功能。

3. C语言封装寄存器

3.1 寄存器单独封装——低效方式

每个寄存器这样单独编写程序

3.2 外设寄存器结构体封装——高效方式

缘由:结构体内成员变量在内存中的地址是连续的。
使用结构体抽象出寄存器,然后宏定义寄存器地址
对上述情况进行优化,使用typedef可以避免在宏定义时仍然需要添加struct的情况

3.3 软件仿真

测试代码
/* lesson4:封装寄存器 */ typedef struct { volatile unsigned int  CRL; volatile unsigned int  CRH; volatile unsigned int  IDR; volatile unsigned int  ODR; volatile unsigned int  BSRR; volatile unsigned int  BRR; volatile unsigned int  LCKR; }GPIO_TypeDef; #define GPIOA  ((GPIO_TypeDef *)  0x40010800) #define GPIOB  ((GPIO_TypeDef *)  0x40010C00) #define GPIOC  ((GPIO_TypeDef *)  0x40011000) int main(void) {   GPIOB->ODR |= (1<<7) | (1<<9); return 0; }
注意:由于GPIOB使用宏定义的缘故,所以在监视器中无法看到ODR的值,我们采用如下方法,软件仿真
置位成功