原子哥的开发板刚买回来不久,烧了几个程序,都OK。我初步接触32单片机,学起来还是感觉有点费劲,在学习的同时又在不断的补习C语言知识。那么从最基本的跑马灯实验说起吧!
GPIOA->CRH&=0XFFFFFFF0;
GPIOA->CRH|=0X00000003;//设置PA8为推挽输出
然后GPIOA是一个宏,#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
GPIO_TypeDef是一个typedef,
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;
那么#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) 这一句相当于定义了一个指针型结构体变量GPIOA_BASE,GPIOA->CRH是结构体指针变量访问结构体成员CRH。
看到这里我就糊涂了,GPIOA_BASE经过一次次的宏之后实际它是一个地址值,那么一个常数又怎么能定义为指针型结构体变量呢?还有,GPIOA的CRH究竟是如何赋值的呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
地址的首地址,就是结构体的首地址,然后结构体里面的成员,按照各自的宽度,依次递增。
比如都是u32的话,首地址假设是0X1000 0000,那么CRL地址就是0X1000 0000,CRH就是0X1000 0000+4。
后续的依次类推。
一周热门 更多>