stm32 C语言特殊性

2025-04-24 14:55:15
推荐回答(1个)
回答1:

这是标准的C语言啊,不是STM32的特殊用法,你那个写的是对的,相当于:

((int *) 0x00000000) = 1;

这么个意思;

那么为什么要用结构体呢?
不是C语言的特殊用法,是因为STM32这种单片机的外设架构,STM32把所有同类型的外设集中到了一块,这样库就好写多了。
太详细我也说不明白,给你举个例子吧:

比如说,我是说比如啊,GPIOA的CRL寄存器地址是0,CRH寄存器地址是4,IDR寄存器地址是8,ODR寄存器地址是12,那么,按照你刚才的写法是

#define GPIOA_CRL *((unsigned long*)(0x00000000))
#define GPIOA_CRH *((unsigned long*)(0x00000004))
#define GPIOA_IDR *((unsigned long*)(0x00000008))
#define GPIOA_ODR *((unsigned long*)(0x0000000C))

如果用结构体,就方便多了
typedef struct
{
vu32 CRL;
vu32 CRH;
vu32 IDR;
vu32 ODR;
vu32 BSRR;
vu32 BRR;
vu32 LCKR;
} GPIO_TypeDef;

GPIO_TypeDef *GPIOA = (GPIO_TypeDef *)(0x00000000);
这样一写,那么,就注定了GPIOA->CRL 的地址肯定是0;
GPIOA->CRH的地址肯定是4;
GPIOA->IDR的地址肯定是8;
比你那样写省事了不少吧?