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

【经验分享】STM32F2位带操作

[复制链接]
STMCU小助手 发布时间:2021-12-1 21:47
手册中说:0 {, w6 f/ n- v0 L; L0 K6 j0 M; l
In the STM32F20x and STM32F21x both the peripheral registers and the SRAM are mapped to a bit-band region, so that single bit-band write and read operations are allowed.
" P6 o, G5 M/ X在这两个系列中外设和SRAM都有各自映射的位带区,以实现对位的单独操作。" p. g% s$ k, V$ a/ k3 i# V
The operations are only available for Cortex ® -M3 accesses, and not from other bus masters (e.g. DMA).
+ H, I, q/ d2 C7 h( I使用局限于M3内核。
- W$ h2 Z/ V) A/ MA mapping formula shows how to reference each word in the alias region to a corresponding bit in the bit-band region. The mapping formula is:
) U8 O8 J4 t  `. I7 {/ n地址映射公式如下
/ g8 C+ ~0 v5 x, ^2 t) p, V                               bit_word_addr  =  bit_band_base  + ( byte_offset  x 32) + ( bit_number  × 4)
8 B) E  ]; S' B8 H3 i! zwhere:
/ z2 d5 k( G. x8 A  m–  bit_word_addr  is the address of the word in the alias memory region that maps to the targeted bit& m' X. I. h/ {& z0 `2 s5 ]
一位扩展成了一个字。2 @9 m$ \$ S/ M) V5 ^
–  bit_band_base  is the starting address of the alias region( \$ O+ y) R0 o( p) k8 k
位带基地址是对应位带的起始地址。/ s) F/ z$ M" m7 s7 n3 `
–  byte_offset  is the number of the byte in the bit-band region that contains the targeted bit
1 G4 I7 M5 ^# s% q' _! g$ B这里的偏移值为包含操作位的寄存器偏移值。+ d1 I- C4 ^/ ?
–  bit_number  is the bit position (0-7) of the targeted bit  % A- C* [0 W& G, i/ J
这里的位就是目标位。3 ?5 h0 J* A0 }6 Q
/ R, O6 [1 _, r
位带区在 SRAM上的地址范围:0x20000000 ~ 0x200FFFFF(SRAM区中最低1MB)( f$ u( C, V5 I0 e# n% z
位带识别区在SRAM上的地址范围:   0x22000000 ~ 0x220FFFFF$ n- A4 W  _. U0 r2 w2 Y
位带区在片上外设的地址范围:0x4000 0000-0x400F FFFF(片上外设区中的最低1MB),) L% r' @; W0 G; d2 z
位带识别区在片上外设的地址范围:0x4200 0000~0x42FF FFFF;+ y. H" [( x9 K) ^* C
对应关系:位带区的每个bit位的值 对应 位带识别区1个 32位的地址的内容;# h. y. Q4 J6 m% f5 z/ Y6 g
所以位带操作是:当你通过位带别名区访问这些32位的地址的内容时,就可以达到访+ m) |" `. p" h  U5 F9 q
问位带区对应的比特位。
+ P8 s9 r& `" R8 Q1 Y2 d
9 d2 j$ \$ ?% U举例:
: w; N1 S) G5 c+ G+ V5 u& U  x+ S要给GPIO PC15做拉高拉低操作。
1 F! x. m: {; ^( i首先找到操作寄存器的地址:7 E1 N9 z! n3 i! U/ X: q9 h( Q  v1 G
GPIO为外设,故需用外设的基地址:                   PERIPH_BASE               ((uint32_t)0x40000000)* ]3 `2 A* r3 K1 L
GPIOC在AH1外设上,故在之前基础上再做偏移:AHB1PERIPH_BASE       (PERIPH_BASE + 0x00020000)
/ i4 R* b1 |7 U同时需要再加上GPIOC的偏移:                         GPIOC_BASE                  (AHB1PERIPH_BASE + 0x0800)
0 ~+ x  X. ?/ u: G4 ^1 S/ B然后找到位设置寄存器:                                   GPIOC_BSRR                  (GPIOC_BASE + 0x18)
) Y2 t3 R: q% }% F& j7 _. v5 B) U( z2 {/ F! E: R& l# i
最终得到的地址为 :0x40020818
# L3 L1 H5 Z* W) C通常情况下向这个地址赋值即可实现指定位拉高拉低操作:
5 \& _' O4 S5 @( f. t*((volatile unsigned long *) 0x40020818) = 0x80000000  //!<拉高
+ H2 y: @: ]5 k*((volatile unsigned long *) 0x40020818) = 0x00008000  //!<拉低
  t6 V, B! o2 F! u! V: k" `
' M, {: C0 \1 W! ]  a# J但通过位带,按照公式获取位带操作地址:
5 q5 p: ^: a- C7 h- z1 Y: n! O/*这是拉高时寄存器地址*/' t3 ?0 e7 I1 E; `' [) n6 F
AddrH =  *((volatile unsigned long *)(( 0x40020818  & 0xF0000000)+0x2000000+(( 0x40020818  & 0xFFFFF)<<5)+(15 << 2)))  
, C- `0 P8 O$ ]; z0 n7 J% q) t$ k8 Y% oAddrH = 1;   //!<置1就拉高 & R. D  B2 ?8 J3 p% y5 {
/*这是拉低时寄存器地址*/
# Y  V( g1 L0 M( O AddrL =  *((volatile unsigned long *)(( 0x40020818  & 0xF0000000)+0x2000000+(( 0x40020818  & 0xFFFFF)<<5)+((15+16) << 2))) + D+ s! G9 `! i2 L( b: V
AddrL = 1;   //!<置1就拉低   
5 ?. Q7 s2 J. Y, q/ E0 S& C& V9 i7 g+ x' z" {. m: m4 r
使用宏定义,即:(Addr为 GPIOC_BSRR  拉高时 BitNum为15 拉低时 BitNum是(15+16) ). [" Q$ Y! N, z/ @, K  [' j: V3 P
#define BitBand(Addr,BitNum) *((volatile unsigned long *)((Addr & 0xF0000000)+0x2000000+((Addr & 0xFFFFF)<<5)+(BitNum << 2))) / w: H0 g# L. V- C) c1 _- o6 S
# }. y! Y7 ?* I5 B* T9 X) J+ N
精简之后 ,位带操作   :% r9 o+ w& y- Y* E
#define BitBand(Addr,BitNum) *((volatile unsigned long *)(PERIPH_BB_BASE|((Addr-PERIPH_BASE)<<5)|(BitNum << 2)))7 O( b% n! ~. n" ^% i
! L* y& a8 v$ |" u4 M4 Q+ s& @# V

; K+ L( M! d. P) B4 k+ h( t* o) _
赞 收藏 评论0 发布时间:2021-12-1 21:47

举报

0个回答

所属标签

相似技术帖

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