OpenEdv-开源电子网

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

为什么IWDG->KR就能对KR寄存器操作?

[复制链接]

4

主题

11

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-10-10
在线时间
0 小时
发表于 2015-10-10 11:03:12 | 显示全部楼层 |阅读模式
5金钱
IWDG是一个IWDG_TypeDef型的指针,指向结构体,KR只是一个成员变量,为什么对KR操作就可以等价于对KR寄存器操作?
求大家帮忙啊~~~~

最佳答案

查看完整内容[请看2#楼]

这个看起来简单,但涉及M3的寄存器地址定义,根据stm32头文件的定义,是一层套一层的。 #define IWDG                ((IWDG_TypeDef *) IWDG_BASE) 首先 typedef struct {   __IO uint32_t KR;   /*!< IWDG Key register,       Address offset: 0x00 */   __IO uint32_t PR;   /*!< IWDG Prescaler register, Address offset: 0x04 */ & ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

401

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1769
金钱
1769
注册时间
2015-6-11
在线时间
313 小时
发表于 2015-10-10 11:03:13 | 显示全部楼层
这个看起来简单,但涉及M3的寄存器地址定义,根据stm32头文件的定义,是一层套一层的。
#define IWDG                ((IWDG_TypeDef *) IWDG_BASE)
首先
typedef struct
{
  __IO uint32_t KR;   /*!< IWDG Key register,       Address offset: 0x00 */
  __IO uint32_t PR;   /*!< IWDG Prescaler register, Address offset: 0x04 */
  __IO uint32_t RLR;  /*!< IWDG Reload register,    Address offset: 0x08 */
  __IO uint32_t SR;   /*!< IWDG Status register,    Address offset: 0x0C */
} IWDG_TypeDef;
以我用的stm32f207为例,这是IWDG的map表


结构体默认是4字节对齐的,那么
IWDG->KR就相当于修改的是IWDG_BASE偏移0x00地址的数据,也就是IWDG_KR寄存器实际的地址。
那么 IWDG_BASE怎么确定的呢?
#define IWDG_BASE                 (APB1PERIPH_BASE + 0x3000)
#define APB1PERIPH_BASE       PERIPH_BASE
#define PERIPH_BB_BASE        ((uint32_t)0x42000000)
从上面可以推出IWDG->KR 就等同于*(volatile u32_t *)42003000,也就是实际的地址。
如果还有不解建议阅读Cortex-m3权威指南第5章存储系统。

回复

使用道具 举报

4

主题

11

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-10-10
在线时间
0 小时
 楼主| 发表于 2015-10-10 12:03:33 | 显示全部楼层
回复【2楼】zc123:
---------------------------------
谢谢你!解释的好明白啊!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 11:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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