OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7145|回复: 2

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

[复制链接]

12

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2014-10-22
在线时间
17 小时
发表于 2014-10-22 15:59:44 | 显示全部楼层 |阅读模式
5金钱
原子哥的开发板刚买回来不久,烧了几个程序,都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#楼]

将一个固定地址,强制转换为一个结构体而已。 地址的首地址,就是结构体的首地址,然后结构体里面的成员,按照各自的宽度,依次递增。 比如都是u32的话,首地址假设是0X1000 0000,那么CRL地址就是0X1000 0000,CRH就是0X1000 0000+4。 后续的依次类推。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-10-22 15:59:45 | 显示全部楼层
将一个固定地址,强制转换为一个结构体而已。
地址的首地址,就是结构体的首地址,然后结构体里面的成员,按照各自的宽度,依次递增。
比如都是u32的话,首地址假设是0X1000 0000,那么CRL地址就是0X1000 0000,CRH就是0X1000 0000+4。
后续的依次类推。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

12

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2014-10-22
在线时间
17 小时
 楼主| 发表于 2014-10-23 11:31:13 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥我懂了,非常感谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 04:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表