关于
STM32 bit_band有一个疑问:
#define BITBAND(addr, bitnum) ((addr & 0xF0000000) + 0x2000000 + ((addr & 0xFFFFF) << 5) + (bitnum << 2))
#define MEM_ADDR(addr) *((vola
tile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
其中bitnum取值范围为多少。
在M3权威指南里面范围为0--7
每个IO口最多可以支持16个端口,我赋值为13的时候对应的IO口操作没有问题,说明这个值可以大于7
还请大侠帮忙分析下,谢谢!
其实这只是计算的方式不同而已,结果是一样的。
进行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)
上面的地址只为说明使用,可能与实际的地址不符。
一周热门 更多>