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

【经验分享】STM32F2位带操作

[复制链接]
STMCU小助手 发布时间:2021-12-2 14:55
手册中说:
1 M  ]' q8 o6 o$ W2 v# d- H2 I0 R6 zIn 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.
: o1 C' K1 y7 ?在这两个系列中外设和SRAM都有各自映射的位带区,以实现对位的单独操作。  V3 y1 b$ X( N5 x( Y' y( Z3 u
The operations are only available for Cortex ® -M3 accesses, and not from other bus masters (e.g. DMA).
: H  U- q" W: Q$ M. V使用局限于M3内核。4 u6 e) {- f9 f5 N
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:
- n% ^1 D7 y5 v- P地址映射公式如下
) b& A+ M, T' H4 L" j                               bit_word_addr  =  bit_band_base  + ( byte_offset  x 32) + ( bit_number  × 4)1 o2 j# W/ i) y$ m% a
where:
% e4 ?9 ~! i( B8 e* A- `# S–  bit_word_addr  is the address of the word in the alias memory region that maps to the targeted bit
3 y! d5 E5 J/ g5 {+ V一位扩展成了一个字。1 [  W! X5 c7 c7 o6 S9 ]% `
–  bit_band_base  is the starting address of the alias region
, {  y+ M; S: U0 g, B( F位带基地址是对应位带的起始地址。( P* {3 _, t, U  c; _2 j. X# }  c
–  byte_offset  is the number of the byte in the bit-band region that contains the targeted bit6 ^* V( r& n1 ?* |
这里的偏移值为包含操作位的寄存器偏移值。% T2 ?3 r0 s7 W4 N: h* Z
–  bit_number  is the bit position (0-7) of the targeted bit  
) ^6 m0 Q1 W& V  G这里的位就是目标位。
, |$ w1 d' Z5 q+ {* K2 g) J0 C2 j% s
位带区在 SRAM上的地址范围:0x20000000 ~ 0x200FFFFF(SRAM区中最低1MB)
# A" L% d1 u0 v) Q位带识别区在SRAM上的地址范围:   0x22000000 ~ 0x220FFFFF7 A, _- I" t5 a( g. E; P
位带区在片上外设的地址范围:0x4000 0000-0x400F FFFF(片上外设区中的最低1MB),
/ ?& E, c# u& ]2 g; d4 p3 x% B位带识别区在片上外设的地址范围:0x4200 0000~0x42FF FFFF;
; W  ]  c+ j7 E  `& `对应关系:位带区的每个bit位的值 对应 位带识别区1个 32位的地址的内容;* }, E6 i6 l1 \9 Q5 T) L
所以位带操作是:当你通过位带别名区访问这些32位的地址的内容时,就可以达到访: F3 t6 E+ i2 }* o. c# q
问位带区对应的比特位。. l! R- _  K5 ]4 V
# q$ r$ T4 Z3 e2 c
举例:9 |. g" Y+ v6 h3 A% a; p: r# N$ ?. a
要给GPIO PC15做拉高拉低操作。- h) @  t0 w" ~) q) W( w1 K$ _9 h% c
首先找到操作寄存器的地址:( \  ]+ @9 ?$ E  q/ i* j: B
GPIO为外设,故需用外设的基地址:                   PERIPH_BASE               ((uint32_t)0x40000000)
# E; c4 i( r& m1 YGPIOC在AH1外设上,故在之前基础上再做偏移:AHB1PERIPH_BASE       (PERIPH_BASE + 0x00020000)8 S3 g. e5 x6 i( G* p- ]$ j  ~
同时需要再加上GPIOC的偏移:                         GPIOC_BASE                  (AHB1PERIPH_BASE + 0x0800)& t3 v' R, K3 h  l
然后找到位设置寄存器:                                   GPIOC_BSRR                  (GPIOC_BASE + 0x18). `$ q# p- Y2 M; ~) l

" ~1 h) W( Y  J$ g7 t* M0 q最终得到的地址为 :0x40020818
% ~: r# ~: T8 Q通常情况下向这个地址赋值即可实现指定位拉高拉低操作:9 B0 J0 R; u* I- b
*((volatile unsigned long *) 0x40020818) = 0x80000000  //!<拉高8 c1 `5 q+ j4 g
*((volatile unsigned long *) 0x40020818) = 0x00008000  //!<拉低. P3 b9 J/ }& n2 H2 y% j* o( m

, l6 c) d& N' H, t9 p0 L- w3 a  ]! `但通过位带,按照公式获取位带操作地址:
8 I) ]" _$ w. V, A5 P/*这是拉高时寄存器地址*/
4 X" b4 R4 Q2 b/ v% K1 t# b3 L, o AddrH =  *((volatile unsigned long *)(( 0x40020818  & 0xF0000000)+0x2000000+(( 0x40020818  & 0xFFFFF)<<5)+(15 << 2)))  
/ u2 K, N% t  x6 c) O9 R- c, i! WAddrH = 1;   //!<置1就拉高 8 C8 [, B- H* r) N* J) R+ j
/*这是拉低时寄存器地址*/
% ]- B! M7 w5 A" @0 P0 }, Z AddrL =  *((volatile unsigned long *)(( 0x40020818  & 0xF0000000)+0x2000000+(( 0x40020818  & 0xFFFFF)<<5)+((15+16) << 2))) 0 y1 ~1 D% N. a( i1 S
AddrL = 1;   //!<置1就拉低   
$ u% ?. }, T. {$ K) R( z$ m: `8 n2 D+ D5 z/ G
使用宏定义,即:(Addr为 GPIOC_BSRR  拉高时 BitNum为15 拉低时 BitNum是(15+16) )9 t% V& d( _0 P8 W; L3 W
#define BitBand(Addr,BitNum) *((volatile unsigned long *)((Addr & 0xF0000000)+0x2000000+((Addr & 0xFFFFF)<<5)+(BitNum << 2)))
* S5 U) T) N6 j1 `8 }6 ?6 z. k
+ `1 G4 V( |8 `精简之后 ,位带操作   :
' K3 n: G% ]0 ^- G" c  u9 [* c' v: \#define BitBand(Addr,BitNum) *((volatile unsigned long *)(PERIPH_BB_BASE|((Addr-PERIPH_BASE)<<5)|(BitNum << 2)))
* s. T/ O) R# q6 [9 R7 O
  A" r0 s. E, `
1 R6 _2 e( l1 F
收藏 评论0 发布时间:2021-12-2 14:55

举报

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