STMCU小助手
发布时间:2021-11-30 21:00
|
位带操作也叫原子操作,也称别名。起作用直接进行位带操作,即直接读取寄存器的X位,或直接写寄存器的X位。 STM32的寄存器为32位的,在写入寄存器的x位中,通常操作为;排除寄存器除x外的其它位,在进行赋值。而位带操作可直接写寄存器的x位,使位操作更为便捷。 1. 实验内容及步骤:& t" |* l- T5 n- j( e# [+ @5 Q1 \ 实验内容: 通过位带操作实现LED灯的翻转,和按键的读取。5 M2 }+ _4 m9 L, D4 d 按键按下时,LED亮,松开按键时,LED灭; 步骤: 根据原寄存器地址定位位带地址; 2. 硬件说明* e1 N0 j2 s0 i9 O0 G 1 g E' `! ?+ [3 G
' P. j: b' B B6 i" M* U
% i- t1 o# V5 a/ B! x1 ^9 A 按键与PE4相连接,按下时低电平(所以GPIOE4应该配置为上拉输入,按下:低电平;松开:高电平)0 f# g, Q$ l6 U4 d5 } LED与PB5相连,另一端接VCC,(所以GPIOB5应该配置为推挽输出,亮:低电平;灭:高电平)- c1 G! r& [8 j1 _6 w# Z8 o . b& I: r! i* {& [; }7 V 3. 位带操作原理4 a8 E( v" c* v5 l STM32F1内部是有两个位带区的,如下图所示。 / k: N" X/ m: d
3 J* o x1 ?% L 位带操作分别有片上外设和片上SRAM。我们用的比较多的通常是片上外设的位带操作,一般用来控制GPIO的反转和读取。 2 _- m5 s/ I/ c- l $ c, ~/ p1 f% l$ H( ^" M 2 o; s! d4 C8 z: K/ `- U, |) Z 其膨胀对应关系图如下图所示,以SRAM位带操作位例,0x2000 0000地址的第一位,映射到0x2200 0000地址。其用法如下所示: 当0x2200 0000的内容=1时 => 0x2000 0000的内容=0x012 L8 Z! ^2 O8 M9 y" @/ e$ T 当0x2200 0000的内容=0时 => 0x2000 0000的内容=0x002 V* }+ F; y1 @/ Q) p …………… 当0x2200 0018的内容=1时 => 0x2000 0000的内容=0x40=(二进制)0100 0000 当0x2200 0018的内容=0时 => 0x2000 0000的内容=0x003 R, _9 W4 {$ S' R( [, j 9 V) D. o) _, g' `( U D
2 q7 X( v5 d5 k/ |+ b' w 4. 寄存器说明" T2 Y, T6 |1 c, J" D$ p 位带映射地址如下图所示。(中文STM32参考手册P29)5 e( ~" s: ]; y, a9 _1 O & Y, U) Q; X, v9 v/ c
位带操作的例子如下图所示(CM3权威指南CnR2)6 ~6 W+ T ~8 s
根据例子可写成通用的式子。 . W8 J2 y: }. `( b bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ (IN_ADDR_BASR&0x000FFFFF)*32+Bit*4& |0 K! t; s8 m$ x k" {5 r: p => bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ ((IN_ADDR_BASR&0x000FFFFF)<<5)+(Bit<<2) 如要控制LED灯(PB5) IN_ADDR_BASR = GPIOB的输出寄存器 = 0X4001 0C00 + 0x0C; # f. X; b3 `9 K$ \( T9 @( X( a: y Bit = 58 l3 d* u: j% i0 N8 G0 T 5. 程序设计 代码班的通用位带操作地址转换宏定义如下:
GPIO的输出位带宏定义如下定义4 Q+ P# h/ Z$ j$ `3 [4 q$ j3 e0 x( g
在本实验中要操作LED(PB5),因此BIT=5; # z p8 p; `8 w GPIO的输入位带宏定义如下定义 ! h6 I/ H7 r) a4 z- U& u #define BPE_IN(BIT) BIT_WORD_ADDR((GPIOE_BASE+0x08),BIT) BIT为要操作的位。4 m5 S/ R5 Z, W) \ 在本实验中要读取按键(PE4)的值,因此BIT=4; / d8 ?# G ~! M/ U e# j' [0 Y * h) s( _7 U3 V9 R - D$ h1 F# h' _' c$ z 位带操作源码: 9 O+ X2 V7 K6 _" f 源码筛选了关键部分,详细看源码。 7 E+ j# T" x1 ~: a, B& P8 W
6. 实验结果7 }8 d; w; z& k7 _* | 按键按下后,LED灯亮; - H3 Z% U+ Z0 c3 B3 k 按键松开后,LED灯灭。, z' e, v( s' i' w% l8 Y9 U |
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之继电器模块
微信公众号
手机版