STM32是32位的芯片,意味着有从0x00000000~0xFFFFFFFF 4G也就是32位的寻址空间,在设计芯片的时候,采用的是ARM所设计的架构,ST(意法半导体)公司在基于ARM的对芯片添加了自己的外设。
注意:这里是一个地址空间存放一个字节,即1Byte
ARM规定:
Vendor-specific memory 511MB 存放特定厂商的代码
Private peripheral bus 1M 物理总线
External device 1.0GB 片上外设不够用时,外扩在此区域
Extermal RAM 1.0GB RAM空间不够用时,外扩在此区域
peripheral 0.5GB 外设都在此区域 如 GPIO口,定时器等等
SRAM 0.5GB 用来存放运行时的数据
Code(Flash) 0.5GB 用来存放相应的代码和数据
ST公司又根据ARM的划分添加了相应的外设
以GPIO口为例:我们操作GPIO口实际上是操作地址为0x40020000~0x400223FF的寄存器
ST的封装如下:
GPIO_TypeDef * 是一个结构体指针类型,而这个结构体的地址为各个端口号的基地址,
地址计算为:PERIPH_BASE设备的基地址加上0x00020000的偏移地址为AHB1的地址,AHB1的地址加上各个端口的偏移地址即为各个GPIO口的基地址,再加上每个端口上寄存器的偏移量就得到了该寄存器的地址。
重写GPIOF的寄存器
#define GPIOF_BASEADDR 0x40021400 #define rGPIOF_MODER *(uint32_t *)(GPIOF_BASEADDR+0x00) #define rGPIOF_OTYPER *(uint32_t *)(GPIOF_BASEADDR+0x04) #define rGPIOF_OSPEEDR *(uint32_t *)(GPIOF_BASEADDR+0x08) #define rGPIOF_PUPDR *(uint32_t *)(GPIOF_BASEADDR+0x0C) void LED_myCOnfig(void) { RCC->AHB1ENR |= (1<<5); rGPIOF_MODER &=~ (3<<12); rGPIOF_MODER |= (1<<12); rGPIOF_OTYPER &=~ (1<<6); rGPIOF_OSPEEDR &=~ (3<<12); rGPIOF_OSPEEDR |= (2<<12); rGPIOF_PUPDR &=~ (3<<12); }