新手求教,关于寄存器设置的问题,求解答。

2019-07-21 04:40发布

原子哥的开发板刚买回来不久,烧了几个程序,都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究竟是如何赋值的呢?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
正点原子
1楼-- · 2019-07-21 10:12
将一个固定地址,强制转换为一个结构体而已。
地址的首地址,就是结构体的首地址,然后结构体里面的成员,按照各自的宽度,依次递增。
比如都是u32的话,首地址假设是0X1000 0000,那么CRL地址就是0X1000 0000,CRH就是0X1000 0000+4。
后续的依次类推。
xielei
2楼-- · 2019-07-21 15:54
 精彩回答 2  元偷偷看……

一周热门 更多>