stm32固件库内可以看见指向结构体的指针,其赋值如下:
例:GPIOA->ODR=0x00000000; 此句是为ODR寄存器赋值为0x00000000;
在stm32f10x.h文件里定义了以下结构体
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;
然后 定位GPIO_TypeDef,到 #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
发现 GPIOA_BASE被强制转换为GPIO_TypeDef指针。注意:C语言里,用p->num格式表示p所指向结构体中的num成员。
继续定位 GPIOA_BASE,发现其是 #define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) 为基址加变址
继续定位APB2PERIPH_BASE :#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
继续定位PERIPH_BASE :#define PERIPH_BASE ((uint32_t)0x40000000) 发现其为一个地址
把地址相加,0x0800+0x10000+0x40000000=0x40010800
和手册里的值相等
gpio其他寄存器地址从首地址依次加四。此部分介绍在《stm32不完全手册-库函数版》p104页有介绍。