OpenEdv-开源电子网

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

位带操作地址映射

[复制链接]

15

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2016-12-9
在线时间
33 小时
发表于 2017-6-1 01:15:49 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 loverwtf 于 2017-6-2 23:25 编辑

# define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr & 0xFFFFF)<<5)+(bitnum<<2))    //这是sys.h中的映射代码

AliasAddr=  0x22000000+((A‐0x20000000)*8+n)*4 =0x22000000+ (A‐0x20000000)*32 + n*4                      //SRAM映射公式

AliasAddr=  0x42000000+((A‐0x40000000)*8+n)*4 =0x42000000+ (A‐0x40000000)*32 + n*4                        //片上外设映射公式


映射公式跟sys.h中的映射代码不一样啊,是怎么回事,另外请教一下为什么映射到那个地址(为什么这里用的动词是映射,我觉得好像就是指定了一块特定的地址啊)之后访问的还是之前的寄存器




最佳答案

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

怪我想当然了 没去化简 形式不一样 结果是一样的[/backcolor] ((addr & 0xF0000000)+0x2000000 = 0x22000000[/backcolor] ((addr & 0xFFFFF)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2016-12-9
在线时间
33 小时
 楼主| 发表于 2017-6-1 01:15:50 | 显示全部楼层
本帖最后由 loverwtf 于 2017-6-7 22:45 编辑

怪我想当然了 没去化简 形式不一样 结果是一样的
((addr & 0xF0000000)+0x2000000 = 0x22000000
((addr & 0xFFFFF)<<5) = (A‐0x20000000)*32
(bitnum<<2) = n*4
等号左边全部相加可以得到sys代码中的公式
等号右边全部相加可以得到映射公式
回复

使用道具 举报

15

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2016-12-9
在线时间
33 小时
 楼主| 发表于 2017-6-2 23:26:09 | 显示全部楼层
自己顶贴,求大神回复!
回复

使用道具 举报

58

主题

288

帖子

1

精华

高级会员

Rank: 4

积分
814
金钱
814
注册时间
2012-3-29
在线时间
81 小时
发表于 2017-6-7 22:35:42 | 显示全部楼层
寄存器的某一个位映射到位带,对位带某个地址的访问相当于访问该地址对应的某个寄存器中的一个位,位带的访问速度比寄存器快。映射地址的计算没仔细的算过,你可以看下手册上讲的挺详细的。
回复

使用道具 举报

15

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2016-12-9
在线时间
33 小时
 楼主| 发表于 2017-6-7 22:45:00 | 显示全部楼层
怪我想当然了 没去化简 形式不一样 结果是一样的
((addr & 0xF0000000)+0x2000000 = 0x22000000
((addr & 0xFFFFF)<<5) = (A‐0x20000000)*32
(bitnum<<2) = n*4
等号左边全部相加可以得到sys代码中的公式
等号右边全部相加可以得到映射公式
回复

使用道具 举报

58

主题

288

帖子

1

精华

高级会员

Rank: 4

积分
814
金钱
814
注册时间
2012-3-29
在线时间
81 小时
发表于 2017-6-7 23:11:44 | 显示全部楼层
loverwtf 发表于 2017-6-7 22:45
怪我想当然了 没去化简 形式不一样 结果是一样的
((addr & 0xF0000000)+0x2000000 = 0x22000000
((addr & ...

我也刚看了下,SRAM和外设的位带别名区只是高4位不一样所以addr 是0x2000 0000或者0x4000 0000是SRAM或外设的起始地址 +0x0200 0000 就是位带别名区的基地址了,后边的移位运算就是乘了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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