你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F1位带操作(寄存器、标准库、HAL库)

[复制链接]
STMCU小助手 发布时间:2021-11-30 21:00
位带操作也叫原子操作,也称别名。起作用直接进行位带操作,即直接读取寄存器的X位,或直接写寄存器的X位。
9 e! y! C6 a! E! M! M       STM32的寄存器为32位的,在写入寄存器的x位中,通常操作为;排除寄存器除x外的其它位,在进行赋值。而位带操作可直接写寄存器的x位,使位操作更为便捷。# S4 D6 z; p' d5 W/ h

! `& V3 y6 N1 H9 U& q1. 实验内容及步骤:! |4 C: g3 u* n( V) n+ S
实验内容:
/ a4 }$ P! s/ b5 ]7 d5 ^2 _5 g# E( ~7 \& i: X
       通过位带操作实现LED灯的翻转,和按键的读取。
' j, g8 Q1 j0 R
' _/ g; l2 [8 j7 F  |; X% [! n4 X( c7 C       按键按下时,LED亮,松开按键时,LED灭;7 o9 ]7 n* J& \: P7 z3 |

0 ?+ n5 |+ d' o$ d步骤:: v2 A6 L6 I  p$ e3 F4 E
+ g  Q  K% Y7 p) @/ o
       根据原寄存器地址定位位带地址;
" i! t7 Q( n: g% k* `+ C( c" {& T- |( l& ]! d
2. 硬件说明0 |' F% ~% |8 I$ S

2 U; @; X* K3 o: D
20210617101338928.png

" C- c% j$ o/ \" F1 C" L, q/ ~; T9 [+ H$ ?
20210617101343678.png
+ p# `2 F  g, g
; t/ w# P. r; c/ e- e9 ^

7 `" B3 V, q) z' \) M: ]5 o$ O! p" v       按键与PE4相连接,按下时低电平(所以GPIOE4应该配置为上拉输入,按下:低电平;松开:高电平)
& a7 f/ r2 Q1 f  U
4 e8 t# k9 z  \' x, \       LED与PB5相连,另一端接VCC,(所以GPIOB5应该配置为推挽输出,亮:低电平;灭:高电平)2 \7 D6 ]  ?# ?. p9 c# \
2 b+ Q# |, D( r( ^
3. 位带操作原理
, M2 ]0 ^% m* {9 Z       STM32F1内部是有两个位带区的,如下图所示。" K5 q, \# Y( b0 N
% y' u# c/ {( B( ^, O0 ^" L
20210617105544116.png

" R/ g; b- x6 }& W: u% [" l& u& @5 c" y- e( u7 U, b
     位带操作分别有片上外设和片上SRAM。我们用的比较多的通常是片上外设的位带操作,一般用来控制GPIO的反转和读取。 ' k: `+ R4 U8 S/ m3 T4 l' f

$ U$ U  V; m/ v% B# a3 [, G, j  z) M" F
5 C: @& e- |9 d) b) R5 S
其膨胀对应关系图如下图所示,以SRAM位带操作位例,0x2000 0000地址的第一位,映射到0x2200 0000地址。其用法如下所示:
6 @! O# f2 [1 R+ _# C& u1 M; A) q: i# O/ d! D
       当0x2200 0000的内容=1时 => 0x2000 0000的内容=0x01
# M- C' C7 w9 |; @' ^- g/ M) O! d6 n$ T" j+ l1 W
       当0x2200 0000的内容=0时 => 0x2000 0000的内容=0x00) F4 O6 \# S6 T. s' m  L

+ Q6 \9 H  Z" j3 A6 S' l7 c- f- k       ……………
; ^) M, j4 }* \, ?: t
( H1 V# o. N: l" z0 y       当0x2200 0018的内容=1时 => 0x2000 0000的内容=0x40=(二进制)0100 0000
7 r8 X; c3 T9 |5 I/ U- T6 [5 v# h, m: U
       当0x2200 0018的内容=0时 => 0x2000 0000的内容=0x00
  O, r7 e( ~. P
, \! f: V2 R" A0 p: I6 F
20210617140221772.png
' i/ z& ~; b& S- t  h1 g. g) U

% |' w0 b, y, B; r4. 寄存器说明3 \. G' B4 a5 J. p: X3 F% q
       位带映射地址如下图所示。(中文STM32参考手册P29)
3 X5 x6 \* H+ Y* j/ |6 e3 i" M3 i8 `! {
20210617101442958.png
' t7 j+ }0 j3 N% ?; H

8 N' R- b, G+ s       位带操作的例子如下图所示(CM3权威指南CnR2)
4 ~7 ?! [- O, k7 x7 _0 m% q
3 l! [# x$ J- G6 N' @: P2 r
20210617101509429.png

6 F/ }, Y& E* K" J0 |7 q" M5 Y/ F, g, n
       根据例子可写成通用的式子。" a+ Q+ j. b2 b/ [/ x

- m9 ]$ \2 c& S; t       bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ (IN_ADDR_BASR&0x000FFFFF)*32+Bit*4
# E# u5 A* X3 a0 d* t
* c- W2 f( C1 V! X; k       => ) S" v; h3 d* s3 e/ {

0 G0 }9 p/ ~9 D' U       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)
0 e. A; V7 N# s
1 b+ H* S6 `7 W$ @0 y       IN_ADDR_BASR = GPIOB的输出寄存器 = 0X4001 0C00 + 0x0C;! e0 t6 M0 ~. d6 J1 T

" m5 e- @/ P3 l# n" d8 G: q       Bit = 5* g- U. @- |7 ^
8 S6 v% l4 Z. ^% F7 h* r
5. 程序设计' `  w) w4 t3 F4 @, E  s- A
       代码班的通用位带操作地址转换宏定义如下:
# i) S0 j( }7 W) o7 W
  1. #define BIT_WORD_ADDR(IN_ADDR,BIT) *(__IO uint32_t*)((IN_ADDR&0xF0000000|0x02000000) +((IN_ADDR&0x000FFFFF)<<5) + (BIT<<2))
复制代码
7 s/ P1 X( S" J" ~
       GPIO的输出位带宏定义如下定义- V, I, h; j" X3 _  Y
  1.         #define BPB_OUT(BIT)  BIT_WORD_ADDR((GPIOA_BASE+0x0C),BIT)   
复制代码
BIT为要操作的位。) E2 Q/ A6 T, F7 i' k9 z2 ?
       在本实验中要操作LED(PB5),因此BIT=5;2 H  l7 P* {  `2 l$ `# h, ?
/ z0 w: x3 c7 Q% @/ \7 U4 ]9 Q5 b
       GPIO的输入位带宏定义如下定义
0 a7 L; S$ w& r2 B% |; f7 ?( n  e4 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

# ]/ a- Q3 c6 h+ [0 y5 Y+ |
" [; {. [" y' A$ o) x! \. R
6 p6 I4 D$ O( m/ H4 L2 ^. H( G位带操作源码:
! ^+ @) f: z$ X2 x; Q) N
  S* M  U1 o: m源码筛选了关键部分,详细看源码。
( ^) ?, S- [; g% e6 s" J; [
) g( [2 o: I+ `7 j7 H  P# O# i
  1. #define BIT_WORD_ADDR(IN_ADDR,BIT)      *(__IO uint32_t*)((IN_ADDR&0xF0000000|0x02000000) +\
    ) J0 s% v2 B+ i% E: m
  2.                                                             ((IN_ADDR&0x000FFFFF)<<5) +\" t- a' ]& t, S: ]5 Z
  3.                                                              (BIT<<2))6 M: y8 ^* |" w6 l' [4 F

  4. 7 j" q/ ~5 H4 D$ d1 K* X1 L
  5. //GPIO_OUT
    3 k" X& X( E) u' y' h! Q& j3 a0 F
  6. #define BPA_OUT(BIT)  BIT_WORD_ADDR((GPIOA_BASE+0x0C),BIT)
    ' M2 m1 e6 G. ~8 Y8 f4 \
  7. #define BPB_OUT(BIT)  BIT_WORD_ADDR((GPIOB_BASE+0x0C),BIT)% r0 r7 p; X4 Q- l7 B3 a
  8. #define BPC_OUT(BIT)  BIT_WORD_ADDR((GPIOC_BASE+0x0C),BIT)* o* p4 d3 `! c4 D: b# [
  9. #define BPD_OUT(BIT)  BIT_WORD_ADDR((GPIOD_BASE+0x0C),BIT)+ x( \3 M8 j7 [
  10. #define BPE_OUT(BIT)  BIT_WORD_ADDR((GPIOE_BASE+0x0C),BIT)
    3 a" @# s1 M  j4 Q
  11. #define BPF_OUT(BIT)  BIT_WORD_ADDR((GPIOF_BASE+0x0C),BIT)' C: e; [3 G, Y4 e% Q" N$ d: a
  12. #define BPG_OUT(BIT)  BIT_WORD_ADDR((GPIOG_BASE+0x0C),BIT)
    ) J/ j" }% l9 K; N
  13. //GPIO_IN: l4 }8 K8 E1 M; |6 E
  14. #define BPA_IN(BIT)  BIT_WORD_ADDR((GPIOA_BASE+0x08),BIT)/ |1 F4 _- i4 n. u
  15. #define BPB_IN(BIT)  BIT_WORD_ADDR((GPIOB_BASE+0x08),BIT)3 }9 a  y- ~% F  Z; s# ^/ n) \
  16. #define BPC_IN(BIT)  BIT_WORD_ADDR((GPIOC_BASE+0x08),BIT)
    # Q0 e8 I4 o  G( h0 e( ?
  17. #define BPD_IN(BIT)  BIT_WORD_ADDR((GPIOD_BASE+0x08),BIT)3 f+ ~5 o* v4 l8 R: I
  18. #define BPE_IN(BIT)  BIT_WORD_ADDR((GPIOE_BASE+0x08),BIT). W) `3 P! k. t4 E# ]
  19. #define BPF_IN(BIT)  BIT_WORD_ADDR((GPIOF_BASE+0x08),BIT)) o6 R0 r  \0 ^) @7 g% J
  20. #define BPG_IN(BIT)  BIT_WORD_ADDR((GPIOG_BASE+0x08),BIT)
复制代码
- K6 s1 t" _' l: X7 n9 E
6. 实验结果: j/ Q; T. j6 ]7 `7 g8 I$ J( Y
       按键按下后,LED灯亮;# s( H8 n* u( C- V

& H+ a; b) k2 F" M/ w3 A- {; z7 `* p: a       按键松开后,LED灯灭。
/ g  g1 F$ d( _7 i1 I/ ^2 }4 y; c9 l
8 m- }. Z: M: r1 l9 b1 K7 t1 z0 C9 _" b6 c- S& i+ h( N
4 ~4 k6 E) u0 D0 l  C

" V) N2 U) I% Z. s1 o2 d8 g0 }
赞 收藏 评论0 发布时间:2021-11-30 21:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版