打印

GD32学习笔记-2 一位绑定

[复制链接]
1358|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sunmeat|  楼主 | 2014-7-29 09:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sunmeat 于 2014-7-29 09:19 编辑

为减少“读-修改-写”操作所消耗的时间, Cortex™-M3 处理器提供了位绑定功能(bit-banding) ,可按位为单位进行原子级的访问。存储器映射表中包含了两个位绑定段,分别位于 SRAM 和外设中。在位绑定段中,位别名区的某个字会映射到位绑定区的某个位上。
来自于手册Page18


沙发
sunmeat|  楼主 | 2014-7-29 09:18 | 只看该作者
M3中SRAM和外设的地址为:
SARM区:0x2000_0000‐0x200F_FFFF  这个SRAM绑定的地址就是从0x2200 0000开始的   
片上外设区:0x4000_0000‐0x400F_FFFF  这个区绑定的地址就是从0x4200 0000开始的

使用特权

评论回复
板凳
sunmeat|  楼主 | 2014-7-29 09:21 | 只看该作者
接上面的,为什么带区地址是从0x2000 00000开始,而绑定的地址是从0x2200 0000开始的呢?
这里有个计算公式【来自于手册中】
位别名地址  =  位绑定基地址  + (字节偏移×32) + (位偏移×4)
其中:
位别名地址:位别名区中,对应于指定位的单个字的映射地址
位绑定基地址:位别名区的起始地址
字节偏移:包含目标位的字节在位绑定区中的字节偏移
位偏移:目标位在该字节中的偏移

使用特权

评论回复
地板
sunmeat|  楼主 | 2014-7-29 09:47 | 只看该作者
本帖最后由 sunmeat 于 2014-7-29 09:52 编辑

假设我要操作SRAM区中地址为0x2000 0000上的第0位,那么
位别名地址 = 0x2200 0000 + 0000*32 + 0*4 = 0x2200 0000;

使用特权

评论回复
5
sunmeat|  楼主 | 2014-7-29 09:54 | 只看该作者
假如我要操作GPIOA的第0位,那么,端口输出数据寄存器(GPIOx_ODR)  的偏移地址是 0x0c,得到PA.0的别名地址为
PA.0 = 0x4200 0000 + 0x0001 080c*32 + 0*4 = 0x4221 0180;
注意:如果是在计算器下使用16进制乘法,需要把32和4都换算为16进制
得到PA.0的别名地址后,然后用define宏定义
#define PA_Bit0 ((volatile unsigned long *) (0x42210180))
然后直接操作*PA_Bit0为0,为1即可

使用特权

评论回复
6
sunmeat|  楼主 | 2014-7-29 10:00 | 只看该作者
由于每个地址都这么算太复杂,在网上找了个算法如下
#define BitBand(Addr,BitNum)  *((volatile unsiged long *)(Addr&0xf0000000)+0x2000000+((Addr&0xfffff)<<5)+(BitNum<<2))

使用特权

评论回复
7
sunmeat|  楼主 | 2014-7-29 10:00 | 只看该作者
关于算法的解释如下
Addr&0xf0000000   因为我们不知道到底是SRAM还是片上外设区,所以我们这里取其最高位  因为最高位有可能为4 也有可能为2

Addr&0xfffff   可以看到位绑定的范围0x2000_0000‐0x200F_FFFF  0x4000_0000‐0x400F_FFFF  所以我们这里把高三位屏蔽掉,就相当于 A - 0x20000000的效果了、、

为什么我这里要用《5 和《2 呢?对比一下、、我们可以知道《5相当于*32  《2相当于*4    那我们为什么要用左移符号呢??原因在这:因为左移的处理速度要比乘的快很多、、我们尽量把乘除转化为加减和左右移

使用特权

评论回复
8
kfliuyan| | 2014-7-29 11:24 | 只看该作者
位绑定,终于学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

208

主题

2132

帖子

13

粉丝