
位带操作也叫原子操作,也称别名。起作用直接进行位带操作,即直接读取寄存器的X位,或直接写寄存器的X位。 STM32的寄存器为32位的,在写入寄存器的x位中,通常操作为;排除寄存器除x外的其它位,在进行赋值。而位带操作可直接写寄存器的x位,使位操作更为便捷。 1. 实验内容及步骤: 实验内容: 通过位带操作实现LED灯的翻转,和按键的读取。 按键按下时,LED亮,松开按键时,LED灭; 步骤: 根据原寄存器地址定位位带地址; 2. 硬件说明 ![]() ![]() 按键与PE4相连接,按下时低电平(所以GPIOE4应该配置为上拉输入,按下:低电平;松开:高电平) LED与PB5相连,另一端接VCC,(所以GPIOB5应该配置为推挽输出,亮:低电平;灭:高电平) 3. 位带操作原理 STM32F1内部是有两个位带区的,如下图所示。 ![]() 位带操作分别有片上外设和片上SRAM。我们用的比较多的通常是片上外设的位带操作,一般用来控制GPIO的反转和读取。 其膨胀对应关系图如下图所示,以SRAM位带操作位例,0x2000 0000地址的第一位,映射到0x2200 0000地址。其用法如下所示: 当0x2200 0000的内容=1时 => 0x2000 0000的内容=0x01 当0x2200 0000的内容=0时 => 0x2000 0000的内容=0x00 …………… 当0x2200 0018的内容=1时 => 0x2000 0000的内容=0x40=(二进制)0100 0000 当0x2200 0018的内容=0时 => 0x2000 0000的内容=0x00 ![]() 4. 寄存器说明 位带映射地址如下图所示。(中文STM32参考手册P29) ![]() 位带操作的例子如下图所示(CM3权威指南CnR2) ![]() 根据例子可写成通用的式子。 bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ (IN_ADDR_BASR&0x000FFFFF)*32+Bit*4 => bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ ((IN_ADDR_BASR&0x000FFFFF)<<5)+(Bit<<2) 如要控制LED灯(PB5) IN_ADDR_BASR = GPIOB的输出寄存器 = 0X4001 0C00 + 0x0C; Bit = 5 5. 程序设计 代码班的通用位带操作地址转换宏定义如下:
GPIO的输出位带宏定义如下定义
在本实验中要操作LED(PB5),因此BIT=5; GPIO的输入位带宏定义如下定义 #define BPE_IN(BIT) BIT_WORD_ADDR((GPIOE_BASE+0x08),BIT) BIT为要操作的位。 在本实验中要读取按键(PE4)的值,因此BIT=4; 位带操作源码: 源码筛选了关键部分,详细看源码。
6. 实验结果 按键按下后,LED灯亮; 按键松开后,LED灯灭。 |