请问STM32 bit_band的bitnum取值范围为多少

2019-07-14 13:56发布

关于STM32 bit_band有一个疑问:
#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))


其中bitnum取值范围为多少。

在M3权威指南里面范围为0--7

每个IO口最多可以支持16个端口,我赋值为13的时候对应的IO口操作没有问题,说明这个值可以大于7


还请大侠帮忙分析下,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
nyvvhxcs
1楼-- · 2019-07-14 15:07
没研究过,,,,
亲爱的娜娜
2楼-- · 2019-07-14 18:29
本帖最后由 creep 于 2015-7-8 16:57 编辑

其实这只是计算的方式不同而已,结果是一样的。
进行bitband的时候是按字节进行划分的,所以bitnum的大小为0-7,但是IO的寄存器是32位的并且低16位都可以映射,此时我们使用了IO的最低的字节的地址进行计算,因为有个偏移地址,所以BIT8-15得到的结果也是对的。
使用下面的公式:


比如GPIOA的地址为0x40020014,计算GPIOA.8有2种方法;
1)bit_band_base = 0x40020014,byte_offset = 0,bit_number = 8;(从0x40020014开始第8个bit)
2)bit_band_base = 0x40020014,byte_offset = 1,bit_number = 0;(从0x40020015开始第0个bit)

上面的地址只为说明使用,可能与实际的地址不符。
wq644921241
3楼-- · 2019-07-14 23:15
看情况吧,如果寄存器是32位的,应该是最大到31,如果是16位的话,应该是到15
骑猪去天山
4楼-- · 2019-07-14 23:32
M3 里面说的清楚...
7762642422d
5楼-- · 2019-07-15 04:56
 精彩回答 2  元偷偷看……
zzw0719
6楼-- · 2019-07-15 06:24
4楼好给力      

一周热门 更多>