关于位带操作的疑问

2019-07-21 08:07发布

本帖最后由 warship 于 2018-7-2 23:14 编辑

位带功能将外设的各个寄存器的每1bit映射到别名存储区扩充到了1个字(32位),比如GPIO B的IDR8(控制PB8)的BIT位,别名存储地址为0x4221 81A0,当我想置位PB8的时候,直接访问别名存储地址就可以了,即:     *(0x422181A0)=0x01;
那么问题来了:  这个地址是专用的吗,不能被其它实际的物理存储器占用吗?
假如可以有其它实际的物理存储器占用该地址,
我用上述指令访问的时候,程序怎么知道我是正常访问这个存储器,还是只利用它来给PB8置位呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
正点原子
1楼-- · 2019-07-22 02:46
warship 发表于 2018-7-3 18:35
谢谢原子亲自过来夸奖,难道我理解正确无误了吗?

我是直接用的,没深究。你可以看CM3权威指南,中文版那个,有详细说明的
xiatianyun
2楼-- · 2019-07-22 04:12
我昨晚刚看位带知识,我的理解和楼主大体一样。
大容量的F103ZET的SRAM只有64kB,而block2用作外设总线地址,这些我们只能使用。
SRAM低1MB可以映射到0x2200,0000开始的地址作为位带区操作,这个地址是保留地址,外扩存储器应该需要避开这片空间。
至于操作位带区是不是keil自动转为操作映射的bit这个我认为是STM32内部本身支持的,如果没有内核支持就存在转换过程,也就省不了操作周期了。如果不是这样,那么手册上关于用位带操作可以避免多任务系统中共享资源出现紊乱危机就无从谈起了。
具体看CM3权威指南,P.88-P.90
warship
3楼-- · 2019-07-22 08:11
 精彩回答 2  元偷偷看……
好风
4楼-- · 2019-07-22 08:52
不是很明白为什么要用别名区操作,如果我直接知道要操作的地址1(BRR),为什么还要用地址2 (LED)去指向地址1 然后去操作呢?是为了取个更直观的名字么(GPIOB->BRR 叫做LED)?
warship
5楼-- · 2019-07-22 09:00
好风 发表于 2018-11-9 10:38
不是很明白为什么要用别名区操作,如果我直接知道要操作的地址1(BRR),为什么还要用地址2 (LED)去指向地址 ...

http://www.openedv.com/forum.php?mod=viewthread&tid=274196
warship
6楼-- · 2019-07-22 10:15
好风 发表于 2018-11-9 10:38
不是很明白为什么要用别名区操作,如果我直接知道要操作的地址1(BRR),为什么还要用地址2 (LED)去指向地址 ...

你这样发问,是因为你根本没有搞清位操作的基本状况。
你问的这种属于宏定义,与位操作没有任何关系的。

一周热门 更多>