今天看认真看了下原子哥F407的system文件夹,发现sys.h中的ODR和IDR地址不对,但程序又能正常工作,求解释

2019-07-20 14:01发布

今天仔细看了下原子哥提供的F4的SYSTEM文件夹,发现sys.h中的IDR和ODR寄存器地址不对,但程序又能正常工作,不知道怎么回事。下图是sys.h位带操作实现原理:
F407位带操作实现原理 F407位带操作实现原理
我们来计算GPIOB_ODR_Addr和GPIOB_IDR_Addr的地址:
GPIOB_ODR_Addr = 0x4000 0000 + 0x0002 0000 + 0x0400 + 0x20 = 0x40020420,
但是查看《STM32Fxx中文参考手册》


第2.3章节 ,GPIOB的地址边界是:0x4002 0400 - 0x4002 07FF;
第7.4.6 章节,GPIO 端口输出数据寄存器 (GPIOx_ODR) 的偏移地址为:0x14;
第7.4.9 章节,GPIO 复用功能低位寄存器 (GPIOx_AFRL) 的偏移地址为:0x20;


那么
GPIOB_ODR的地址为:0x4002 0400 + 0x14 = 0x4002 0414 ;
GPIOB_AFRL的地址为:0x4002 0400 + 0x20 = 0x4002 0420;

那么问题来了:GPIOB_ODR_Addr 的地址 == GPIOB_AFRL的地址,但是代码注释后面的地址又都是正确的,这就这纳闷了,求哪位高手解答一下(新手,金币不多)

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
风雨探索
1楼-- · 2019-07-21 07:08
 精彩回答 2  元偷偷看……
ToFly
2楼-- · 2019-07-21 07:24
 精彩回答 2  元偷偷看……
cromarti
3楼-- · 2019-07-21 10:59
GPIOB_ODR_Addr = 0x4000 0000 + 0x0002 0000 + 0x0400 + 20 = 0x40020014 没问题啊
ToFly
4楼-- · 2019-07-21 12:54
cromarti 发表于 2017-6-12 17:26
20是0x14不是0x20

晕死了,我看到基地址是是16进制,以为20也是16进制呢,看来问题的角度没找对,改写成这样就好看了:#define GPIOD_ODR_Addr    (GPIOD_BASE+0x14)
ToFly
5楼-- · 2019-07-21 15:03
 精彩回答 2  元偷偷看……
ToFly
6楼-- · 2019-07-21 21:02
 精彩回答 2  元偷偷看……

一周热门 更多>