从STM32F提供的库来看,每个外设的寄存器都通过结构体包裹,结构体的实体被分配到该组寄存器的基地址,这样所有组内的寄存器就都有了定位,我的理解如下(初学者,问题可能比较低级),举例如下: //#ifdef _GPIOC #define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) //#endif /*_GPIOC */
GPIOC被指向到 GPIO_TypeDef类型的一个地址(GPIOC_BASE), map.h 中可以看到: typedef struct { vu32 CRL; vu32 CRH; vu32 IDR; vu32 ODR; vu32 BSRR; vu32 BRR; vu32 LCKR; } GPIO_TypeDef;
我的理解为在上面的GPIO_TypeDef结构中 CRL CRH IDR 等结构成员按顺序排列,占据的实际地址要看编译器的选择,比如iar中要做如下图所示的设定
如附图所示设置即可以保证上述结构成员偏移量(地址差值)相差为4, 即可令 结构成员 CRL 对应到GPIOC_BASE偏移量为0的位置,IDR 对应到偏移量为8的位置。从而可以对应到 在实际上地址存在的GPIOx_CRL GPIOx_CRH GPIOx_IDR GPIOx_ODR 等一组寄存器, 以上为我的理解,不知对否?纯属菜鸟,请指正 |