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

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

[复制链接]
STMCU小助手 发布时间:2021-11-30 21:00
位带操作也叫原子操作,也称别名。起作用直接进行位带操作,即直接读取寄存器的X位,或直接写寄存器的X位。
1 m% J7 n6 o  \  m9 `       STM32的寄存器为32位的,在写入寄存器的x位中,通常操作为;排除寄存器除x外的其它位,在进行赋值。而位带操作可直接写寄存器的x位,使位操作更为便捷。' J2 L5 H/ ~+ x8 q7 Z

( z: `  A- j- p+ C# j& i8 s1. 实验内容及步骤:1 L/ h7 Y2 A5 U  O* V
实验内容:6 q$ x& y( F3 d0 N

  e* p4 i" |" ^8 Q& J       通过位带操作实现LED灯的翻转,和按键的读取。& {( C# V# G4 A9 _# D3 a5 N' @* |5 Q
# o3 _) V7 G. v
       按键按下时,LED亮,松开按键时,LED灭;
1 `; K" r% z0 e6 ?  V- @
; q& w; \; W4 |+ n7 A' }; K& {0 t# m& L步骤:
3 S, M1 }* Z5 {
8 i1 r0 H/ E3 f" Y       根据原寄存器地址定位位带地址;
: v5 S  p, x7 j. p! \- I0 t# i2 o% S7 G/ g
2. 硬件说明
3 o7 }! R+ C- Z/ n  l' x- C0 O
) |* r5 N* P) r. v5 z3 Q% E
20210617101338928.png
. Q" F3 O* E) Y7 e
7 `) x" I. V7 G6 E0 k; f- G0 V& T
20210617101343678.png

4 k& m* g" }- F7 Z6 u% F
* i! |4 x8 X6 a5 F4 @3 M9 p$ v) A$ [$ O7 j
       按键与PE4相连接,按下时低电平(所以GPIOE4应该配置为上拉输入,按下:低电平;松开:高电平). `$ h& ^1 g. G/ h

& Q: C' x* |2 d1 V7 g# y: N       LED与PB5相连,另一端接VCC,(所以GPIOB5应该配置为推挽输出,亮:低电平;灭:高电平): l4 ^1 N$ t2 j1 F

  C5 d) X, y% g& C* H3. 位带操作原理
; ^9 Q9 n. H1 B9 \6 A       STM32F1内部是有两个位带区的,如下图所示。
7 r6 m& [$ g' v1 X) H2 [$ _3 _5 L( u' i! G! f- P
20210617105544116.png
0 q2 n* @( b: x+ U# W. @1 s# u
/ I  q6 f2 ~' n7 \# }
     位带操作分别有片上外设和片上SRAM。我们用的比较多的通常是片上外设的位带操作,一般用来控制GPIO的反转和读取。 3 O. N- U$ A* E
7 p, z2 T. b* @6 f6 q4 c. [; ?5 m
0 s. t) Y5 e9 v

. _" I# H5 a' `5 `* z. {7 [5 C其膨胀对应关系图如下图所示,以SRAM位带操作位例,0x2000 0000地址的第一位,映射到0x2200 0000地址。其用法如下所示:0 D+ R% B+ n0 P9 B& O

' }% v2 a! |; }  W1 W7 P       当0x2200 0000的内容=1时 => 0x2000 0000的内容=0x01' W4 b1 A& c3 v# o) p  s( p/ w% A. O; k

. }, b$ |0 b% d  N& Y. f       当0x2200 0000的内容=0时 => 0x2000 0000的内容=0x009 ?3 S5 @) {8 H
' q0 m( w" N# c' ^# |
       ……………
. L/ M" |3 ?" x$ O" G2 T8 ^5 c; A2 j' s  |  `' u) h4 P
       当0x2200 0018的内容=1时 => 0x2000 0000的内容=0x40=(二进制)0100 0000- U+ p. c$ Y, m& T3 J; ^# b

( H( W/ ]! I( y5 F% ]: l       当0x2200 0018的内容=0时 => 0x2000 0000的内容=0x00( j4 {, f5 p: j5 e
3 J) p" ~% I: s3 m8 R. l# r) D" j  A9 Z
20210617140221772.png

' `9 S/ u  u, p. p6 ~" F: \' ?4 w+ \! \: t
4. 寄存器说明. u3 K, `0 I% k
       位带映射地址如下图所示。(中文STM32参考手册P29)# f9 G' ?( J. u5 B5 A

8 m# E) o8 f1 Y, }
20210617101442958.png
5 W) Q/ g( J& U6 K2 B

, h4 t" _: K* f$ _" R       位带操作的例子如下图所示(CM3权威指南CnR2)4 }" O: W4 c1 ]8 e3 B
1 o! a/ e) |0 w# {
20210617101509429.png

9 d) v: h4 `) o
- W% d+ `* `" [2 O6 e8 b       根据例子可写成通用的式子。
6 I( c8 ?2 l% ~9 b5 ^+ s
% ?0 @6 _  y7 T       bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ (IN_ADDR_BASR&0x000FFFFF)*32+Bit*4
; g% Q4 B8 |4 z3 D
7 |5 ~) E% H5 }* l0 F; N6 Z$ t       =>
& [, b0 E) c$ e8 g" y. I+ C6 q1 m. f: r
       bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ ((IN_ADDR_BASR&0x000FFFFF)<<5)+(Bit<<2)) c+ ^! i8 K" n. ]' V

# `5 l2 q! Q' F, t% V" ]       如要控制LED灯(PB5)
1 ~/ [9 l4 V  p% Z8 ?: Z. g" b+ m3 q  W, I. I. f
       IN_ADDR_BASR = GPIOB的输出寄存器 = 0X4001 0C00 + 0x0C;
2 P7 |! ~: O& c1 m! @: M6 B4 z" U# ^4 Z. {8 B" r
       Bit = 5
- b) F* f' ?9 a( b/ U) \3 c5 ?  I* U  r% Z6 e9 e, z
5. 程序设计
5 U! q% _: ]8 K) }0 |8 ^2 Y       代码班的通用位带操作地址转换宏定义如下:
) C! v6 |8 ]) B" ?
  1. #define BIT_WORD_ADDR(IN_ADDR,BIT) *(__IO uint32_t*)((IN_ADDR&0xF0000000|0x02000000) +((IN_ADDR&0x000FFFFF)<<5) + (BIT<<2))
复制代码
; V3 ]. Z  f( c; X
       GPIO的输出位带宏定义如下定义" A) r# n  I7 E  h) v$ V% Q
  1.         #define BPB_OUT(BIT)  BIT_WORD_ADDR((GPIOA_BASE+0x0C),BIT)   
复制代码
BIT为要操作的位。
' E8 [. p$ @3 r; }; W       在本实验中要操作LED(PB5),因此BIT=5;  R, S: c; N! O  H3 j1 m

+ b) O9 J8 A6 v- n3 H, D+ \& R2 B. `       GPIO的输入位带宏定义如下定义* U6 s' W& V; D" }3 P- N; E, Y# w

+ D1 Q4 z/ A7 _) B        #define BPE_IN(BIT)  BIT_WORD_ADDR((GPIOE_BASE+0x08),BIT)
  T, w  O7 F6 f       BIT为要操作的位。
' k! j' F+ `$ b3 E4 e0 f% G) D! C+ Z2 \# Y4 k, a
在本实验中要读取按键(PE4)的值,因此BIT=4;
- V" q2 g) F3 F" ]
7 E# ]* N8 n/ Y6 q" _. p& o2 V, a& y1 m6 N$ i! `

$ r+ m: A& q$ }" R5 P位带操作源码:
0 k' Q3 V& L" y5 n* ]7 ^& }
% `+ U* C( |- m2 b源码筛选了关键部分,详细看源码。- f  E) ~# r& T1 W, F
$ d1 {2 ]! j3 t! q2 O) [% w; J
  1. #define BIT_WORD_ADDR(IN_ADDR,BIT)      *(__IO uint32_t*)((IN_ADDR&0xF0000000|0x02000000) +\9 Y' s' {4 @5 \: r. a
  2.                                                             ((IN_ADDR&0x000FFFFF)<<5) +\6 K' m. P1 v! `2 L, |2 V: \
  3.                                                              (BIT<<2))
    8 E/ C/ E+ h8 M4 ]- o/ a
  4. $ ]% Y: a+ t1 H; L
  5. //GPIO_OUT
    0 ?/ d# v: q& Q2 w/ D/ R4 H9 [
  6. #define BPA_OUT(BIT)  BIT_WORD_ADDR((GPIOA_BASE+0x0C),BIT)1 S, y( u- a8 G; ]/ i
  7. #define BPB_OUT(BIT)  BIT_WORD_ADDR((GPIOB_BASE+0x0C),BIT)+ a5 O- [! R( }0 S+ }
  8. #define BPC_OUT(BIT)  BIT_WORD_ADDR((GPIOC_BASE+0x0C),BIT)
    & r# v" ]8 _. {9 [& e7 q
  9. #define BPD_OUT(BIT)  BIT_WORD_ADDR((GPIOD_BASE+0x0C),BIT)
    : f5 s/ g7 N# y+ o6 A% |0 i' d$ N
  10. #define BPE_OUT(BIT)  BIT_WORD_ADDR((GPIOE_BASE+0x0C),BIT)" R  h, J5 f' q: b- V6 ~; h% @
  11. #define BPF_OUT(BIT)  BIT_WORD_ADDR((GPIOF_BASE+0x0C),BIT)9 u* b6 p& T' a  N! [" t9 z
  12. #define BPG_OUT(BIT)  BIT_WORD_ADDR((GPIOG_BASE+0x0C),BIT)+ z' X" z5 V/ W# h+ c
  13. //GPIO_IN
    5 n+ b4 p6 U  Y6 o, Q7 p
  14. #define BPA_IN(BIT)  BIT_WORD_ADDR((GPIOA_BASE+0x08),BIT)
    ! d* M. [$ }% T: X* l: Y
  15. #define BPB_IN(BIT)  BIT_WORD_ADDR((GPIOB_BASE+0x08),BIT)
    8 D7 l: G2 [8 o- O! p
  16. #define BPC_IN(BIT)  BIT_WORD_ADDR((GPIOC_BASE+0x08),BIT)1 J# S/ J+ R' ]! C+ L% o
  17. #define BPD_IN(BIT)  BIT_WORD_ADDR((GPIOD_BASE+0x08),BIT)
    " d. a% x6 g& n
  18. #define BPE_IN(BIT)  BIT_WORD_ADDR((GPIOE_BASE+0x08),BIT); E7 V/ g" s  f/ A7 A$ n
  19. #define BPF_IN(BIT)  BIT_WORD_ADDR((GPIOF_BASE+0x08),BIT)
    - n/ d/ q3 s" n3 t- T5 N( c( E
  20. #define BPG_IN(BIT)  BIT_WORD_ADDR((GPIOG_BASE+0x08),BIT)
复制代码

% p; c+ ~: g+ D% ]6. 实验结果
* {; X" d6 B" e% x* A       按键按下后,LED灯亮;
: _4 ^$ ~7 V7 q: \! |
) i$ Q; @3 N- Z       按键松开后,LED灯灭。5 Q9 R  N! I. j% W
7 J  k2 a$ X2 H3 C
3 x( G6 L+ I4 V! i
& a$ {! ~0 O6 t
; F2 s) \. C- O1 a4 c% {) i2 m
收藏 评论0 发布时间:2021-11-30 21:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版