你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 bit_band(位带)疑问

[复制链接]
deanquan 提问时间:2015-7-8 15:50 /
关于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


还请大侠帮忙分析下,谢谢!
收藏 评论7 发布时间:2015-7-8 15:50

举报

7个回答
伸手碰阳光 回答时间:2015-7-8 16:15:24
不太清楚
stary666 回答时间:2015-7-8 16:22:49
没研究过,,,,
creep 回答时间:2015-7-8 16:56:41
本帖最后由 creep 于 2015-7-8 16:57 编辑

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


比如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)

上面的地址只为说明使用,可能与实际的地址不符。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

netlhx 回答时间:2015-7-8 17:10:36
看情况吧,如果寄存器是32位的,应该是最大到31,如果是16位的话,应该是到15
mark0668 回答时间:2015-7-8 17:11:32
M3 里面说的清楚...
moyanming2013 回答时间:2015-7-8 22:04:16
学习了。。。
你好我好大家好! 回答时间:2015-7-9 09:39:46
4楼好给力      

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版