您的位置 首页 资料

STM32之位绑定

位绑定的概念:对于51单片机只有8位,对于M3来说,有32位,也就是说把32位中的某一位通过一个简单的地址的变换的算法来实现对该位的操作,

位绑定的概念:关于51单片机只要8位,关于M3来说,有32位,也便是说把32位中的某一位经过一个简略的地址的改换的算法来完成对该位的操作,它能够映射到一个地址的空间,也便是说一个位它占一个地址,就好比方把惠州放在广东省的某一个地址,叫做惠州市,经过搭去惠州的车票就能够来到惠州市这个地址,别去东莞哈、可是这个位只要在地址的最低位有用,由于地址可能是指向一个32位的内存单元、、由于是LSB有用、、所以对其操作的时分就大可不必经过屏蔽其他位来对绑定的位进行操作、也正是最低位有用,所以只要看最低位即可、由于你买的是惠州的车票,所以就不必屏蔽东莞了,由于车不会去东莞、请看“美人”相片:

从图片中咱们能够看出,一个位就绑定了一个地址,看到这,你会觉得古怪?为什么位带区地址是从0x2000 00000开端,而绑定的地址是从0x2200 0000开端的呢?啊哈、、别急哈、、正所谓心急吃不了热豆腐、、

由于M3核处理都是按32位全体处理的,并没有独自对一个位进行操作,所以位绑定就能够完成CPU对独自一个位进行操作,只需要一个指令周期、其速度可显而知、、可是整个M3内核并没有悉数答应位绑定,只要两个区有,别离为:

SARM区:0x2000_0000‐0x200F_FFFF 这个SRAM绑定的地址便是从0x2200 0000开端的

片上外设区:0x4000_0000‐0x400F_FFFF 这个区绑定的地址便是从0x4200 0000开端的、、

其映射表别离如下:

能够看到GO TO Definition,点击它,就能够找到GPIOA~E的地址,以此类推,咱们就能够找出背面的“大哥大”了、、如图:

好了、、有了地址、可是咱们还需要每个IO口的输出输入寄存器的偏移地址:

没错了、咱们以0x08 0x0c为例

1 #define GPIOA_ODR_A (GPIOA_BASE + 0X0C)
2 #define GPIOA_IDR_A (GPIOA_BASE + 0X08)3 ...4 #define GPIOA_ODR_E (GPIOE_BASE + 0X0C)5 #define GPIOA_IDR_E (GPIOE_BASE + 0X08)6 7 #define BitBand(Addr,BitNum)  *((volatile unsiged long *)(Addr&0xf0000000)+0x2000000+((Addr&0xfffff)<<5)+(BitNum<<2))8 9 #define PAout(n)  BitBand(GPIOA_ODR_A,n)10 #define PAin(n)   BitBand(GPIOA_IDR_A,n)11 ...12 #define PEout(n)  BitBand(GPIOE_ODR_A,n)13 #define PEin(n)   BitBand(GPIOE_IDR_A,n)

我来解说下:

Addr&0xf0000000   由于咱们不知道到底是SRAM仍是片上外设区,所以咱们这儿取其最高位  由于最高位有可能为4 也有可能为2

Addr&0xfffff能够看到位绑定的规模0x2000_0000‐0x200F_FFFF0x4000_0000‐0x400F_FFFF所以咱们这儿把高三位屏蔽掉,就相当于 A - 0x20000000的作用了、、为什么我这儿要用《5 和《2 呢?比照一下、、咱们能够知道《5相当于*32《2相当于*4那咱们为什么要用左移符号呢??原因在这:由于左移的处理速度要比乘的快许多、、咱们尽量把乘除转化为加减和左右移写到这儿、、没错了、、这下子咱们就能够像操作51那样便利操作32位的芯片了、、、

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/256418.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部