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

【经验分享】STM32F2位带操作

[复制链接]
STMCU小助手 发布时间:2021-12-2 14:55
手册中说:
- _/ V$ K( i2 r9 v, JIn 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.
. U  l. K4 F8 K4 {/ R在这两个系列中外设和SRAM都有各自映射的位带区,以实现对位的单独操作。
! V9 j( x( b2 N8 V: r. SThe operations are only available for Cortex ® -M3 accesses, and not from other bus masters (e.g. DMA).* F) m1 N2 I4 i
使用局限于M3内核。' ?$ [6 a6 ^3 C( d3 L# T
A 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:) x. ]2 P; i2 X' t' p
地址映射公式如下
0 x" V' E' d2 w2 X3 W% L. y4 D( f                               bit_word_addr  =  bit_band_base  + ( byte_offset  x 32) + ( bit_number  × 4)& K% O, f0 ?+ U; J8 V
where:5 `) j" S5 Z; R
–  bit_word_addr  is the address of the word in the alias memory region that maps to the targeted bit
0 V) S, y( R* _' l( J# X3 M一位扩展成了一个字。( z0 S& a0 G! ]: {1 M
–  bit_band_base  is the starting address of the alias region* _4 T8 Z; w& {  ?/ o2 n- D9 k
位带基地址是对应位带的起始地址。$ \' V# K8 B9 b: U- O
–  byte_offset  is the number of the byte in the bit-band region that contains the targeted bit
! J4 n. p7 e- x5 d这里的偏移值为包含操作位的寄存器偏移值。$ M' ~3 {% f& n0 p6 n" o; l
–  bit_number  is the bit position (0-7) of the targeted bit  1 q: N8 h9 o) A5 s+ x% b
这里的位就是目标位。
- L" e5 _' w4 k) d% f$ |/ b1 b4 v3 w- m% i* o: p
位带区在 SRAM上的地址范围:0x20000000 ~ 0x200FFFFF(SRAM区中最低1MB)8 C  @  h$ r+ i& h% x: T( q6 a1 j  o6 T
位带识别区在SRAM上的地址范围:   0x22000000 ~ 0x220FFFFF8 {+ E. O; W6 m% V, [
位带区在片上外设的地址范围:0x4000 0000-0x400F FFFF(片上外设区中的最低1MB),
4 ^4 q/ L* n. }位带识别区在片上外设的地址范围:0x4200 0000~0x42FF FFFF;5 j- }4 D% t5 k$ c4 p8 o
对应关系:位带区的每个bit位的值 对应 位带识别区1个 32位的地址的内容;
3 ~2 d( R7 }5 m% I. a. V$ k所以位带操作是:当你通过位带别名区访问这些32位的地址的内容时,就可以达到访9 s+ w' Q; @1 C$ [; w3 ~
问位带区对应的比特位。+ U8 r. K+ I: i0 f0 V# Q

, b* Q- I9 f) S举例:/ a3 g$ u/ l6 F* d$ B7 X- }) {
要给GPIO PC15做拉高拉低操作。
& d2 s) c! ?* {! u6 @+ ^首先找到操作寄存器的地址:% N# z$ d+ U) }6 z" k
GPIO为外设,故需用外设的基地址:                   PERIPH_BASE               ((uint32_t)0x40000000)
' H+ N4 K8 h/ z" ]2 tGPIOC在AH1外设上,故在之前基础上再做偏移:AHB1PERIPH_BASE       (PERIPH_BASE + 0x00020000)
1 E0 V7 P: Z2 _, i/ z& N1 Y/ t同时需要再加上GPIOC的偏移:                         GPIOC_BASE                  (AHB1PERIPH_BASE + 0x0800)
! A- M; t% W$ N: \& ?% i+ y然后找到位设置寄存器:                                   GPIOC_BSRR                  (GPIOC_BASE + 0x18)
$ L$ e- ]- t. B1 V5 e( s0 j: X' `7 b" H, Z7 @
最终得到的地址为 :0x40020818
6 ~% n1 f* c6 }5 J* [, m3 z8 }6 j通常情况下向这个地址赋值即可实现指定位拉高拉低操作:
& e) l4 J1 C. D0 L; h( Q0 J*((volatile unsigned long *) 0x40020818) = 0x80000000  //!<拉高
# \# a: `. z+ O7 L0 G: D*((volatile unsigned long *) 0x40020818) = 0x00008000  //!<拉低
2 i" _0 ^0 m2 X4 D5 G) f3 c/ W" l5 }1 Q1 X) {
但通过位带,按照公式获取位带操作地址:
/ I+ N+ f* V( g4 v2 G/ v8 U) B( }/*这是拉高时寄存器地址*/
; G" n4 l- G7 [" f$ w8 c AddrH =  *((volatile unsigned long *)(( 0x40020818  & 0xF0000000)+0x2000000+(( 0x40020818  & 0xFFFFF)<<5)+(15 << 2)))  , F; g3 v. S8 v* L) u* r" ?" c  j' F
AddrH = 1;   //!<置1就拉高 4 D' Y, c; K; O  K
/*这是拉低时寄存器地址*/( D. V7 }. y3 Y% n" m
AddrL =  *((volatile unsigned long *)(( 0x40020818  & 0xF0000000)+0x2000000+(( 0x40020818  & 0xFFFFF)<<5)+((15+16) << 2)))
6 p5 s8 a0 E8 \/ {9 OAddrL = 1;   //!<置1就拉低    1 I* g* w8 B" E; s  a

' n3 Z4 ^8 {  |! o  m' d& W使用宏定义,即:(Addr为 GPIOC_BSRR  拉高时 BitNum为15 拉低时 BitNum是(15+16) )( H8 {  @. [2 f: q; I) B, u: N
#define BitBand(Addr,BitNum) *((volatile unsigned long *)((Addr & 0xF0000000)+0x2000000+((Addr & 0xFFFFF)<<5)+(BitNum << 2)))
9 f" o' J) R2 Q' q. o
% _/ S+ y* c6 Q( A6 X精简之后 ,位带操作   :  N1 Y7 _0 m' @& a9 k5 a  s: b, \& a
#define BitBand(Addr,BitNum) *((volatile unsigned long *)(PERIPH_BB_BASE|((Addr-PERIPH_BASE)<<5)|(BitNum << 2))). Y2 \; D% Q; \$ Z/ N  t+ h

% x2 A1 Z- n+ x
" m7 Q$ ]6 l% `$ A  R
收藏 评论0 发布时间:2021-12-2 14:55

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版