STMCU小助手
发布时间:2021-11-30 21:00
|
位带操作也叫原子操作,也称别名。起作用直接进行位带操作,即直接读取寄存器的X位,或直接写寄存器的X位。 STM32的寄存器为32位的,在写入寄存器的x位中,通常操作为;排除寄存器除x外的其它位,在进行赋值。而位带操作可直接写寄存器的x位,使位操作更为便捷。# S4 D6 z; p' d5 W/ h 1. 实验内容及步骤:! |4 C: g3 u* n( V) n+ S 实验内容: 7 d5 ^2 _5 g# E( ~7 \& i: X 通过位带操作实现LED灯的翻转,和按键的读取。 按键按下时,LED亮,松开按键时,LED灭;7 o9 ]7 n* J& \: P7 z3 | 步骤:: v2 A6 L6 I p$ e3 F4 E + g Q K% Y7 p) @/ o 根据原寄存器地址定位位带地址; " {& T- |( l& ]! d 2. 硬件说明0 |' F% ~% |8 I$ S
" F1 C" L, q/ ~; T9 [+ H$ ?
; t/ w# P. r; c/ e- e9 ^ 按键与PE4相连接,按下时低电平(所以GPIOE4应该配置为上拉输入,按下:低电平;松开:高电平) LED与PB5相连,另一端接VCC,(所以GPIOB5应该配置为推挽输出,亮:低电平;灭:高电平)2 \7 D6 ] ?# ?. p9 c# \ 2 b+ Q# |, D( r( ^ 3. 位带操作原理 STM32F1内部是有两个位带区的,如下图所示。" K5 q, \# Y( b0 N % y' u# c/ {( B( ^, O0 ^" L
& @5 c" y- e( u7 U, b 位带操作分别有片上外设和片上SRAM。我们用的比较多的通常是片上外设的位带操作,一般用来控制GPIO的反转和读取。 ' k: `+ R4 U8 S/ m3 T4 l' f , G, j z) M" F 5 C: @& e- |9 d) b) R5 S 其膨胀对应关系图如下图所示,以SRAM位带操作位例,0x2000 0000地址的第一位,映射到0x2200 0000地址。其用法如下所示: & u1 M; A) q: i# O/ d! D 当0x2200 0000的内容=1时 => 0x2000 0000的内容=0x01 - g/ M) O! d6 n$ T" j+ l1 W 当0x2200 0000的内容=0时 => 0x2000 0000的内容=0x00) F4 O6 \# S6 T. s' m L …………… 当0x2200 0018的内容=1时 => 0x2000 0000的内容=0x40=(二进制)0100 0000 / U- T6 [5 v# h, m: U 当0x2200 0018的内容=0时 => 0x2000 0000的内容=0x00
4. 寄存器说明3 \. G' B4 a5 J. p: X3 F% q 位带映射地址如下图所示。(中文STM32参考手册P29) / |6 e3 i" M3 i8 `! {
位带操作的例子如下图所示(CM3权威指南CnR2)
0 |7 q" M5 Y/ F, g, n 根据例子可写成通用的式子。" a+ Q+ j. b2 b/ [/ x bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ (IN_ADDR_BASR&0x000FFFFF)*32+Bit*4 => ) S" v; h3 d* s3 e/ { bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ ((IN_ADDR_BASR&0x000FFFFF)<<5)+(Bit<<2), G6 D# L* @; r0 s c/ Z ; D* g6 k) C" p 如要控制LED灯(PB5) IN_ADDR_BASR = GPIOB的输出寄存器 = 0X4001 0C00 + 0x0C;! e0 t6 M0 ~. d6 J1 T Bit = 5* g- U. @- |7 ^ 8 S6 v% l4 Z. ^% F7 h* r 5. 程序设计' ` w) w4 t3 F4 @, E s- A 代码班的通用位带操作地址转换宏定义如下:
GPIO的输出位带宏定义如下定义- V, I, h; j" X3 _ Y
在本实验中要操作LED(PB5),因此BIT=5;2 H l7 P* { `2 l$ `# h, ? / z0 w: x3 c7 Q% @/ \7 U4 ]9 Q5 b GPIO的输入位带宏定义如下定义 4 w0 C- n2 C& U #define BPE_IN(BIT) BIT_WORD_ADDR((GPIOE_BASE+0x08),BIT)/ p) M5 X" I" z- t9 \, r& U9 [ BIT为要操作的位。- f# X9 U0 M5 N5 V' T' R 9 @" t% P9 d: {) [* ], E 在本实验中要读取按键(PE4)的值,因此BIT=4;5 d! P1 X# K7 c2 j8 y! l 位带操作源码: 源码筛选了关键部分,详细看源码。
6. 实验结果: j/ Q; T. j6 ]7 `7 g8 I$ J( Y 按键按下后,LED灯亮;# s( H8 n* u( C- V 按键松开后,LED灯灭。 1 z0 C9 _" b6 c- S& i+ h( N 4 ~4 k6 E) u0 D0 l C |
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之继电器模块
微信公众号
手机版