STMCU小助手
发布时间:2021-11-30 21:00
|
位带操作也叫原子操作,也称别名。起作用直接进行位带操作,即直接读取寄存器的X位,或直接写寄存器的X位。 STM32的寄存器为32位的,在写入寄存器的x位中,通常操作为;排除寄存器除x外的其它位,在进行赋值。而位带操作可直接写寄存器的x位,使位操作更为便捷。' J2 L5 H/ ~+ x8 q7 Z 1. 实验内容及步骤:1 L/ h7 Y2 A5 U O* V 实验内容:6 q$ x& y( F3 d0 N 通过位带操作实现LED灯的翻转,和按键的读取。& {( C# V# G4 A9 _# D3 a5 N' @* |5 Q # o3 _) V7 G. v 按键按下时,LED亮,松开按键时,LED灭; 步骤: 根据原寄存器地址定位位带地址; - I0 t# i2 o% S7 G/ g 2. 硬件说明
7 `) x" I. V7 G6 E0 k; f- G0 V& T
9 p$ v) A$ [$ O7 j 按键与PE4相连接,按下时低电平(所以GPIOE4应该配置为上拉输入,按下:低电平;松开:高电平). `$ h& ^1 g. G/ h LED与PB5相连,另一端接VCC,(所以GPIOB5应该配置为推挽输出,亮:低电平;灭:高电平): l4 ^1 N$ t2 j1 F 3. 位带操作原理 STM32F1内部是有两个位带区的,如下图所示。 3 _5 L( u' i! G! f- P
/ I q6 f2 ~' n7 \# } 位带操作分别有片上外设和片上SRAM。我们用的比较多的通常是片上外设的位带操作,一般用来控制GPIO的反转和读取。 3 O. N- U$ A* E 7 p, z2 T. b* @6 f6 q4 c. [; ?5 m 0 s. t) Y5 e9 v 其膨胀对应关系图如下图所示,以SRAM位带操作位例,0x2000 0000地址的第一位,映射到0x2200 0000地址。其用法如下所示:0 D+ R% B+ n0 P9 B& O 当0x2200 0000的内容=1时 => 0x2000 0000的内容=0x01' W4 b1 A& c3 v# o) p s( p/ w% A. O; k 当0x2200 0000的内容=0时 => 0x2000 0000的内容=0x009 ?3 S5 @) {8 H ' q0 m( w" N# c' ^# | …………… ; A2 j' s | `' u) h4 P 当0x2200 0018的内容=1时 => 0x2000 0000的内容=0x40=(二进制)0100 0000- U+ p. c$ Y, m& T3 J; ^# b 当0x2200 0018的内容=0时 => 0x2000 0000的内容=0x00( j4 {, f5 p: j5 e 3 J) p" ~% I: s3 m8 R. l# r) D" j A9 Z
6 ~" F: \' ?4 w+ \! \: t 4. 寄存器说明. u3 K, `0 I% k 位带映射地址如下图所示。(中文STM32参考手册P29)# f9 G' ?( J. u5 B5 A
位带操作的例子如下图所示(CM3权威指南CnR2)4 }" O: W4 c1 ]8 e3 B 1 o! a/ e) |0 w# {
根据例子可写成通用的式子。 bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ (IN_ADDR_BASR&0x000FFFFF)*32+Bit*4 => " y. I+ C6 q1 m. f: r bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ ((IN_ADDR_BASR&0x000FFFFF)<<5)+(Bit<<2)) c+ ^! i8 K" n. ]' V 如要控制LED灯(PB5) . g" b+ m3 q W, I. I. f IN_ADDR_BASR = GPIOB的输出寄存器 = 0X4001 0C00 + 0x0C; " U# ^4 Z. {8 B" r Bit = 5 / U) \3 c5 ? I* U r% Z6 e9 e, z 5. 程序设计 代码班的通用位带操作地址转换宏定义如下:
GPIO的输出位带宏定义如下定义" A) r# n I7 E h) v$ V% Q
在本实验中要操作LED(PB5),因此BIT=5; R, S: c; N! O H3 j1 m GPIO的输入位带宏定义如下定义* U6 s' W& V; D" }3 P- N; E, Y# w #define BPE_IN(BIT) BIT_WORD_ADDR((GPIOE_BASE+0x08),BIT) BIT为要操作的位。 0 f% G) D! C+ Z2 \# Y4 k, a 在本实验中要读取按键(PE4)的值,因此BIT=4; 2 V, a& y1 m6 N$ i! ` 位带操作源码: 源码筛选了关键部分,详细看源码。- f E) ~# r& T1 W, F $ d1 {2 ]! j3 t! q2 O) [% w; J
6. 实验结果 按键按下后,LED灯亮; 按键松开后,LED灯灭。5 Q9 R N! I. j% W 7 J k2 a$ X2 H3 C 3 x( G6 L+ I4 V! i & a$ {! ~0 O6 t ; F2 s) \. C- O1 a4 c% {) i2 m |
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之继电器模块
微信公众号
手机版