STM32之位绑定
有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之位绑定的更多相关文章
- 关于STM32位带操作随笔
以前在学习STM32时候关注过STM32的位带操作,那时候只是知道位带是啥,用来干嘛用,说句心里话,并没有深入去学习,知其然而不知其所以然.但一直在心中存在疑惑,故今日便仔细看了一下,写下心得供日后参 ...
- STM32位带操作
STM32的位带操作是基于cortex内核自带的,而不是st公司独创.基本的思路就是用一个32位的地址空间访问一个bit,因为stm32只支持32位数据的读取,不像51单片机一样,是可以单独对一位操作 ...
- stm32之GPIO
stm32有5组GPIO口,GPIOA GPIOB GPIOC GPIOD GPIOE 每个GPIO端口有: 2个配置寄存器GPIOx_CRL, GPIOx_CRH(32位): 2个数据寄存器GPIO ...
- STM32试题及答案
一.选择题 1.Cortex-M处理器采用的架构是( D ) (A)v4T (B)v5TE (C)v6 (D)v ...
- STM32库函数开发使用总结
一.外设常具备的几类寄存器 控制寄存器xxx_CR (Control/Configuration Register): 用来配置.控制响应外设的工作方式,如GPIOx_CRL.AFIO_EXTICR1 ...
- 关于STM32驱动DS1302实时时钟的一点思考
之前用51驱动过DS1302,没用多久就输出了正确的时间.当时以为这块芯片其实没啥,很简单.但是现在用STM32做项目,用到同样的芯片,以为这有何难,只要把那个程序拿过来复制黏贴改一下IO设置不就行了 ...
- 基于STM32的三轴数字罗盘HMC5883L模块的测试
最近买了个数字罗盘模块,调通后发现很不错,非常灵敏,测试的时候精度在1°以内.连续测量模式下,最快测量.输出速率可达75hz,模块每次测量完毕并将数据更新至寄存器后,其DRDY引脚便产生一个低电平脉冲 ...
- 数字麦克风PDM信号采集与STM32 I2S接口应用
数字麦克风采用MEMS技术,将声波信号转换为数字采样信号,由单芯片实现采样量化编码,一般而言数字麦克风的输出有PDM麦克风和PCM麦克风,由于PDM麦克风结构.工艺简单而大量应用,在使用中要注意这二者 ...
- 数字麦克风PDM信号采集与STM32 I2S接口应用(二)
在使用STM32的数字麦克风I2S接口时,计算采样率让人头疼,芯片手册上没有明确的说法,而手册上的计算方法经过测试确和实验不符.借助搜索引擎,大部分资料都是来自于开发板卖家或开发板论坛,主要是咪头采集 ...
随机推荐
- Backbone源码阅读手记
Backbone.js是前端的MVC框架,它通过提供模型Models.集合Collection.视图Veiew赋予了Web应用程序分层结构.从源码中可以知道,Backbone主要分了以下几个模块: ( ...
- synchronized在jvm底层是如何实现的
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronized与Loc ...
- H5案例分享:使用JS判断客户端、浏览器、操作系统类型
使用JS判断客户端.浏览器.操作系统类型 一.JS判断客户端类型 JS判断客户端是否是iOS或者Android手机移动端 通过判断浏览器的userAgent,用正则来判断手机是否是ios和Androi ...
- Windows环境配置HTTP服务(Windows + Apache + Mysql + PHP)
1.安装WampServer 2.管理HTTP服务 任务图标绿色为正常启动状态 注意事项:1.检查网络是不是通的 ping 对方IP2.检查防火墙是否开启,如果开启将不能正常被访问3.检查访问权限 A ...
- java基础 集合 ArrayList 增删改除
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...
- runtime的黑魔法
要说明runtime,首先要明白objc这门语言,是基于C的封装.真是因为runtime,objc才有了面对对象的特性. 也就说,所有objc的语言,在运行时都会转换成C. 也是基于这样的特性,run ...
- Python递归及斐波那契数列
递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可 ...
- [Android Pro] listView和GridView的item设置的高度和宽度不起作用
referece to : http://blog.csdn.net/beibeixiao/article/details/9032569 1. 在Android开发中会发现,有时listVi ...
- iOS之ToolBar定制
ToorBar的定制 在诸如社区类的app里面,很多都涉及到用户发布消息,如现今最流行的新浪微博,每条信息底部都会有个工具条,正如下图所示,有转发.评论和点赞三个按钮的工具条. 结构 1.作为一个独立 ...
- mybatis 书写
查询语句是使用 MyBatis 时最常用的元素之一 select元素配置细节如下 属性 描述 取值 默认 id 在这个模式下唯一的标识符,可被其它语句引用 parameterType 传给此语 ...