打印

STM32位带操作疑惑

[复制链接]
3361|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
各位大侠,
     见附件,STM32中的位带操作很是头疼,图片中最下面一句:“*4表示一个字为4个字节,*8表示一个字节中又8个位”,而在文中貌似*4是乘4.十分感谢!
    附件为宋岩翻译的《ARM-COREM3权威指南》。

   

111.jpg (969.05 KB )

111.jpg

相关帖子

沙发
magic_yuan|  楼主 | 2012-12-29 19:11 | 只看该作者
#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))
归根到底也是以上代码无法理解。。。。

使用特权

评论回复
板凳
uet_cache| | 2012-12-29 20:58 | 只看该作者
这代码不难理解啊,就是一些运算而已。。

使用特权

评论回复
地板
xuyaqi| | 2012-12-29 22:03 | 只看该作者
和51可直接位寻址的16个单元原理类似,每个可位寻址的位有单独的地址,要找到这个位的值既可以用“与或”的办法得到,也可以直接读该位地址的值。

使用特权

评论回复
5
magic_yuan|  楼主 | 2012-12-29 22:46 | 只看该作者
xuyaqi 发表于 2012-12-29 22:03
和51可直接位寻址的16个单元原理类似,每个可位寻址的位有单独的地址,要找到这个位的值既可以用“与或”的 ...

多谢大侠!
   可否帮我分析下第一帖内容,谢谢啊。实在是有点搞不明白。

使用特权

评论回复
6
NE5532| | 2012-12-30 10:00 | 只看该作者
位带里面每一个32bit存储单元,对应被映射区的一个bit,顺序排列,组成位带,32bit单元内,只有最低1bit有意义,其他的全部浪费。

使用特权

评论回复
7
magic_yuan|  楼主 | 2012-12-30 11:53 | 只看该作者
NE5532 发表于 2012-12-30 10:00
位带里面每一个32bit存储单元,对应被映射区的一个bit,顺序排列,组成位带,32bit单元内,只有最低1bit有 ...

多谢大侠,  
  这个意思我大致明白。
  归根结底为以下三条指令难以理解:
#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))

使用特权

评论回复
8
magic_yuan|  楼主 | 2012-12-30 12:00 | 只看该作者
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
  这个不大明白,为什么要两次指针,个人觉得好像直接访问地址即可?多谢!

使用特权

评论回复
9
小马/| | 2012-12-30 12:09 | 只看该作者
新手路过

使用特权

评论回复
10
明月小厨| | 2012-12-30 17:50 | 只看该作者
magic_yuan 发表于 2012-12-30 12:00
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
  这个不大明白,为什么要两次指针,个人 ...

让A=B;不就是一次,二个角色;

使用特权

评论回复
11
明月小厨| | 2012-12-30 17:53 | 只看该作者
ARM里的位概念比较特别,就是某一地址,其实只是一个位;映射的结果;这样系统和用户都方便;
ARM操作32位数据很容易,但处理8位,16位数据时效率都大打折扣的;

使用特权

评论回复
12
dxshappy| | 2012-12-30 19:00 | 只看该作者
新手路过,学习一下

使用特权

评论回复
13
magic_yuan|  楼主 | 2012-12-30 20:21 | 只看该作者
明月小厨 发表于 2012-12-30 17:50
让A=B;不就是一次,二个角色;

多谢大侠,
   还是不明白,能否详细点,呵呵

使用特权

评论回复
14
明月小厨| | 2012-12-30 21:38 | 只看该作者
本帖最后由 明月小厨 于 2012-12-30 21:40 编辑

#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
这句的意思是有这么一个用户定义的数据类型;名子是MEM_ADDR;
后面一部分是解释MEM_ADDR是什么呢?
是*((volatile unsigned long  *)(addr));这是一个32位的址址指针; 址址是addr;

这样定义后,你后面使用的时候就方便很多了;

我只知大概;我是厨师,不是大虾,大虾是菜;

使用特权

评论回复
15
weixiao1991| | 2013-6-3 01:18 | 只看该作者
((volatile unsigned long  *)(addr)是把addr转换为地址,*((volatile unsigned long  *)(addr))最前面的*是引用该地址的内容

使用特权

评论回复
16
ayb_ice| | 2013-6-3 09:33 | 只看该作者
看内存映象就知道了

使用特权

评论回复
17
楚天| | 2013-12-24 08:20 | 只看该作者
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
(volatile unsigned long  *)这个是显示的类型转换。针对的是后面紧跟的(addr)。表明addr是一个指向unsignedlong的指针。而且是volatile属性的。就是可变的,编译器需要在每次用到这个数据的时候要重新读取,而不是利用拷贝值。前面的那个*是指针的读取操作。

使用特权

评论回复
18
3htech| | 2013-12-24 11:45 | 只看该作者
1、实际中可以 用 &= 清零,用|= 置一。
2、只是个名字,固定格式而已,如果手头上有开发板,可以试试,按照这个格式,设置个GPIO。看看操作能否成功。

使用特权

评论回复
19
diweo| | 2013-12-24 16:03 | 只看该作者
本帖最后由 diweo 于 2013-12-24 16:08 编辑

字节地址先别管了,反正按着顺序来,
0x22000000->bit0
0x22000004->bit1
0x22000008->bit2
0x2200000C->bit3
0x22000010->bit4
0x22000014->bit5
....
所以,直接#define BITBAND_BIT(num)                (0x22000000+num*4)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:发到3000帖时,生活大概完成了一种转折。

359

主题

2770

帖子

7

粉丝