为什么GPIOx->CRL直接代表了寄存器的值。 GPIOx是结构体指针 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; 但是GPIOx并没有指向一个具体的结构体啊,CRL只是也只是结构体中的一个变量啊,为什么可以直接通过GPIOx->CRL来设置寄存器的值呢? |
评分
查看全部评分
所以后面就可以用GPIOA访问寄存器了
评分
查看全部评分
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;
结构体中,每个变量的长度都是4字节,因此,你是可以通过结构体计算出每个变量的实际地址,这个就是你看手册时候,手册上的偏移量的作用。
评分
查看全部评分
例如GPIOA
首先会定义定义外设基地址->APB2时钟总线的base_addr->GPIOA_ADDRESS_BASE
+(加号后面的属于偏移量)
如果GPIOA->CRL其实就是指向的是0x40000000+0x10000+0x0800+0x00= 0x40010800这个地址
如果是GPIOA->ODR就是指向0x40000000+0x10000+0x0800+0x04 = 0x40010804这个地址
评分
查看全部评分
评分
查看全部评分