STM32开发中的位带操作机制

为了像51单片机一样能够对某个管脚单独操作,引入了位带操作这样的操作机制。
如下图,位带(bit band)区就是就是你想单独操作的io的区域,比如pa1、pa2。而位带别名区就是你给每一位重新起了个名字的那一片地址区域。可以看下表,m3内核存储器映射表,你能看到1m内存的bitband区,还有与之对应的32m内存的bitband别名区,因为你将每一位膨胀成为了一个32位的地址,所以相应的别名区的内存也会是位带区的32倍。
想进行位带操作,应该先去找该位对应的别名区的地址,找到了这个地址,对这个地址进行操作,那么实际上也就是对该位进行操作了。
官方给出了如下相应的计算公式:
aliasaddr=0x42000000+((a‐0x40000000)*8+n)*4=0x42000000+ (a‐0x40000000)*32 + n*4
其中,aliasaddr是别名区的地址,a是gpioa-》odr的地址,n是该端口的上的某一位。
0x42000000是位带别名区域的起始地址,a是输出数据寄存器gpioa-》odr的地址,a的地址先减去位带区基地址,得到的是相对于位带区基地址的偏移地址,那么膨胀之后还是一个偏移地址,是相对于位带别名区基地址的偏移量,加上位带别名区域基地址,就得到了其对应的别名区地址。
多数情况下,大家见到的代码,应该是以下这个样子,一共分为三步:
#define bitband(addr, bitnum) ((addr & 0xf0000000)+0x2000000+((addr &0xfffff)《《5)+(bitnum《《2))#define mem_addr(addr) *((volatile unsigned long *)(addr)) #define bit_addr(addr, bitnum) mem_addr(bitband(addr, bitnum))
第一步,就是我们上面分析的,得到位带别名区域的32位地址。
第二步,就是将第一步得到的32位地址,给转换成一个指针变量,并且操作这个地址里的值,唯一的区别,就是由于安全的考虑,多加了一个volatile 这样的关键字。
举个例子
如下,想直接访问0x00000001这个地址,并且给这个地址写1,该怎么做呢?
# define addr 0x00000001*(int *)addr = 1;
第三步,就是将前两部,结合在一起,根据传入的addr和bit计算得到32位的地址,然后强制类型转换,使得我们可以去操作这个地址里的值。
提示:bitnum《《2相当于bitnum2乘以4,实际上在计算机底层乘法也是基于位运算实现的。
原文标题:stm32开发中的位运算以及位带操作
文章出处:【微信公众号:stm32嵌入式开发】欢迎添加关注!文章转载请注明出处。


普诺飞思推出基于事件视觉的开源软件库OpenEB,提供全新开发工具
SSD控制器哪家强?英特尔、三星、美光……
三星960 Evo硬盘来袭,拥有全新架构和高端性能
关于细节优化决定光伏项目投资收益的分析和应用
奥迪携手爱立信合作,推动5G技术在汽车生产领域的应用
STM32开发中的位带操作机制
4G之后 中国移动PK电信联通联军 新增装宽占比71%
空调制热多少度合适_空调制热没反应不出风
智能变电站的特征及系统架构
AMD正在开发两款ARM芯片
如何使用3DIC Compiler实现芯片堆叠设计
Maxim全新高度集成的数字脉冲发生器
什么是接地电阻?如何测量防雷接地电阻?
Linux的5种IO模型
换芯片怎么选型,怎么选择合适的替换型号方案及选型参考
iPhone12mini即将来袭,你准备好了吗
如何用最少的设备达到最佳的无线覆盖效果?
基于ADI技术的哮喘管理设备
高密度互连PCB的优点
华为手机怎么换鸿蒙系统 华为手机如何升级鸿蒙系统