有32个美女给你,你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开始的、、

其映射表分别如下:

现在知道为啥了吧、、还不知道的、、来人、、拉出去调戏10分钟、、

知道的、、来人、、再赏美女十个、、

那怎么绑定呢??开头提到的算法又是什么呢??其实说是算法有点吓人、、因为在别人听来总是感觉算法很难、其实也就是两条公式(一条为SRAM,一条为片上外设)如下:其中A为字节所在的地址,n为位序列号

SRAM区映射的地址          AliasADDr = 0x22000000 + ((A - 0x20000000) * 8 + n) * 4 = 0x22000000 + ((A - 0x20000000) * 32 + n * 4

片上外设区映射的地址      AliasADDr = 0x42000000 + ((A - 0x20000000) * 8 + n) * 4= 0x42000000 + ((A - 0x20000000) * 32 + n * 4

OK,有了这个算法,我们可以来进行C编程了、、

首先我们来找找GPIOA~E的地址;鼠标的光标放在GPIOA~E处,右击,

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

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

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

 #define GPIOA_ODR_A (GPIOA_BASE + 0X0C)
#define GPIOA_IDR_A (GPIOA_BASE + 0X08)
...
#define GPIOA_ODR_E (GPIOE_BASE + 0X0C)
#define GPIOA_IDR_E (GPIOE_BASE + 0X08) #define BitBand(Addr,BitNum) *((volatile unsiged long *)(Addr&0xf0000000)+0x2000000+((Addr&0xfffff)<<5)+(BitNum<<2)) #define PAout(n) BitBand(GPIOA_ODR_A,n)
#define PAin(n) BitBand(GPIOA_IDR_A,n)
...
#define PEout(n) BitBand(GPIOE_ODR_A,n)
#define PEin(n) BitBand(GPIOE_IDR_A,n)

我来解释下:

Addr&0xf0000000   因为我们不知道到底是SRAM还是片上外设区,所以我们这里取其最高位  因为最高位有可能为4 也有可能为2
Addr&0xfffff   可以看到位绑定的范围0x2000_0000‐0x200F_FFFF  0x4000_0000‐0x400F_FFFF  所以我们这里把高三位屏蔽掉,就相当于 A - 0x20000000的效果了、、

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

写到这里、、没错了、、这下子我们就可以像操作51那样方便操作32位的芯片了、、、

这下子应该明白为什么32个美女一起处理的话会慢很多而且很麻烦了吧、、、哈、、

小弟不才、、若有说错之处请像抓腐败那样毫不客气的提出来、、一切向您虚心请教、、希望您能看懂、、

STM32之位绑定的更多相关文章

  1. 关于STM32位带操作随笔

    以前在学习STM32时候关注过STM32的位带操作,那时候只是知道位带是啥,用来干嘛用,说句心里话,并没有深入去学习,知其然而不知其所以然.但一直在心中存在疑惑,故今日便仔细看了一下,写下心得供日后参 ...

  2. STM32位带操作

    STM32的位带操作是基于cortex内核自带的,而不是st公司独创.基本的思路就是用一个32位的地址空间访问一个bit,因为stm32只支持32位数据的读取,不像51单片机一样,是可以单独对一位操作 ...

  3. stm32之GPIO

    stm32有5组GPIO口,GPIOA GPIOB GPIOC GPIOD GPIOE 每个GPIO端口有: 2个配置寄存器GPIOx_CRL, GPIOx_CRH(32位): 2个数据寄存器GPIO ...

  4. STM32试题及答案

    一.选择题 1.Cortex-M处理器采用的架构是(  D  ) (A)v4T               (B)v5TE              (C)v6                (D)v ...

  5. STM32库函数开发使用总结

    一.外设常具备的几类寄存器 控制寄存器xxx_CR (Control/Configuration Register): 用来配置.控制响应外设的工作方式,如GPIOx_CRL.AFIO_EXTICR1 ...

  6. 关于STM32驱动DS1302实时时钟的一点思考

    之前用51驱动过DS1302,没用多久就输出了正确的时间.当时以为这块芯片其实没啥,很简单.但是现在用STM32做项目,用到同样的芯片,以为这有何难,只要把那个程序拿过来复制黏贴改一下IO设置不就行了 ...

  7. 基于STM32的三轴数字罗盘HMC5883L模块的测试

    最近买了个数字罗盘模块,调通后发现很不错,非常灵敏,测试的时候精度在1°以内.连续测量模式下,最快测量.输出速率可达75hz,模块每次测量完毕并将数据更新至寄存器后,其DRDY引脚便产生一个低电平脉冲 ...

  8. 数字麦克风PDM信号采集与STM32 I2S接口应用

    数字麦克风采用MEMS技术,将声波信号转换为数字采样信号,由单芯片实现采样量化编码,一般而言数字麦克风的输出有PDM麦克风和PCM麦克风,由于PDM麦克风结构.工艺简单而大量应用,在使用中要注意这二者 ...

  9. 数字麦克风PDM信号采集与STM32 I2S接口应用(二)

    在使用STM32的数字麦克风I2S接口时,计算采样率让人头疼,芯片手册上没有明确的说法,而手册上的计算方法经过测试确和实验不符.借助搜索引擎,大部分资料都是来自于开发板卖家或开发板论坛,主要是咪头采集 ...

随机推荐

  1. jQuery1.11源码分析(1)-----Sizzle源码概览[原创]

    最近在啃jQuery1.11源码,上来就遇到Sizzle这个jQuery的大核心,虽然已经清楚了Sizzle的用途,先绕过去也没事,但明知山有虎偏向虎山行才是我们要做的. 本文面向的阅读对象:正在学习 ...

  2. PHP判断变量是否存在及函数isset() 、empty()与is_null的区别

    一.举例说明 A.如何判断一个变量是否定义? <?php // 假设不存在$test 变量 if (isset($test)) { echo '$test 已经set', '<br/> ...

  3. ahjesus Axure RP 7.0注册码

    ahjesus Axure RP 7.0注册码 用户名:axureuser 序列号:8wFfIX7a8hHq6yAy6T8zCz5R0NBKeVxo9IKu+kgKh79FL6IyPD6lK7G6+t ...

  4. 7.2WebApi2中的全局异常处理

    现在在WebApi中还没有一种简单的方式去记录或者处理全局的异常.一些未处理的异常可以处理通过异常过滤器,但有大量的异常是异常过滤器不能处理的.例如: 从控制器的构造函数引发的异常. 从消息处理程序引 ...

  5. javascript数据结构-栈

    github博客地址 栈(stack)又名堆栈,它是一种运算受限的线性表.遵循后进先出原则,像垃圾桶似的.功能实现依然按照增删改查来进行,内部数据存储可以借用语言原生支持的数组. 栈类 functio ...

  6. Java 内部类

    1.成员内部类 成员内部类,就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的.同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取. 2.局部内部类 ...

  7. URL类型入参串调用接口

    最近通过调用另一个合作公司提供的接口实现方法,借鉴同事之前编写的方法 Models.JSON.Patient类中有各种属性,也可增加属性来满足新需求 public string TakeAppoint ...

  8. iOS之initialize与load

    initialize和load 这两个方法都是是什么时候调用的呢?都有着什么样的作用,下面看看吧! initialize +(void)initialize{ } 什么时候调用:当第一次使用这个类的时 ...

  9. C#中对string与string[]的初步操作

    开篇之作,简单的对string与string[]进行初步操作,入门篇也,不多说,直接上代码. using System; using System.Collections.Generic; using ...

  10. resultMap 映射

    1. sql的重用:定义一个sql片段,可在任何SQL语句中重用该片段. <sql id="personColumns"> name, sex, updateTime& ...