今天看认真看了下原子哥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-20 14:59
F3不支持位带操作,看这里:http://www.openedv.com/forum.php ... t=F3%2B%CE%BB%B4%F8
cromarti
2楼-- · 2019-07-20 15:31
 精彩回答 2  元偷偷看……
正点原子
3楼-- · 2019-07-20 19:59
说明你的对比有问题。将地址直接printf出来,再对比。
操作系统
4楼-- · 2019-07-20 23:09
学习STM32,请把重点放在OS,DMA,USB等高级功能上.不要把时间浪费在地址对不对上面.如果地址不对.你的操作结果肯定出问题了.没有出问题就是正确的.只是你看错了.或者理解错了.
ToFly
5楼-- · 2019-07-20 23:53
 精彩回答 2  元偷偷看……
ToFly
6楼-- · 2019-07-21 02:58
正点原子 发表于 2017-6-10 22:06
说明你的对比有问题。将地址直接printf出来,再对比。

原子哥,我想把你F407的system文件夹移植到F373的片子上使用,但是在移植sys文件的时候,移植不成功,位带操作不能实现,我看了两个片子的参考手册,他们的IDR和ODR寄存器的偏移地址都是一样的,但为什么不成功呢,请原子哥指点一下

一周热门 更多>