STMCU小助手
发布时间:2021-11-30 21:00
|
位带操作也叫原子操作,也称别名。起作用直接进行位带操作,即直接读取寄存器的X位,或直接写寄存器的X位。 STM32的寄存器为32位的,在写入寄存器的x位中,通常操作为;排除寄存器除x外的其它位,在进行赋值。而位带操作可直接写寄存器的x位,使位操作更为便捷。 1 ^7 G6 c2 a# @6 X6 E- R 1. 实验内容及步骤:7 P; ^0 k# w2 u 实验内容:6 j: D0 Y5 E) H) Y8 e1 a% X + j- L2 M% b8 ~& W8 { 通过位带操作实现LED灯的翻转,和按键的读取。* d/ E9 a/ k' ]' K+ [ u7 A8 |. Q + {. B4 F6 @2 Z/ s; A 按键按下时,LED亮,松开按键时,LED灭; 1 E$ A# S& t* i- j$ y 步骤: 根据原寄存器地址定位位带地址;4 D. j0 p: M7 C* x0 I& u+ N $ \* h9 E7 Q+ J 2. 硬件说明# M3 ^% G1 L0 Q+ h
3 H+ M0 [ s7 ?" w
, }8 g1 \+ K, o! ` 按键与PE4相连接,按下时低电平(所以GPIOE4应该配置为上拉输入,按下:低电平;松开:高电平) 5 p- M( g! B9 G1 W( v LED与PB5相连,另一端接VCC,(所以GPIOB5应该配置为推挽输出,亮:低电平;灭:高电平) Y. K& e! u) a 3. 位带操作原理9 \$ g6 \9 c9 |( s STM32F1内部是有两个位带区的,如下图所示。
: Z, Y2 r3 y. x" @! j3 C 位带操作分别有片上外设和片上SRAM。我们用的比较多的通常是片上外设的位带操作,一般用来控制GPIO的反转和读取。 5 X7 T* Z- W* N8 `( H # T$ u y3 O; V+ Y# J: a& } 其膨胀对应关系图如下图所示,以SRAM位带操作位例,0x2000 0000地址的第一位,映射到0x2200 0000地址。其用法如下所示: : I' l) U: N* p; m, p0 P 当0x2200 0000的内容=1时 => 0x2000 0000的内容=0x01 + j) ^. h- W5 k5 r+ P: Q 当0x2200 0000的内容=0时 => 0x2000 0000的内容=0x00% \2 l' A" K0 P: t( l1 s …………… ) j4 M- n8 M- z" t; m3 ~ 当0x2200 0018的内容=1时 => 0x2000 0000的内容=0x40=(二进制)0100 0000# G: ]3 T' w$ g' \ 当0x2200 0018的内容=0时 => 0x2000 0000的内容=0x00
9 G! m. r/ Q/ A+ ]+ s3 z( ^ 4. 寄存器说明 位带映射地址如下图所示。(中文STM32参考手册P29) & y& n8 N: d3 p `% k
位带操作的例子如下图所示(CM3权威指南CnR2) 3 @, V/ O2 f. H p9 l# N
根据例子可写成通用的式子。6 `- f1 Q+ G L$ S1 u* k$ [ 0 Q" U/ h+ e9 N, D bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ (IN_ADDR_BASR&0x000FFFFF)*32+Bit*4) ^3 X: p+ K7 w2 R \7 A => 5 [+ B+ c- E/ N L* B 9 I' [( l0 Z! a5 l; U3 j bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ ((IN_ADDR_BASR&0x000FFFFF)<<5)+(Bit<<2)' P( W9 O' D# h, C 如要控制LED灯(PB5) IN_ADDR_BASR = GPIOB的输出寄存器 = 0X4001 0C00 + 0x0C; Bit = 5 5. 程序设计 代码班的通用位带操作地址转换宏定义如下:. {2 Y+ M6 P/ F
GPIO的输出位带宏定义如下定义
在本实验中要操作LED(PB5),因此BIT=5; / A. a: [1 b1 E- `' L; h+ L GPIO的输入位带宏定义如下定义: E* G" M2 v8 r4 @8 S . S6 K6 C6 i$ N3 K8 g #define BPE_IN(BIT) BIT_WORD_ADDR((GPIOE_BASE+0x08),BIT) BIT为要操作的位。" c, _+ ?1 C+ m 0 A: d- v# ]6 p. P 在本实验中要读取按键(PE4)的值,因此BIT=4; * _- I: s% X' {/ J0 e, k9 G 位带操作源码: ! P( P% O. n9 b4 P- S$ ? 源码筛选了关键部分,详细看源码。 $ G8 L; R- l8 a R3 e
6. 实验结果 按键按下后,LED灯亮;/ }# F! r4 g/ q4 Q/ f6 Y 按键松开后,LED灯灭。: _% I2 g) c( X- C' V , Q Q) w; C, N& ]! K% i( U 4 n" m* O8 R! J0 E6 b# y+ [ ( B. w/ T3 H7 V6 W1 x5 ^& g |
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之继电器模块
微信公众号
手机版