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

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

[复制链接]
STMCU小助手 发布时间:2021-11-30 21:00
位带操作也叫原子操作,也称别名。起作用直接进行位带操作,即直接读取寄存器的X位,或直接写寄存器的X位。- u$ h4 x+ b/ P) p- j
       STM32的寄存器为32位的,在写入寄存器的x位中,通常操作为;排除寄存器除x外的其它位,在进行赋值。而位带操作可直接写寄存器的x位,使位操作更为便捷。
8 j4 O# \9 Y  {1 @3 w5 C) i5 p+ m7 R7 i5 @
1. 实验内容及步骤:
# [2 U' s- K7 [6 c, S8 \9 P, _& [实验内容:
  b' O& A6 h) L' X0 S' e9 a1 B( I6 j" J( H7 @$ A) n/ Z( W
       通过位带操作实现LED灯的翻转,和按键的读取。8 l$ T/ O- F9 g! E! c' _
7 q$ c3 I; |5 `" @+ v9 U( R1 q
       按键按下时,LED亮,松开按键时,LED灭;
- ~) Y" H+ d( ]6 C7 M+ ]4 S4 z
' r+ w9 {' Y+ D1 c( N: s" T/ E3 I步骤:# Y4 _' B% x) |
) W8 c0 [$ P% o: Y/ ]0 ^
       根据原寄存器地址定位位带地址;- I6 Q6 \, \1 l# [

# t8 i4 N& |" f4 g+ B  S2. 硬件说明8 Z- M# p8 [5 S* u1 j3 y
, ^; D6 o! s+ K! w9 [# T' s
20210617101338928.png
9 x- F) B0 J+ @. m4 J
3 L* s6 O  C* P7 F3 |2 k
20210617101343678.png

* ^; ?. T: t' {1 O; M3 B  s+ r' o4 a
' k5 P; b7 Y( {: q+ k; f( k
       按键与PE4相连接,按下时低电平(所以GPIOE4应该配置为上拉输入,按下:低电平;松开:高电平)* b! W, T9 J) I
/ |7 k- e3 j7 ?5 I2 T
       LED与PB5相连,另一端接VCC,(所以GPIOB5应该配置为推挽输出,亮:低电平;灭:高电平)
8 D7 R( y  {0 U& Q! r3 G
; B7 O! M3 U. r3. 位带操作原理  e/ z& b" k( G+ _5 q& \
       STM32F1内部是有两个位带区的,如下图所示。
- X1 G) \5 v, `8 u/ C( y" J! H0 ]' E/ @  i/ E1 M. |! y1 Q4 [/ k
20210617105544116.png

6 v* E. q+ ~. I+ e
, X+ m; |( m1 `# Q, o( H- A     位带操作分别有片上外设和片上SRAM。我们用的比较多的通常是片上外设的位带操作,一般用来控制GPIO的反转和读取。
; m5 d2 _, c, r- Y  `- V; d& S2 `2 P& _3 E4 u3 c& I

$ L- u9 z& m& O) x) e
9 q/ m7 v2 l( M( b0 V- y5 M其膨胀对应关系图如下图所示,以SRAM位带操作位例,0x2000 0000地址的第一位,映射到0x2200 0000地址。其用法如下所示:6 u$ W9 y) ~  |1 r4 p& I1 D
+ t+ I& a+ b$ y
       当0x2200 0000的内容=1时 => 0x2000 0000的内容=0x01
" G) _( \+ d. Z0 j
; t! ?% w. ?( G- ]$ ]' R       当0x2200 0000的内容=0时 => 0x2000 0000的内容=0x000 ^! }5 s3 U- K4 ~" k# n

' u$ Z4 K& [3 ~8 }3 k4 ]& ]       ……………4 Z. s  _6 |& S* G7 j

  Z+ s* `  `* l+ k9 v       当0x2200 0018的内容=1时 => 0x2000 0000的内容=0x40=(二进制)0100 0000
( Y# b  l$ B' ~6 J- U1 A+ z2 i1 U  `  h; D
       当0x2200 0018的内容=0时 => 0x2000 0000的内容=0x00/ ?4 I) S5 N6 a; |2 @6 k
+ `1 W" e4 q5 y% s1 z
20210617140221772.png
4 v4 k- b4 C" A- P% T6 m  _
( b3 O. b* c7 w* [' M" ^" J
4. 寄存器说明
8 u4 P$ `# K, u: X       位带映射地址如下图所示。(中文STM32参考手册P29)3 A) }- z- E% r5 g) L; ?: c6 S
1 A3 U* `5 W* m4 X
20210617101442958.png
" Z8 g) M7 u0 _* _  m7 j

' H4 {9 s) p7 L4 j       位带操作的例子如下图所示(CM3权威指南CnR2)
* L2 S2 G! u. {7 r
! V( F  e7 D% J8 g  A
20210617101509429.png
$ N4 u: \- M% i+ x7 d

! t( }) N6 b# y# `6 F: ]: u& t8 H       根据例子可写成通用的式子。$ ]2 c7 n% G& C1 C0 W

  a6 z/ q" U. I" W# T8 c! v       bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ (IN_ADDR_BASR&0x000FFFFF)*32+Bit*4
4 a% ~( \& ?- u1 C& h$ [- S; k5 G' d) z6 M  z2 H& k8 q" A
       => 8 U- j" }  h& |
: N* Z" J& U0 \5 z1 r2 v
       bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ ((IN_ADDR_BASR&0x000FFFFF)<<5)+(Bit<<2)" B# d: g* X9 c  z- C) K
% m4 @/ r# g* g! f8 U* V% o3 j; |
       如要控制LED灯(PB5)
; {3 R* n1 g* Q4 \+ P+ Y! W" k+ t" u  }5 X2 t8 i- w# j" B/ w& T
       IN_ADDR_BASR = GPIOB的输出寄存器 = 0X4001 0C00 + 0x0C;  v7 f5 U- s& T* k
! S1 j& |! d9 B/ P6 d" X( c4 Q; T( d) c
       Bit = 5
0 A/ N5 s% I) y( j/ @4 o5 M  v, I* X1 e* M: W6 B8 ~3 e) \
5. 程序设计
8 X  j; X8 l% @4 {2 L& a       代码班的通用位带操作地址转换宏定义如下:$ v5 r  m' m; S; A& J
  1. #define BIT_WORD_ADDR(IN_ADDR,BIT) *(__IO uint32_t*)((IN_ADDR&0xF0000000|0x02000000) +((IN_ADDR&0x000FFFFF)<<5) + (BIT<<2))
复制代码
5 a9 w' t% i+ w. ~/ @. |* ^
       GPIO的输出位带宏定义如下定义
& {$ b* W5 _* T$ T- L7 K. l- z
  1.         #define BPB_OUT(BIT)  BIT_WORD_ADDR((GPIOA_BASE+0x0C),BIT)   
复制代码
BIT为要操作的位。
- D( d2 q& X, ?* E       在本实验中要操作LED(PB5),因此BIT=5;' s) |0 G1 ~  \& u- ?2 F
1 ]. u- H# }9 I/ l8 D1 p
       GPIO的输入位带宏定义如下定义: _, v1 m/ y" o, t7 o

; Q3 E6 {& b. L- X7 e  b! t- b6 h        #define BPE_IN(BIT)  BIT_WORD_ADDR((GPIOE_BASE+0x08),BIT)
4 |# o& `$ L: l/ v$ b7 M+ f       BIT为要操作的位。
$ C; g% }5 k' g" D: k7 M% m( U% x/ p# A2 B# V; J, C
在本实验中要读取按键(PE4)的值,因此BIT=4;- |( T' ^( D- ]7 t- A& ]
, K7 Q( h+ s# G5 I

1 }" @" l& E/ c8 z2 U' y. Y6 k9 U1 M+ \, `
位带操作源码:
$ m& q" |* M2 O
& f( d$ d- `: [5 ~源码筛选了关键部分,详细看源码。
4 e% X0 Q. U; M1 |; N: S
+ S  H3 G% `+ z( P# |
  1. #define BIT_WORD_ADDR(IN_ADDR,BIT)      *(__IO uint32_t*)((IN_ADDR&0xF0000000|0x02000000) +\
    - i/ R) A. c; j4 I
  2.                                                             ((IN_ADDR&0x000FFFFF)<<5) +\- N/ K) m" S) \( K* f1 R
  3.                                                              (BIT<<2))9 X0 i+ J  {& Q# p' ]8 C7 P* l
  4. 2 g; ]1 ?4 o' P$ M; ^7 P  W# ?
  5. //GPIO_OUT
    & y- t( y1 b1 H
  6. #define BPA_OUT(BIT)  BIT_WORD_ADDR((GPIOA_BASE+0x0C),BIT)
    * c" |/ w( X: r
  7. #define BPB_OUT(BIT)  BIT_WORD_ADDR((GPIOB_BASE+0x0C),BIT)$ s( R, `2 o/ T  L) o
  8. #define BPC_OUT(BIT)  BIT_WORD_ADDR((GPIOC_BASE+0x0C),BIT)2 S% p" Q5 a1 f! j& w
  9. #define BPD_OUT(BIT)  BIT_WORD_ADDR((GPIOD_BASE+0x0C),BIT)
    7 [6 J4 R" S! y  e2 {* |
  10. #define BPE_OUT(BIT)  BIT_WORD_ADDR((GPIOE_BASE+0x0C),BIT)
    + Z8 ^& W; Y. t% d4 W: a# P" i
  11. #define BPF_OUT(BIT)  BIT_WORD_ADDR((GPIOF_BASE+0x0C),BIT)
    . f; h* K: G+ O& H/ P/ D; L( s
  12. #define BPG_OUT(BIT)  BIT_WORD_ADDR((GPIOG_BASE+0x0C),BIT)8 q; j+ G* b( o. e% X! T' `
  13. //GPIO_IN. A0 s* C& P4 S) A, D
  14. #define BPA_IN(BIT)  BIT_WORD_ADDR((GPIOA_BASE+0x08),BIT)1 S1 w: M1 R/ t! C3 r' U* C. v" W5 n
  15. #define BPB_IN(BIT)  BIT_WORD_ADDR((GPIOB_BASE+0x08),BIT)
    6 a( r7 p' I, ~. U
  16. #define BPC_IN(BIT)  BIT_WORD_ADDR((GPIOC_BASE+0x08),BIT)& N- V/ t: ^8 Q4 ]
  17. #define BPD_IN(BIT)  BIT_WORD_ADDR((GPIOD_BASE+0x08),BIT)
    7 l: Q( ]  t8 t$ t. y
  18. #define BPE_IN(BIT)  BIT_WORD_ADDR((GPIOE_BASE+0x08),BIT)
    + t& B$ }7 x2 A) s% d
  19. #define BPF_IN(BIT)  BIT_WORD_ADDR((GPIOF_BASE+0x08),BIT)
    % y4 K2 V9 M1 o2 P2 M' Q
  20. #define BPG_IN(BIT)  BIT_WORD_ADDR((GPIOG_BASE+0x08),BIT)
复制代码

6 R, r+ O3 c; f6. 实验结果/ I6 Z) X8 f4 S; w
       按键按下后,LED灯亮;7 d: P5 l5 m  ?
! e0 A" o1 ?; Z% p# x; I5 u
       按键松开后,LED灯灭。+ r" ?# S) h. M$ Q
" h4 ~0 C* Z/ V" \  p: I
( |! E7 }1 r( {1 R$ q8 r, p

$ F+ `: B/ l  F+ P1 l8 k/ Q
% O  T, v1 ]& {3 a/ e7 p- r- c
收藏 评论0 发布时间:2021-11-30 21:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版