STMCU小助手
发布时间:2021-11-30 21:00
|
位带操作也叫原子操作,也称别名。起作用直接进行位带操作,即直接读取寄存器的X位,或直接写寄存器的X位。 STM32的寄存器为32位的,在写入寄存器的x位中,通常操作为;排除寄存器除x外的其它位,在进行赋值。而位带操作可直接写寄存器的x位,使位操作更为便捷。 1. 实验内容及步骤: 实验内容:7 j& @ _+ h7 ^/ M4 f: _; v 通过位带操作实现LED灯的翻转,和按键的读取。 按键按下时,LED亮,松开按键时,LED灭; - k- k7 J# p& l) r" A3 g* n 步骤:* P, B( B" e% J+ l6 }$ P$ p7 \ 4 c. F X* s D5 G7 l6 [( Z9 ` 根据原寄存器地址定位位带地址; ! @; o6 {4 S% g8 O: ?/ ?. c! o2 K 2. 硬件说明
* }$ J% E* T% g3 t9 w& `, Y Y+ K 按键与PE4相连接,按下时低电平(所以GPIOE4应该配置为上拉输入,按下:低电平;松开:高电平) LED与PB5相连,另一端接VCC,(所以GPIOB5应该配置为推挽输出,亮:低电平;灭:高电平) 3. 位带操作原理 STM32F1内部是有两个位带区的,如下图所示。- p% A$ J3 {6 P4 t D
位带操作分别有片上外设和片上SRAM。我们用的比较多的通常是片上外设的位带操作,一般用来控制GPIO的反转和读取。 0 k3 Y2 U m2 z1 }6 s* n ) ^) _) x' O1 A ( T# v" t2 L9 \5 @7 l0 n 其膨胀对应关系图如下图所示,以SRAM位带操作位例,0x2000 0000地址的第一位,映射到0x2200 0000地址。其用法如下所示: 6 {8 t, H- ]3 x; |: F5 ?6 i 当0x2200 0000的内容=1时 => 0x2000 0000的内容=0x01* L9 Y) T! j1 F$ a 当0x2200 0000的内容=0时 => 0x2000 0000的内容=0x00 ……………& o/ {3 R' w& H" i6 t 当0x2200 0018的内容=1时 => 0x2000 0000的内容=0x40=(二进制)0100 0000* |; w1 x/ ]5 H9 n ) D1 }. g; Z. Z- z 当0x2200 0018的内容=0时 => 0x2000 0000的内容=0x00( Y/ f' X* d9 W$ `5 g
4. 寄存器说明# G8 D* U( b6 f$ e! Z8 M8 G 位带映射地址如下图所示。(中文STM32参考手册P29) 7 ^3 \, a# ~" y) I
+ c f" ^- f* T" ^# M# x 位带操作的例子如下图所示(CM3权威指南CnR2), t D: G, G7 M8 w% Y6 y 1 N( A7 [) |8 h; q4 ]6 K
, K$ l" c8 |% O% K, d4 D1 P D8 T( h1 F 根据例子可写成通用的式子。8 _. |' s& q: g o# a- {2 r% l- q- w bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ (IN_ADDR_BASR&0x000FFFFF)*32+Bit*40 @ c' b4 F/ j# u$ G/ ~5 d 0 E& ~$ E( S: H9 E; b, q* Z6 a => 5 u' t |: }+ s( I8 A , Q; I4 R) k2 M9 A# t5 R bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ ((IN_ADDR_BASR&0x000FFFFF)<<5)+(Bit<<2) 如要控制LED灯(PB5)8 ]6 I" a. l Z( G 5 r' k% a9 d; {) Z/ z IN_ADDR_BASR = GPIOB的输出寄存器 = 0X4001 0C00 + 0x0C;5 ^1 I) a/ S" M9 K. [/ b7 o 9 l7 s7 B% V, d& | Bit = 57 g" ]. o1 B3 { ) L: c, O0 Q# ?* K 5. 程序设计 代码班的通用位带操作地址转换宏定义如下:7 z' t. ]' C5 E3 J( Y
GPIO的输出位带宏定义如下定义8 V) z U0 U8 s! C
在本实验中要操作LED(PB5),因此BIT=5;9 }' f( E# l, |( B% g7 c0 |1 y$ T: a% d # v- P" n$ N! O3 ^ GPIO的输入位带宏定义如下定义$ B2 h% U" y7 J : k: K6 q# |$ L$ [: s& i; a3 L0 ^5 Y #define BPE_IN(BIT) BIT_WORD_ADDR((GPIOE_BASE+0x08),BIT)& m2 W- `% y, R/ P% h BIT为要操作的位。" f. C# ^4 J3 K0 X2 V- E 在本实验中要读取按键(PE4)的值,因此BIT=4; 2 K: d0 Y+ ]% e3 _$ k 位带操作源码:2 W( ? O, P) n" p8 Z1 X# v ?9 F& T 源码筛选了关键部分,详细看源码。. A+ A Z7 i j2 `* o
6. 实验结果 按键按下后,LED灯亮; 按键松开后,LED灯灭。/ ~0 d4 r; ]% q + U3 @- { U: T: } / c+ C& r- b* r5 i3 B/ ^; V8 h% W - u) ~4 ]+ Q ]5 N5 F1 o |
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
【福利三:雨露均沾·逢7狂欢】之五:STM32系统时钟PLL故障排除1例
【福利三:雨露均沾·逢7狂欢】之三:AI帮我查BUG
福利三:雨露均沾·逢7狂欢】之二:STM32F407VG串口通信乱码故障的排除
基于STM32F103的I2C主从机通信
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
TFT LCD 与 FSMC 的硬件连接大容量 STM32F10xxx FSMC 接口
单片机:初学者该了解的STM32F103基础知识
2025软件工具兔哥知道
STM32之继电器模块
微信公众号
手机版