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

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

[复制链接]
STMCU小助手 发布时间:2021-11-30 21:00
位带操作也叫原子操作,也称别名。起作用直接进行位带操作,即直接读取寄存器的X位,或直接写寄存器的X位。
5 G, X9 }! M) ?7 k6 x# T* ?       STM32的寄存器为32位的,在写入寄存器的x位中,通常操作为;排除寄存器除x外的其它位,在进行赋值。而位带操作可直接写寄存器的x位,使位操作更为便捷。
# W0 O0 V8 Z9 j3 J- B1 U# \1 ^7 G6 c2 a# @6 X6 E- R
1. 实验内容及步骤:7 P; ^0 k# w2 u
实验内容:6 j: D0 Y5 E) H) Y8 e1 a% X
+ j- L2 M% b8 ~& W8 {
       通过位带操作实现LED灯的翻转,和按键的读取。* d/ E9 a/ k' ]' K+ [  u7 A8 |. Q
+ {. B4 F6 @2 Z/ s; A
       按键按下时,LED亮,松开按键时,LED灭;
! V* N$ p2 r+ A5 K/ d1 E$ A# S& t* i- j$ y
步骤:
& k# v( {1 B8 S0 [/ y
0 }4 ]1 ?. ~. v5 v6 R       根据原寄存器地址定位位带地址;4 D. j0 p: M7 C* x0 I& u+ N
$ \* h9 E7 Q+ J
2. 硬件说明# M3 ^% G1 L0 Q+ h

" `5 _2 `& Y* T; b2 ^
20210617101338928.png

4 z9 ?" u8 T) a/ T: l2 p' O$ i7 a3 H+ M0 [  s7 ?" w
20210617101343678.png
; L8 P1 `/ B9 Y! j

6 x3 E4 g$ m0 d5 u3 D% i, }8 g1 \+ K, o! `
       按键与PE4相连接,按下时低电平(所以GPIOE4应该配置为上拉输入,按下:低电平;松开:高电平)
6 I9 r9 L( ~8 X7 H7 }! p4 o5 p- M( g! B9 G1 W( v
       LED与PB5相连,另一端接VCC,(所以GPIOB5应该配置为推挽输出,亮:低电平;灭:高电平)  Y. K& e! u) a

8 g# w+ N( y5 k* Z) v. Q3. 位带操作原理9 \$ g6 \9 c9 |( s
       STM32F1内部是有两个位带区的,如下图所示。
3 R- @& @9 Y( \* [( ?
+ C% E' V' k1 Z- N: V/ W
20210617105544116.png

4 O2 q1 b) e# t. |/ V+ b2 E2 [: Z, Y2 r3 y. x" @! j3 C
     位带操作分别有片上外设和片上SRAM。我们用的比较多的通常是片上外设的位带操作,一般用来控制GPIO的反转和读取。
+ x& R5 w% t$ \; p' E% N5 X7 T* Z- W* N8 `( H
# T$ u  y3 O; V+ Y# J: a& }

$ d0 e( s" N# R/ S, J2 |其膨胀对应关系图如下图所示,以SRAM位带操作位例,0x2000 0000地址的第一位,映射到0x2200 0000地址。其用法如下所示:
2 ]. |$ f9 K' @% X/ h5 V) v. I4 Y: I' l) U: N* p; m, p0 P
       当0x2200 0000的内容=1时 => 0x2000 0000的内容=0x01
6 W& i/ M5 o- T: a! k+ j) ^. h- W5 k5 r+ P: Q
       当0x2200 0000的内容=0时 => 0x2000 0000的内容=0x00% \2 l' A" K0 P: t( l1 s

; l  ~/ ~! m1 J$ x6 h       ……………
" f0 u0 R1 @+ L" s) h- G) j4 M- n8 M- z" t; m3 ~
       当0x2200 0018的内容=1时 => 0x2000 0000的内容=0x40=(二进制)0100 0000# G: ]3 T' w$ g' \

) [' u, D2 Y' g- u! {. V       当0x2200 0018的内容=0时 => 0x2000 0000的内容=0x00
1 Y) W. [+ c) F4 \  M/ ^
2 C1 u- v7 N% H" r! m
20210617140221772.png
, n1 w) ^7 Q0 I; \
9 G! m. r/ Q/ A+ ]+ s3 z( ^
4. 寄存器说明
& B4 S9 M* }' n& A; F: c# @       位带映射地址如下图所示。(中文STM32参考手册P29)
$ o) ?  u0 a; E! Y  j0 S& y& n8 N: d3 p  `% k
20210617101442958.png
$ X$ K# Y- ^$ x9 R8 y

+ L/ K8 z9 [+ J. V* U       位带操作的例子如下图所示(CM3权威指南CnR2)
5 h6 A) _9 \% h5 s4 h' Y3 @, V/ O2 f. H  p9 l# N
20210617101509429.png
/ ^" z+ W9 {; q! @

1 N) l- B7 E: i( v1 f       根据例子可写成通用的式子。6 `- f1 Q+ G  L$ S1 u* k$ [
0 Q" U/ h+ e9 N, D
       bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ (IN_ADDR_BASR&0x000FFFFF)*32+Bit*4) ^3 X: p+ K7 w2 R  \7 A

6 v. H( [) ]6 T# u. j2 y       => 5 [+ B+ c- E/ N  L* B
9 I' [( l0 Z! a5 l; U3 j
       bit_word_addr = (IN_ADDR_BASR&0xF0000000|0x02000000)+ ((IN_ADDR_BASR&0x000FFFFF)<<5)+(Bit<<2)' P( W9 O' D# h, C

4 \& S8 a6 ?$ v( P' Z+ i0 w# i       如要控制LED灯(PB5)
! o1 i; q5 M& m- ^0 d' _: Z6 v
& g* |9 e5 z* o% i" O" e       IN_ADDR_BASR = GPIOB的输出寄存器 = 0X4001 0C00 + 0x0C;
4 m! g2 e! I/ }* K  c4 ]- _
8 P: o5 A  C9 z6 s       Bit = 5
' s- T9 G0 y& W1 m" b# ]  u
3 Z$ M1 H( k& H3 ^" Q0 \5. 程序设计
6 ^% n& u' n% O+ j# p       代码班的通用位带操作地址转换宏定义如下:. {2 Y+ M6 P/ F
  1. #define BIT_WORD_ADDR(IN_ADDR,BIT) *(__IO uint32_t*)((IN_ADDR&0xF0000000|0x02000000) +((IN_ADDR&0x000FFFFF)<<5) + (BIT<<2))
复制代码
( a9 x9 v+ \) x* J7 x: J/ S; h
       GPIO的输出位带宏定义如下定义
. M9 b" p4 U" V
  1.         #define BPB_OUT(BIT)  BIT_WORD_ADDR((GPIOA_BASE+0x0C),BIT)   
复制代码
BIT为要操作的位。4 N% o" f+ [9 C; s* ?1 o/ n+ I2 |
       在本实验中要操作LED(PB5),因此BIT=5;
: D7 Z! T( D! @. B' k1 Z: J: x/ A. a: [1 b1 E- `' L; h+ L
       GPIO的输入位带宏定义如下定义: E* G" M2 v8 r4 @8 S
. S6 K6 C6 i$ N3 K8 g
        #define BPE_IN(BIT)  BIT_WORD_ADDR((GPIOE_BASE+0x08),BIT)
8 P; j/ g  {& B8 Z       BIT为要操作的位。" c, _+ ?1 C+ m
0 A: d- v# ]6 p. P
在本实验中要读取按键(PE4)的值,因此BIT=4;
7 B: g# O4 r/ ]9 h6 l7 h9 Z6 i* _- I: s% X' {/ J0 e, k9 G

  t: A3 A1 y0 O9 A5 E9 c5 S
: C' B/ c' m: {" W, X* G" w位带操作源码:
+ N4 J9 T  S  o. g0 k: N! K0 n# i! P( P% O. n9 b4 P- S$ ?
源码筛选了关键部分,详细看源码。
! P2 \3 D: X  Y2 n$ G8 L; R- l8 a  R3 e
  1. #define BIT_WORD_ADDR(IN_ADDR,BIT)      *(__IO uint32_t*)((IN_ADDR&0xF0000000|0x02000000) +\
    , v% r) ]6 W: N: G
  2.                                                             ((IN_ADDR&0x000FFFFF)<<5) +\
    ) o6 x: {% K# I7 w1 x9 z
  3.                                                              (BIT<<2))* ?+ C/ Y, v& O7 ~) h6 z1 X/ T

  4. 2 p- H6 f$ o9 |* G& X$ K  S) \
  5. //GPIO_OUT5 y2 g4 P4 U1 \! X; B
  6. #define BPA_OUT(BIT)  BIT_WORD_ADDR((GPIOA_BASE+0x0C),BIT)
    % ^/ G# E& y( G7 Q. B0 P
  7. #define BPB_OUT(BIT)  BIT_WORD_ADDR((GPIOB_BASE+0x0C),BIT)- V& ?5 d. d; C7 |" L; P' A
  8. #define BPC_OUT(BIT)  BIT_WORD_ADDR((GPIOC_BASE+0x0C),BIT)8 Z4 J7 }0 x- ]' A* D
  9. #define BPD_OUT(BIT)  BIT_WORD_ADDR((GPIOD_BASE+0x0C),BIT)1 r. q0 @! K# `* ^) A0 x; M2 E/ ~
  10. #define BPE_OUT(BIT)  BIT_WORD_ADDR((GPIOE_BASE+0x0C),BIT)
    & L, ]: |( a. @% [' ~6 X% [
  11. #define BPF_OUT(BIT)  BIT_WORD_ADDR((GPIOF_BASE+0x0C),BIT)6 Q7 {6 F9 e+ y
  12. #define BPG_OUT(BIT)  BIT_WORD_ADDR((GPIOG_BASE+0x0C),BIT)
    : p! Q- {2 [) E- i4 U
  13. //GPIO_IN
    5 {& K' F9 l" D* F0 X& }/ }  S
  14. #define BPA_IN(BIT)  BIT_WORD_ADDR((GPIOA_BASE+0x08),BIT)
    " a# p! Y) f" r+ B  J
  15. #define BPB_IN(BIT)  BIT_WORD_ADDR((GPIOB_BASE+0x08),BIT)0 F6 m5 A* {. d( R
  16. #define BPC_IN(BIT)  BIT_WORD_ADDR((GPIOC_BASE+0x08),BIT)
    1 }$ k* Y4 z7 m* B2 u% a8 z
  17. #define BPD_IN(BIT)  BIT_WORD_ADDR((GPIOD_BASE+0x08),BIT)
    : M3 o; c% f' u3 g( w- C: Z3 Q
  18. #define BPE_IN(BIT)  BIT_WORD_ADDR((GPIOE_BASE+0x08),BIT)& s1 ]' N1 D9 T$ K$ y- F2 l$ G
  19. #define BPF_IN(BIT)  BIT_WORD_ADDR((GPIOF_BASE+0x08),BIT)& H  M8 {5 w. j5 D
  20. #define BPG_IN(BIT)  BIT_WORD_ADDR((GPIOG_BASE+0x08),BIT)
复制代码
9 |/ k% V! @8 ?5 z
6. 实验结果
8 C2 e# ?, B' @% E: q% s' _4 v       按键按下后,LED灯亮;/ }# F! r4 g/ q4 Q/ f6 Y

' e7 K! M; `$ Z% o+ Y8 J) V       按键松开后,LED灯灭。: _% I2 g) c( X- C' V

7 `" U: G, d8 B, Q. a/ L, Q  Q) w; C, N& ]! K% i( U
4 n" m* O8 R! J0 E6 b# y+ [
( B. w/ T3 H7 V6 W1 x5 ^& g
收藏 评论0 发布时间:2021-11-30 21:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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