OpenEdv-开源电子网

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

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

[复制链接]

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2017-6-10
在线时间
10 小时
发表于 2017-6-10 22:00:19 | 显示全部楼层 |阅读模式
2金钱
今天仔细看了下原子哥提供的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的地址,但是代码注释后面的地址又都是正确的,这就这纳闷了,求哪位高手解答一下(新手,金币不多)

最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-6-12 20:19:57 | 显示全部楼层
回复

使用道具 举报

1

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2017-5-10
在线时间
55 小时
发表于 2017-6-10 22:00:20 | 显示全部楼层
20是0x14不是0x20
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-6-10 22:06:15 | 显示全部楼层
说明你的对比有问题。将地址直接printf出来,再对比。
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-6-11 09:03:56 | 显示全部楼层
学习STM32,请把重点放在OS,DMA,USB等高级功能上.不要把时间浪费在地址对不对上面.如果地址不对.你的操作结果肯定出问题了.没有出问题就是正确的.只是你看错了.或者理解错了.
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2017-6-10
在线时间
10 小时
 楼主| 发表于 2017-6-11 13:24:33 | 显示全部楼层
操作系统 发表于 2017-6-11 09:03
学习STM32,请把重点放在OS,DMA,USB等高级功能上.不要把时间浪费在地址对不对上面.如果地址不对.你的操作结 ...

我想把system文件夹移植到F3的片子上使用,但是在移植sys文件的时候,移植不成功,位带操作不能实现,所以就想是不是地址没搞对,就有了上述的疑问
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2017-6-10
在线时间
10 小时
 楼主| 发表于 2017-6-11 13:46:49 | 显示全部楼层
正点原子 发表于 2017-6-10 22:06
说明你的对比有问题。将地址直接printf出来,再对比。

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

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2017-6-6
在线时间
12 小时
发表于 2017-6-11 14:37:09 来自手机 | 显示全部楼层
并不是所有的地址都一样,而且库函数也不一样
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2017-6-10
在线时间
10 小时
 楼主| 发表于 2017-6-11 15:29:04 | 显示全部楼层
风雨探索 发表于 2017-6-11 14:37
并不是所有的地址都一样,而且库函数也不一样

这个sys.h文件是在库的地址上进行偏移的,GPIOx_BASE这个地址是库里面的地址,这个文件的移植应该与库无关,主要是偏移量
回复

使用道具 举报

1

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2017-5-10
在线时间
55 小时
发表于 2017-6-12 17:24:36 | 显示全部楼层
GPIOB_ODR_Addr = 0x4000 0000 + 0x0002 0000 + 0x0400 + 20 = 0x40020014 没问题啊
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2017-6-10
在线时间
10 小时
 楼主| 发表于 2017-6-12 20:14:10 | 显示全部楼层

晕死了,我看到基地址是是16进制,以为20也是16进制呢,看来问题的角度没找对,改写成这样就好看了:#define GPIOD_ODR_Addr    (GPIOD_BASE+0x14)
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2017-6-10
在线时间
10 小时
 楼主| 发表于 2017-6-12 23:13:53 | 显示全部楼层
正点原子 发表于 2017-6-12 20:19
F3不支持位带操作,看这里:http://www.openedv.com/forum.php?mod=viewthread&tid=41566&highlight=F3%2B% ...

心累,我还搞了那么久
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2017-6-10
在线时间
10 小时
 楼主| 发表于 2017-6-12 23:14:28 | 显示全部楼层
ToFly 发表于 2017-6-12 23:13
心累,我还搞了那么久

多些原子哥提醒
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-19 21:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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