视频讲解链接: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的值,我们采用如下方法,软件仿真
置位成功