stm32中位带操作转化为指针不理解请坛友帮我解释一下谢谢

2020-01-04 18:47发布

1.把“位带地址+位序号”转换别名地址宏:
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
把该地址转换成一个指针:
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
不清楚为什么这么转换????
2.位带操作并不只限于以字为单位的传送。亦可以按半字和字节为单位传送。例如,可以使用
LDRB/STRB 来以字节为长度单位去访问位带别名区,同理可用于 LDRH/STRH。但是不管用哪一个对
子,都必须保证目标地址对齐到字的边界上。
为什么都必须保证目标地址对齐到字的边界上????
谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
barryxiao
1楼-- · 2020-01-04 19:54
你可以这样理解:因为位带操作在0x*******00的地址上写的第0位才有效,从1~31位的位写入是无效的,所以1个word里不对齐的3个地址是无效的
styleno1
2楼-- · 2020-01-04 21:07
1. 用宏的是为了方便使用,另外通过预处理,避免运行时计算
2. 16bits或8bits的对位段区的读写我没在文档看到过,你可指出哪个文档,逻辑上也没有什么用。另,M3的TRM提到非对齐会拆分成多个字节操作,没有提到对位段的影响,建议你实测。
bedlamitemcu
3楼-- · 2020-01-04 23:48
barryxiao 发表于 2019-8-17 19:13
你可以这样理解:因为位带操作在0x*******00的地址上写的第0位才有效,从1~31位的位写入是无效的,所以1个w ...

谢谢   已经搞清楚了    回头我仔细表述一下
bedlamitemcu
4楼-- · 2020-01-05 04:05
styleno1 发表于 2019-8-17 23:55
1. 用宏的是为了方便使用,另外通过预处理,避免运行时计算
2. 16bits或8bits的对位段区的读写我没在文档看 ...

谢谢  位带操作已经搞清楚了  
uindex
5楼-- · 2020-01-05 09:38
 精彩回答 2  元偷偷看……
styleno1
6楼-- · 2020-01-05 10:38
uindex 发表于 2019-8-18 15:43
ST还是有创新的,这样的玩法可以避免IO读写锁,有C语言基础,一张图应该能看明白位带操作是啥。有人叫它比 ...

恕我耿直,这是M3内核的可选特性

一周热门 更多>