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

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

[复制链接]
STMCU小助手 发布时间:2021-11-30 21:00
位带操作也叫原子操作,也称别名。起作用直接进行位带操作,即直接读取寄存器的X位,或直接写寄存器的X位。
0 U# U2 x( L* B7 M4 i; I4 d: {0 c       STM32的寄存器为32位的,在写入寄存器的x位中,通常操作为;排除寄存器除x外的其它位,在进行赋值。而位带操作可直接写寄存器的x位,使位操作更为便捷。
: Z+ c# f* a' H- l, m5 j# f
! Z; p) D5 P+ V0 w1. 实验内容及步骤:& t" |* l- T5 n- j( e# [+ @5 Q1 \
实验内容:
+ a* B2 n$ ~2 s1 D" c# L1 Y# U
. s+ w8 h  E& T9 O" v$ e/ M       通过位带操作实现LED灯的翻转,和按键的读取。5 M2 }+ _4 m9 L, D4 d

) N) ?5 B: [6 c0 N       按键按下时,LED亮,松开按键时,LED灭;
' [+ |* e$ e4 X# `
) U, n- Z3 S0 T# O; n" }9 b$ D+ S1 _步骤:
3 U) \. `: g; G# x
( A1 ]% D4 l% ]2 M* b* u) r       根据原寄存器地址定位位带地址;
& I* h  q1 _& A
  z7 K# i; V* v1 n2. 硬件说明* e1 N0 j2 s0 i9 O0 G
1 g  E' `! ?+ [3 G
20210617101338928.png

6 H6 O, |- E3 m# q( p' P. j: b' B  B6 i" M* U
20210617101343678.png

6 f, P3 g5 E1 ]3 i) l2 X
' T: h8 p5 _5 K( [! R$ f% i- t1 o# V5 a/ B! x1 ^9 A
       按键与PE4相连接,按下时低电平(所以GPIOE4应该配置为上拉输入,按下:低电平;松开:高电平)0 f# g, Q$ l6 U4 d5 }

) v. D1 Z3 \" i9 x# Z       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内部是有两个位带区的,如下图所示。
+ E; v5 S& k9 c* ?) q/ N6 {/ k: N" X/ m: d
20210617105544116.png

) U9 [1 r9 r( U4 _! d- G3 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

" X) W6 [) L# m9 h; c  G9 H其膨胀对应关系图如下图所示,以SRAM位带操作位例,0x2000 0000地址的第一位,映射到0x2200 0000地址。其用法如下所示:
6 \2 B: L% c) Z4 R
. {+ \3 ]' K2 J4 T5 A) j       当0x2200 0000的内容=1时 => 0x2000 0000的内容=0x012 L8 Z! ^2 O8 M9 y" @/ e$ T

. a: h) j$ U! x9 l       当0x2200 0000的内容=0时 => 0x2000 0000的内容=0x002 V* }+ F; y1 @/ Q) p

9 D# P3 r; T4 l* O       ……………
5 @* c, C1 b* L/ f
7 o7 Y# Q3 M6 ~% a# Q       当0x2200 0018的内容=1时 => 0x2000 0000的内容=0x40=(二进制)0100 0000
: f) Q. ]6 H1 H: `2 Y. }& B
0 h: j/ e' A, {  @! ^       当0x2200 0018的内容=0时 => 0x2000 0000的内容=0x003 R, _9 W4 {$ S' R( [, j
9 V) D. o) _, g' `( U  D
20210617140221772.png
+ G$ g3 S1 l9 h
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
20210617101442958.png
( ^. Z, b5 g" n% a3 s

& ^) y- Q$ l. {) P5 A  ]9 A( U       位带操作的例子如下图所示(CM3权威指南CnR2)6 ~6 W+ T  ~8 s

, T& _: }- e7 ~% u* ]/ V
20210617101509429.png
, J0 r+ A+ K2 g

8 [9 S1 _% ?$ _7 w9 X       根据例子可写成通用的式子。
# `4 Y5 V/ u2 U! y9 u. 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

: a' Z1 _' Y; K/ v8 F4 ?1 _5 e- \       =>
8 Y7 }( }2 l8 C* `
8 e# [3 w- }  c       bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ ((IN_ADDR_BASR&0x000FFFFF)<<5)+(Bit<<2)
; k$ D, \  J/ q+ O7 p9 }( e& @4 E
5 I" x6 N7 Z1 d- H% e- w       如要控制LED灯(PB5)
/ Y' P! R2 {: T) |- P0 H3 a! ~: E
! e8 i7 [. \$ V6 c  i; e! M       IN_ADDR_BASR = GPIOB的输出寄存器 = 0X4001 0C00 + 0x0C;
6 l& g5 k) v6 H! D+ L  L# f. X; b3 `9 K$ \( T9 @( X( a: y
       Bit = 58 l3 d* u: j% i0 N8 G0 T

, x# J: ?# c1 p7 j# c' K0 i8 o5. 程序设计
( |: ?, R, J1 Y( s       代码班的通用位带操作地址转换宏定义如下:
  j1 h; o# _( z5 J
  1. #define BIT_WORD_ADDR(IN_ADDR,BIT) *(__IO uint32_t*)((IN_ADDR&0xF0000000|0x02000000) +((IN_ADDR&0x000FFFFF)<<5) + (BIT<<2))
复制代码
/ @7 L) F( L4 z; m9 w- w% k  ?, }
       GPIO的输出位带宏定义如下定义4 Q+ P# h/ Z$ j$ `3 [4 q$ j3 e0 x( g
  1.         #define BPB_OUT(BIT)  BIT_WORD_ADDR((GPIOA_BASE+0x0C),BIT)   
复制代码
BIT为要操作的位。# d% L+ B( |5 B5 h
       在本实验中要操作LED(PB5),因此BIT=5;
0 O3 h! P7 j4 c) Z0 S5 j# z  p8 p; `8 w
       GPIO的输入位带宏定义如下定义
- {) h2 t/ u& j0 L' A) d$ j! h6 I/ H7 r) a4 z- U& u
        #define BPE_IN(BIT)  BIT_WORD_ADDR((GPIOE_BASE+0x08),BIT)
( j2 i- F6 G# q5 j1 }       BIT为要操作的位。4 m5 S/ R5 Z, W) \

0 t* [% T1 |2 q, x9 H在本实验中要读取按键(PE4)的值,因此BIT=4;
' u2 I% R8 L7 b6 G! \& l' A/ d8 ?# G  ~! M/ U  e# j' [0 Y
* h) s( _7 U3 V9 R
- D$ h1 F# h' _' c$ z
位带操作源码:
" z  U- H7 k& i" V0 v+ I8 t9 O+ X2 V7 K6 _" f
源码筛选了关键部分,详细看源码。
  m# K  s- a4 c- H/ O7 E+ j# T" x1 ~: a, B& P8 W
  1. #define BIT_WORD_ADDR(IN_ADDR,BIT)      *(__IO uint32_t*)((IN_ADDR&0xF0000000|0x02000000) +\
    ' t/ x0 L2 N2 E: @. y6 Y, Q
  2.                                                             ((IN_ADDR&0x000FFFFF)<<5) +\
    & _9 y0 i- M5 c0 h) }* b7 E
  3.                                                              (BIT<<2)), l7 G  l$ `4 N( D

  4. 7 Y* w( A. |! ]+ T
  5. //GPIO_OUT
    " F, r% m$ j; h( t* h9 w) U; k, @
  6. #define BPA_OUT(BIT)  BIT_WORD_ADDR((GPIOA_BASE+0x0C),BIT)
    " ^, Z* ?7 Z* _5 F! B/ S
  7. #define BPB_OUT(BIT)  BIT_WORD_ADDR((GPIOB_BASE+0x0C),BIT)
    & [& [3 B. R  u) A  q
  8. #define BPC_OUT(BIT)  BIT_WORD_ADDR((GPIOC_BASE+0x0C),BIT). v1 g3 p0 K4 i' r+ |
  9. #define BPD_OUT(BIT)  BIT_WORD_ADDR((GPIOD_BASE+0x0C),BIT)
    " {: ~9 Q8 m4 m/ i: C4 v; G0 g
  10. #define BPE_OUT(BIT)  BIT_WORD_ADDR((GPIOE_BASE+0x0C),BIT)4 ]$ ~3 n) f) d5 r9 D4 t
  11. #define BPF_OUT(BIT)  BIT_WORD_ADDR((GPIOF_BASE+0x0C),BIT)9 y4 ^; y* Y4 U! X
  12. #define BPG_OUT(BIT)  BIT_WORD_ADDR((GPIOG_BASE+0x0C),BIT)2 O8 v4 M7 N$ r0 v
  13. //GPIO_IN
    ' _) ^( y1 x% g3 X+ h& B
  14. #define BPA_IN(BIT)  BIT_WORD_ADDR((GPIOA_BASE+0x08),BIT)
    9 m  @) ^. K0 E6 T( x
  15. #define BPB_IN(BIT)  BIT_WORD_ADDR((GPIOB_BASE+0x08),BIT): M4 V  \& L3 p; {
  16. #define BPC_IN(BIT)  BIT_WORD_ADDR((GPIOC_BASE+0x08),BIT); ]1 j3 I8 l# P/ c* w2 x7 G: W& f
  17. #define BPD_IN(BIT)  BIT_WORD_ADDR((GPIOD_BASE+0x08),BIT)' O% n6 ?3 M" r) Z1 W5 A3 s: b. ]
  18. #define BPE_IN(BIT)  BIT_WORD_ADDR((GPIOE_BASE+0x08),BIT)% z( b- P0 T0 ?0 g( {
  19. #define BPF_IN(BIT)  BIT_WORD_ADDR((GPIOF_BASE+0x08),BIT)
    ' p/ F# L! g# [
  20. #define BPG_IN(BIT)  BIT_WORD_ADDR((GPIOG_BASE+0x08),BIT)
复制代码
- R3 G: @) `) X& O6 Q) y$ L* B  Y8 ?
6. 实验结果7 }8 d; w; z& k7 _* |
       按键按下后,LED灯亮;
4 c2 Y& d  ^2 ]* Q! H- H3 Z% U+ Z0 c3 B3 k
       按键松开后,LED灯灭。, z' e, v( s' i' w% l8 Y9 U

7 Q2 x, ?# l- e; k5 ~
5 n6 V! P+ W- A3 k" J$ y. t
- |% ]! o) U4 y' c  r; J9 W) @
) g: I& }) P# X
赞 收藏 评论0 发布时间:2021-11-30 21:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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