位带操作也叫原子操作,也称别名。起作用直接进行位带操作,即直接读取寄存器的X位,或直接写寄存器的X位。- u$ h4 x+ b/ P) p- j STM32的寄存器为32位的,在写入寄存器的x位中,通常操作为;排除寄存器除x外的其它位,在进行赋值。而位带操作可直接写寄存器的x位,使位操作更为便捷。 3 w5 C) i5 p+ m7 R7 i5 @ 1. 实验内容及步骤: 实验内容: 9 a1 B( I6 j" J( H7 @$ A) n/ Z( W 通过位带操作实现LED灯的翻转,和按键的读取。8 l$ T/ O- F9 g! E! c' _ 7 q$ c3 I; |5 `" @+ v9 U( R1 q 按键按下时,LED亮,松开按键时,LED灭; 步骤:# Y4 _' B% x) | ) W8 c0 [$ P% o: Y/ ]0 ^ 根据原寄存器地址定位位带地址;- I6 Q6 \, \1 l# [ 2. 硬件说明8 Z- M# p8 [5 S* u1 j3 y , ^; D6 o! s+ K! w9 [# T' s 3 L* s6 O C* P7 F3 |2 k ; M3 B s+ r' o4 a ' k5 P; b7 Y( {: q+ k; f( k 按键与PE4相连接,按下时低电平(所以GPIOE4应该配置为上拉输入,按下:低电平;松开:高电平)* b! W, T9 J) I / |7 k- e3 j7 ?5 I2 T LED与PB5相连,另一端接VCC,(所以GPIOB5应该配置为推挽输出,亮:低电平;灭:高电平) 3. 位带操作原理 e/ z& b" k( G+ _5 q& \ STM32F1内部是有两个位带区的,如下图所示。 0 ]' E/ @ i/ E1 M. |! y1 Q4 [/ k 位带操作分别有片上外设和片上SRAM。我们用的比较多的通常是片上外设的位带操作,一般用来控制GPIO的反转和读取。 2 `2 P& _3 E4 u3 c& I 其膨胀对应关系图如下图所示,以SRAM位带操作位例,0x2000 0000地址的第一位,映射到0x2200 0000地址。其用法如下所示:6 u$ W9 y) ~ |1 r4 p& I1 D + t+ I& a+ b$ y 当0x2200 0000的内容=1时 => 0x2000 0000的内容=0x01 当0x2200 0000的内容=0时 => 0x2000 0000的内容=0x000 ^! }5 s3 U- K4 ~" k# n ……………4 Z. s _6 |& S* G7 j 当0x2200 0018的内容=1时 => 0x2000 0000的内容=0x40=(二进制)0100 0000 - U1 A+ z2 i1 U ` h; D 当0x2200 0018的内容=0时 => 0x2000 0000的内容=0x00/ ?4 I) S5 N6 a; |2 @6 k + `1 W" e4 q5 y% s1 z ( b3 O. b* c7 w* [' M" ^" J 4. 寄存器说明 位带映射地址如下图所示。(中文STM32参考手册P29)3 A) }- z- E% r5 g) L; ?: c6 S 1 A3 U* `5 W* m4 X 位带操作的例子如下图所示(CM3权威指南CnR2) 根据例子可写成通用的式子。$ ]2 c7 n% G& C1 C0 W bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ (IN_ADDR_BASR&0x000FFFFF)*32+Bit*4 $ [- S; k5 G' d) z6 M z2 H& k8 q" A => 8 U- j" } h& | : N* Z" J& U0 \5 z1 r2 v bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ ((IN_ADDR_BASR&0x000FFFFF)<<5)+(Bit<<2)" B# d: g* X9 c z- C) K % m4 @/ r# g* g! f8 U* V% o3 j; | 如要控制LED灯(PB5) ! W" k+ t" u }5 X2 t8 i- w# j" B/ w& T IN_ADDR_BASR = GPIOB的输出寄存器 = 0X4001 0C00 + 0x0C; v7 f5 U- s& T* k ! S1 j& |! d9 B/ P6 d" X( c4 Q; T( d) c Bit = 5 * X1 e* M: W6 B8 ~3 e) \ 5. 程序设计 代码班的通用位带操作地址转换宏定义如下:$ v5 r m' m; S; A& J
GPIO的输出位带宏定义如下定义
在本实验中要操作LED(PB5),因此BIT=5;' s) |0 G1 ~ \& u- ?2 F 1 ]. u- H# }9 I/ l8 D1 p GPIO的输入位带宏定义如下定义: _, v1 m/ y" o, t7 o #define BPE_IN(BIT) BIT_WORD_ADDR((GPIOE_BASE+0x08),BIT) BIT为要操作的位。 % x/ p# A2 B# V; J, C 在本实验中要读取按键(PE4)的值,因此BIT=4;- |( T' ^( D- ]7 t- A& ] , K7 Q( h+ s# G5 I ' y. Y6 k9 U1 M+ \, ` 位带操作源码: 源码筛选了关键部分,详细看源码。
6. 实验结果/ I6 Z) X8 f4 S; w 按键按下后,LED灯亮;7 d: P5 l5 m ? ! e0 A" o1 ?; Z% p# x; I5 u 按键松开后,LED灯灭。+ r" ?# S) h. M$ Q " h4 ~0 C* Z/ V" \ p: I ( |! E7 }1 r( {1 R$ q8 r, p |
小马哥STM32F103开源小四轴RoboFly全部资料大放送
STM32F103移植LittlevGUI代码
使用STM32F103制作的无线下载器
【MCU实战经验】+自制MP3使用STM32F103ZET6和ch375读取u盘,vs1003解码,音质超棒
串口通信波特率异常的解决办法
【MCU实战经验】+STM32F103的uCOSII详细移植
游名科技:STM32F103+TMC2160:86步进电机和驱动一体原理图/PCB...
在高容量 STM32F103xx 微控制器中实现 ADPCM 算法
STM32F103标准库开发---SPI实验---读写 W25Q128 外部 Flash
RT-Thread在STM32F103RC上移植