历史上的今天
今天是:2025年02月18日(星期二)
2019年02月18日 | STM32 的位带操作
2019-02-18 来源:eefocus
位操作就是可以单独的对一个比特位进行读和写,这个在51单片机中非常常见。51单片机中通过关键字sbit来实现位定义,STM32中则是通过访问位带别名区的地址来实现对某一位的操作。
例如51单片机中可以实现以下操作
#define LED_ON 0
sbit LED = P2^0;
LED = LED_ON;
而现在STM32的位段、位带别名区就为了实现这样的功能。STM32针对SRM和外设区开辟了两个内存空间(位带区),分别是SRAM和外社区的最低1MB的空间。这两个1MB的内存空间除了可以像正常的 RAM 一样操作外,他们还有自己的位带别名区,位带别名区就是把1MB位带区的每一个位膨胀成一个32位的字,当通过访问位带别名区的这些字时,就可以达到访问位带区某个比特位的目的。位带区的一个比特位经过膨胀之后,虽然变大到 4个字节,但是还是 LSB才有效。

由上图可以看出STM32 支持位带操作的两个内存区的范围是:
0x2000_0000‐0x200F_FFFF(SRAM 区中的最低1MB)
0x4000_0000‐0x400F_FFFF(片上外设区中的最低1MB)
我们可以通过指针的形式访问位带别名区地址从而达到操作位带区比特位的效果。
位带别名区地址公式为
AliaAddr(addr,bitnum) = (addr&0xF0000000) + 0x2000000 + (addr&0xFFFFF)<<5 + bitnum<<2
ADDR为该比特位所在字节的地址,Bitnum为位序号
这里我以操作一个ODR寄存器(对于GPIO基地址的偏移为20)为例
例如
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x02000000+((addr & 0x000FFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) // 把一个地址转换成一个指针
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)) // 把位带别名区地址转换成指针
#define GPIOH_ODR_Addr (GPIOH_BASE+20) //寄存器地址映射
#define PHout(n) BIT_ADDR(GPIOH_ODR_Addr,n) //输出
/*主函数
* @beief 电亮LED灯
* @param 无
* @revel 无
*/
int main
{
LED_Config(); //LED灯GPIO配置
PHout(10) = 0; //点亮LED灯
}
关于主函数的点亮LED的操作,请参照stm32f4固件库函数点亮LED灯
关于为什么不直接对STM32的位带区进行位操作原因是STM32对内存的控制读写数据是按字节来算的,不能对一位进行直接操作。
位操作有如下优点
位带操作可以把代码缩小, 速度更快,效率更高,更安全。
一般操作要6条指令,而使用 位带别名区只要4条指令。
一般操作是 读-改-写 的方式, 而位带别名区是 写 操作。防止中断对读-改-写 的方式的影响。
上一篇:STM32系统时钟配置及时钟树
史海拾趣
|
转自:千家论坛:http://www.1000bbs.com/dispbbs.asp?boardid=51&Id=375655&page=2 在一些安防杂志上,看见了一篇文章,内容大致是写关于我们现在安防行业里的供电系统传输方式.除了描写在供电系统中,怎么节约线材,节省投资等,也提出一种在行业内让 ...… 查看全部问答> |
|
因为是初学者,对evc不是很熟,所以提个比较笨的问题 在对话框编程模式下 每次在通过扫描枪扫条码到文本框里的时候,程序就会自动退出,请问哪位高手大哥能帮我解决一下。 小妹感激不尽。 还有一个问题就是我有一个现成的程序。第一次都能运 ...… 查看全部问答> |
|
小弟最近刚学cc2430点对点通讯,遇到一个问题,就是点对点一开始设置定时器1中断,然后运行定时器1,主函数一直循环在接受状态里面,当定时器溢出中断时,调用adc转换函数,转换指定端口的电压值,后利用点对点通讯将数据发送出去。程序流程就是这 ...… 查看全部问答> |
|
最近在解剖市场上面的LED 3W电源 是的是BP3102方案 可是跟经典设计阻值老是对不上 。求大神指导。。最好给小弟一份详细参数。好叫小弟做个出来给大家看看!谢了!… 查看全部问答> |
|
今天刚收到Chronos Watch,半天开不了机,竟然是电池没电 今天刚收到Chronos Watch,关天开不了机,竟然是电池没电,换了电池就好了,你们收到如果开不了机注意下电池是否有电! 还有就是背光灯那个按钮,不是很好用! -------------------------------------------------- PS:上图: 另,娱乐 ...… 查看全部问答> |
|
https://download.eeworld.com.cn/detail/%E5%B9%B8%E7%A6%8F%E7%9A%84%E5%A8%83/26661 内容简介 书中系统地论述了开关电源最常用拓扑的基本原理、磁性元件的设计原则及闭环反馈稳定性和驱动保护等。《开关电源设计(第3版)》在讲述的过程中 ...… 查看全部问答> |




