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

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

[复制链接]
STMCU小助手 发布时间:2021-11-30 21:00
位带操作也叫原子操作,也称别名。起作用直接进行位带操作,即直接读取寄存器的X位,或直接写寄存器的X位。
# z5 l5 D- z& ?4 E& v       STM32的寄存器为32位的,在写入寄存器的x位中,通常操作为;排除寄存器除x外的其它位,在进行赋值。而位带操作可直接写寄存器的x位,使位操作更为便捷。" o; d( U* N( K: o& R, I8 t
- E) D  H  {+ h& G9 q% [* ?) U1 e. P2 X
1. 实验内容及步骤:
6 a7 ~6 F- o# Q实验内容:' [; _7 Y: T6 z7 o& l
  S7 Z! U5 N  F: o( E
       通过位带操作实现LED灯的翻转,和按键的读取。
: R* |' B: w; q: G5 S! P8 H5 e
- k  b, q1 A4 [! |& n+ d       按键按下时,LED亮,松开按键时,LED灭;
  W* n+ T$ H* \0 ~) s. G2 g- Z1 i& y5 {& N1 |3 l4 y4 b* V
步骤:, h2 @! E& j, e5 B# A  v3 g1 k

( f( f1 c- T6 m1 n       根据原寄存器地址定位位带地址;
$ o- e$ s8 A6 j! [3 A6 j6 n# l7 r5 @$ M$ ~
2. 硬件说明/ H5 R3 e7 ]; S) c! P( H0 h

% B$ d  r) f4 n& [3 k4 U  y
20210617101338928.png
+ ^3 l4 j) E' e" j! h; U$ f
+ u( K4 b- p  {1 t4 }3 L
20210617101343678.png

/ g, o- y& ]: F& H- d# P- N+ ]2 [9 E& a- v" H& C, u6 `
% `/ a  L# Q" ]9 A# u4 d2 V
       按键与PE4相连接,按下时低电平(所以GPIOE4应该配置为上拉输入,按下:低电平;松开:高电平)1 c/ p% C1 x! C6 V; H' S

8 P' O. f, g$ s9 g' u& g7 ?$ R       LED与PB5相连,另一端接VCC,(所以GPIOB5应该配置为推挽输出,亮:低电平;灭:高电平)6 G1 K& S% @, M: ~, T1 a

' w! ]3 M) H* y4 A* D3. 位带操作原理) X+ e" W5 m3 f7 {; Q/ K& V4 U: r
       STM32F1内部是有两个位带区的,如下图所示。
+ [8 i& X  b2 T% D7 }+ O5 w, G+ _* P: e( \0 a; H! w
20210617105544116.png
. Z, D0 k1 o& z) [2 a
5 v$ o& ]; @3 d/ r4 Q
     位带操作分别有片上外设和片上SRAM。我们用的比较多的通常是片上外设的位带操作,一般用来控制GPIO的反转和读取。 $ T& {+ q$ [+ u7 V9 x

8 `* k7 B# L! Y0 q" R$ B& C1 |$ V/ d" Q# w' H

9 w1 K" m) e' A9 f8 e: q  i其膨胀对应关系图如下图所示,以SRAM位带操作位例,0x2000 0000地址的第一位,映射到0x2200 0000地址。其用法如下所示:
2 t% u* J" `9 l4 k+ j0 O4 ]9 [- |2 v5 p5 B" e1 n# m: M
       当0x2200 0000的内容=1时 => 0x2000 0000的内容=0x01! }, h& ^/ H4 Y* K$ n3 @
) ^) v" @' _5 j, x8 X# n
       当0x2200 0000的内容=0时 => 0x2000 0000的内容=0x00- r7 }4 `5 Y# @' ~  C8 o

5 J1 w+ }4 |* u       ……………
3 i0 E: ^7 T3 P; B% C! \# n, ]5 [2 W  f& V0 s
       当0x2200 0018的内容=1时 => 0x2000 0000的内容=0x40=(二进制)0100 0000  Z7 N$ O& I% T
2 n  U- Y5 K+ I% \+ ]# N
       当0x2200 0018的内容=0时 => 0x2000 0000的内容=0x00& j! \/ N+ A) y# S2 k
" X4 s; ]& Y: C$ |4 A. b
20210617140221772.png
2 I5 \# L: v) F

+ k+ B' _8 h% R8 ~6 X9 L4. 寄存器说明
3 q/ z4 M9 _5 q, S* u: e. H       位带映射地址如下图所示。(中文STM32参考手册P29)/ L' Y, I- I, o: l' M" t9 t' H

0 j7 q6 V' u& d9 x4 l; j/ ]
20210617101442958.png

. K" r+ t# w. Z& S+ U: e
4 a# l: W9 I% {% z0 W       位带操作的例子如下图所示(CM3权威指南CnR2)
( V/ y& l3 n0 G6 {6 J- N$ u7 O( x' }" R6 B6 f
20210617101509429.png
: R  e% ]& O0 B% R1 a  t
2 f- m# L( c9 l& j
       根据例子可写成通用的式子。
. \/ o' _( K6 I% P
4 s5 m1 n9 g) x3 N8 G       bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ (IN_ADDR_BASR&0x000FFFFF)*32+Bit*4& j6 @& i6 i- d
7 G" _# j7 L' ]* j! e% ^8 i
       => 0 x5 I0 c3 e. ^9 h1 ?

1 i$ y- Q! A1 e/ ]       bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ ((IN_ADDR_BASR&0x000FFFFF)<<5)+(Bit<<2)
7 d6 U6 ]2 `4 c9 [( D
' W( V7 W1 P) M+ D; x       如要控制LED灯(PB5); C9 q2 V: d! ~. J  {
4 y8 \- x% i8 p# e
       IN_ADDR_BASR = GPIOB的输出寄存器 = 0X4001 0C00 + 0x0C;$ V$ l" r" v1 C8 ?
/ ^$ x/ m5 n+ _5 r7 R, l5 y' A$ u
       Bit = 5
9 S2 V0 N$ F5 ?) I5 ?; |- {" k7 j2 Q+ N' }7 ^. {0 D( m/ K; K' S
5. 程序设计
2 [3 C$ C5 D& \7 d       代码班的通用位带操作地址转换宏定义如下:
9 G: e8 Z) J5 ^& F1 T' X/ a# B
  1. #define BIT_WORD_ADDR(IN_ADDR,BIT) *(__IO uint32_t*)((IN_ADDR&0xF0000000|0x02000000) +((IN_ADDR&0x000FFFFF)<<5) + (BIT<<2))
复制代码

7 T& @3 r; u1 A/ B1 a! H       GPIO的输出位带宏定义如下定义4 |, `' N5 m1 K! ~) x6 j- U& s8 |* q; q
  1.         #define BPB_OUT(BIT)  BIT_WORD_ADDR((GPIOA_BASE+0x0C),BIT)   
复制代码
BIT为要操作的位。3 x) |, x+ q9 o4 d* T! u' H. n( I" L
       在本实验中要操作LED(PB5),因此BIT=5;0 e! ?* ~5 b7 j( I9 k8 U! Y
6 s7 z- W) N9 t- J5 p- C7 s
       GPIO的输入位带宏定义如下定义# z3 V# o! C- h9 E7 N& L
9 J( l0 o- j1 ^3 c
        #define BPE_IN(BIT)  BIT_WORD_ADDR((GPIOE_BASE+0x08),BIT)
. @' m6 d  y- w' x       BIT为要操作的位。
8 [' d4 I# V& D- L1 g( s+ w. ~9 Q$ A: Z% |8 K) E! ^# {  A6 {
在本实验中要读取按键(PE4)的值,因此BIT=4;
& |# w/ s1 Y& z6 X  }2 N( g. T4 ?9 e& U% A: H

; K( y! o& b, \& v! ^
2 Y5 \) J( L8 N9 B位带操作源码:
9 q; U6 Q$ _/ ?# I8 u! p- ^4 G3 c6 ?) v$ j* \: s
源码筛选了关键部分,详细看源码。7 [: `4 u3 e+ o# e2 ^  D' Q

. K4 {- }3 n& t+ t/ h* |6 J8 b
  1. #define BIT_WORD_ADDR(IN_ADDR,BIT)      *(__IO uint32_t*)((IN_ADDR&0xF0000000|0x02000000) +\
    % x. J) \/ e4 _) s5 t; t- L
  2.                                                             ((IN_ADDR&0x000FFFFF)<<5) +\
    5 P* r: M2 V) A( V2 G5 C2 y* {" g
  3.                                                              (BIT<<2))
    ( u5 E9 s+ J- z0 m; F- g

  4. 8 @( J7 i5 p* ?* \
  5. //GPIO_OUT
    , s, W. c4 c! R, p
  6. #define BPA_OUT(BIT)  BIT_WORD_ADDR((GPIOA_BASE+0x0C),BIT)) c6 d6 T, \0 C( ]
  7. #define BPB_OUT(BIT)  BIT_WORD_ADDR((GPIOB_BASE+0x0C),BIT)
    1 e8 W1 T" ?+ _( W2 o" i; k/ Z
  8. #define BPC_OUT(BIT)  BIT_WORD_ADDR((GPIOC_BASE+0x0C),BIT)
    5 N( g0 {: P  h! h7 l
  9. #define BPD_OUT(BIT)  BIT_WORD_ADDR((GPIOD_BASE+0x0C),BIT)" Z; T1 |! q; U4 I( ^1 t
  10. #define BPE_OUT(BIT)  BIT_WORD_ADDR((GPIOE_BASE+0x0C),BIT)0 N9 ?6 r4 R* z: |4 ]+ [, c' H8 k
  11. #define BPF_OUT(BIT)  BIT_WORD_ADDR((GPIOF_BASE+0x0C),BIT): H  O- i$ i2 c3 l8 l" s- z! Y
  12. #define BPG_OUT(BIT)  BIT_WORD_ADDR((GPIOG_BASE+0x0C),BIT): A% X& U# g( }5 Q6 s
  13. //GPIO_IN( \1 f- w+ l& G, q, Y6 t5 |5 A3 E
  14. #define BPA_IN(BIT)  BIT_WORD_ADDR((GPIOA_BASE+0x08),BIT)3 K: O; P# p9 f9 T, N
  15. #define BPB_IN(BIT)  BIT_WORD_ADDR((GPIOB_BASE+0x08),BIT)
    & b; Y; w9 D) a$ q9 A' f3 z
  16. #define BPC_IN(BIT)  BIT_WORD_ADDR((GPIOC_BASE+0x08),BIT)
    & T& S. p& g" |  ?2 X" V' I9 w) b
  17. #define BPD_IN(BIT)  BIT_WORD_ADDR((GPIOD_BASE+0x08),BIT)
    8 I/ U0 y* u( u: d- u# l6 I
  18. #define BPE_IN(BIT)  BIT_WORD_ADDR((GPIOE_BASE+0x08),BIT)
      X( d5 O- y6 h* z7 G$ T
  19. #define BPF_IN(BIT)  BIT_WORD_ADDR((GPIOF_BASE+0x08),BIT)
    9 s2 W1 f, x( v- V' \
  20. #define BPG_IN(BIT)  BIT_WORD_ADDR((GPIOG_BASE+0x08),BIT)
复制代码

$ |7 p5 u, k) z9 n9 K$ V& D6. 实验结果
) Y  a/ ]/ z: }% `, K( J       按键按下后,LED灯亮;8 p; z% G9 u' A1 L/ d
3 y: i$ `( t' [1 l1 W' |) V
       按键松开后,LED灯灭。
' `( s0 h% A- w5 c, C5 n  i6 ]
/ h! h# T" [' k* _( @0 h5 I3 `5 O# }' U

0 z6 M0 e) t* Q- N3 z
* G0 I7 j! a) _2 H) ?2 y" P
收藏 评论0 发布时间:2021-11-30 21:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版