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

置位成功
