OpenEdv-开源电子网

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

位带操作相关问题

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2011-11-24
在线时间
0 小时
发表于 2011-11-30 20:34:52 | 显示全部楼层 |阅读模式

#define    BITBAND(addr, bitnum)     ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define    MEM_ADDR(addr)      *((volatile unsigned long  *)(addr))
#define    BIT_ADDR(addr, bitnum)        MEM_ADDR(BITBAND(addr, bitnum))

 

第一行里面 +0x2000000 和+ bitnum<<2 我能理解,为啥还要先用 addr&0xf000000 呢?还有为啥要加上 (addr&0xfffff)<<5  ?

 

心至善,情至诚,志至坚;得意不可忘形,失意不可失志。穷则独善其身,达则兼济天下。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2011-11-24
在线时间
0 小时
 楼主| 发表于 2011-12-1 13:03:23 | 显示全部楼层
总算是明白了这句话后面算式的意思

#define BITBAND(addr, bitnum) ((addr&0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2))

支持位带操作的两个内存区的范围是: 
0x2000_0000-0x200F_FFFF(SRAM区中的最低1MB ) 
0x4000_0000-0x400F_FFFF(片上外设区中的最低1MB )

位带别名区把每个比特膨胀成一个 32位的字。当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的(这种说法比较绕,我觉着其实就是给每一位都有一个对应的地址,想访问这一位,就直接访问这个地址就行了,上面那个宏恰好就是计算这个地址的公式)

从CM3权威指南我们知道
对于SRAM位带区的某个比特,记它所在字节地址为 A,位序号为n(0<=n<=7),则
该比特在别名区的地址为: 
AliasAddr = 0x22000000+((A-0x20000000)*8+n)*4=0x22000000+(A-0x20000000)*32+n*4  
对于片上外设位带区的某个比特,记它所在字节的地址为 A,位序号为 n(0<=n<=7),则
该比特在别名区的地址为: 
AliasAddr = 0x42000000+((A-0x40000000)*8+n)*4=0x42000000+(A-0x40000000)*32+n*4  
上式中,“*4”表示一个字为 4 个字节,“*8”表示一个字节中有 8 个比特。

这个宏定义后面的算式(addr&0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2)
addr&0xF0000000取出最高的四位,其实就是用于区别SRAM(0x20000000)还是片上外设(0x40000000)的。

+0x2000000对于SRAM位带区则得到 0x22000000,对于片上外设位带区则得到0x42000000

(addr&0xFFFFF)等效于(addr&0x000FFFFF),就是屏蔽掉高12位(个人认为屏蔽高12位和屏蔽高4位效果是一样的,
地址范围是0x2000_0000-0x200F_FFFF和0x4000_0000-0x400F_FFFF,他无非就是不要那个“2”和“4”),
<<5就等效于乘以32 ( 同样<<2等效于乘以4 )。

心至善,情至诚,志至坚;得意不可忘形,失意不可失志。穷则独善其身,达则兼济天下。
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-11-30 22:43:34 | 显示全部楼层
看权威指南.第87页,图5.3B.
自己在本子上推算一下,看看公式是不是89页所说的那两个公式.
如果是,那么这句话(addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) ,完全就是那个公式的另外一种形式.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2012-7-24
在线时间
0 小时
发表于 2012-7-24 15:26:22 | 显示全部楼层
新手,谢谢楼主啦
回复 支持 反对

使用道具 举报

11

主题

86

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2012-4-26
在线时间
70 小时
发表于 2012-10-22 19:37:41 | 显示全部楼层
对我等新手有用。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-6-22
在线时间
0 小时
发表于 2013-6-22 12:24:41 | 显示全部楼层
恩,我们知道1M的位带用32M来代替,但我是没有看懂,怎么联系用法!
吃饱了,没有事做
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-7-12
在线时间
0 小时
发表于 2013-7-13 00:49:32 | 显示全部楼层
回复【3楼】zfavourite99:
---------------------------------
楼主讲的很好   对理解I/O宏定义有很大帮助   谢谢
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-8-13
在线时间
0 小时
发表于 2013-8-27 17:30:38 | 显示全部楼层
回复【3楼】zfavourite99:
---------------------------------
精辟,获益匪浅呀,谢谢!
事实证明,一个人迫于无奈的选择往往是正确的.
回复 支持 反对

使用道具 举报

10

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2014-5-17
在线时间
0 小时
发表于 2014-7-8 16:47:38 | 显示全部楼层
回复【3楼】zfavourite99:
---------------------------------
终于看懂,thnks..............
回复 支持 反对

使用道具 举报

17

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2014-4-12
在线时间
0 小时
发表于 2014-7-20 23:42:22 | 显示全部楼层
还是不大明白,看了N次
规格严格,功夫到家
回复 支持 反对

使用道具 举报

43

主题

278

帖子

1

精华

高级会员

Rank: 4

积分
621
金钱
621
注册时间
2013-12-27
在线时间
0 小时
发表于 2014-11-30 10:58:17 | 显示全部楼层
楼主分析的好清楚。谢谢分享。
水的比较多。
回复 支持 反对

使用道具 举报

17

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2013-9-4
在线时间
18 小时
发表于 2014-12-26 10:57:21 | 显示全部楼层
多谢多谢学习啦
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2015-1-24
在线时间
0 小时
发表于 2015-1-25 21:42:54 | 显示全部楼层
楼主讲的很到位,学习了,谢谢分享!
静水流深,物我两忘
回复 支持 反对

使用道具 举报

10

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2015-5-22
在线时间
0 小时
发表于 2015-5-22 20:50:12 | 显示全部楼层
简单单明了,另外哇想说 楼主的这句话:(addr&0xFFFFF)等效于(addr&0x000FFFFF),就是屏蔽掉高12位(个人认为屏蔽高12位和屏蔽高4位效果是一样的    
-----------------------------------------------------------------------------------------------------------------
由于SRAM或片上外设位带区只有1M,分别为
0x2000_0000-0x200F_FFFF(SRAM区中的最低1MB )  
0x4000_0000-0x400F_FFFF(片上外设区中的最低1MB )
故只需要将低20位保留,其他12位屏蔽就可求出偏移量。
我建了一个战舰stm32交流群:320350722 新手请教老手,老手大显身手! stm32交流群:320350722 stm32交流群:320350722
回复 支持 反对

使用道具 举报

小健 该用户已被删除
发表于 2015-7-12 16:40:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

9

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2015-8-18
在线时间
17 小时
发表于 2015-9-2 16:04:49 | 显示全部楼层
这宏公式写得太精练了,一时还不能完全理解过来,看了楼主这贴才算是完全明白了,感谢感谢.
回复 支持 反对

使用道具 举报

13

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
428
金钱
428
注册时间
2015-4-24
在线时间
72 小时
发表于 2016-4-6 12:03:14 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

15

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2015-3-12
在线时间
18 小时
发表于 2016-4-27 21:03:44 | 显示全部楼层
后面两行还没解释呢
#define    MEM_ADDR(addr)      *((volatile unsigned long  *)(addr))
#define    BIT_ADDR(addr, bitnum)        MEM_ADDR(BITBAND(addr, bitnum))
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-5-8
在线时间
2 小时
发表于 2016-6-7 17:06:12 | 显示全部楼层
+0x2000000是什么意思呢?大神
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 04:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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