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

【经验分享】STM32F2位带操作

[复制链接]
STMCU小助手 发布时间:2021-12-1 21:47
手册中说:6 D/ a* A' h" A1 a9 t7 o) @
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.' w5 Q, _3 g- W+ [- W0 d! t! h
在这两个系列中外设和SRAM都有各自映射的位带区,以实现对位的单独操作。
* G6 T; p) R" d$ D( \% J4 hThe operations are only available for Cortex ® -M3 accesses, and not from other bus masters (e.g. DMA).
% d$ i& B% d1 [( d  s7 J使用局限于M3内核。" `3 _) g+ y" \% r! h
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:% M* B! ]8 p, a- L/ S
地址映射公式如下2 Y5 g3 x" l& f% M0 o* {
                               bit_word_addr  =  bit_band_base  + ( byte_offset  x 32) + ( bit_number  × 4)
3 \- G2 F- R9 Q3 Pwhere:( j0 W3 P/ L; |% Q/ a
–  bit_word_addr  is the address of the word in the alias memory region that maps to the targeted bit. W$ M6 A0 W$ C3 e% J1 P
一位扩展成了一个字。
* ]8 G9 i7 b! s. B* {  B3 s5 W–  bit_band_base  is the starting address of the alias region
5 q! A0 j( t- }3 ]. h6 g位带基地址是对应位带的起始地址。: N: c: q, @2 C! L/ Q
–  byte_offset  is the number of the byte in the bit-band region that contains the targeted bit
5 W4 b0 g0 |0 U/ D8 ]这里的偏移值为包含操作位的寄存器偏移值。
% z; D; f% U. Y1 k+ ?" A–  bit_number  is the bit position (0-7) of the targeted bit  ; F! G7 ~, C# k4 t- H& }6 ]3 v
这里的位就是目标位。
9 d! K) i1 C, Y* }
- S1 M0 D, e3 r/ k' g位带区在 SRAM上的地址范围:0x20000000 ~ 0x200FFFFF(SRAM区中最低1MB)# M# y7 K' _5 U$ U% x
位带识别区在SRAM上的地址范围:   0x22000000 ~ 0x220FFFFF  D3 T) }7 Y6 b) L. f
位带区在片上外设的地址范围:0x4000 0000-0x400F FFFF(片上外设区中的最低1MB),
- p" v7 Y  a2 z3 @位带识别区在片上外设的地址范围:0x4200 0000~0x42FF FFFF;3 j8 J5 }$ @4 S
对应关系:位带区的每个bit位的值 对应 位带识别区1个 32位的地址的内容;: q! Z! B# a. N6 V$ v
所以位带操作是:当你通过位带别名区访问这些32位的地址的内容时,就可以达到访7 U  A( ]" Z, `3 Z# h3 h. Y" J
问位带区对应的比特位。# s# v* h5 |$ r. E/ K

* Z0 U/ }" s4 A( R举例:
! l- _7 \9 ?: M1 ~8 t要给GPIO PC15做拉高拉低操作。+ K4 Y. z1 \+ S# ~5 w7 W9 t
首先找到操作寄存器的地址:
" x, I; q( Z' @) _3 M" u# xGPIO为外设,故需用外设的基地址:                   PERIPH_BASE               ((uint32_t)0x40000000)8 Q0 C- K0 ~; S
GPIOC在AH1外设上,故在之前基础上再做偏移:AHB1PERIPH_BASE       (PERIPH_BASE + 0x00020000)
9 q' _4 ~' ]+ b+ n5 a+ ?1 ?同时需要再加上GPIOC的偏移:                         GPIOC_BASE                  (AHB1PERIPH_BASE + 0x0800)8 \* J! m( i6 m' _: I; x  H
然后找到位设置寄存器:                                   GPIOC_BSRR                  (GPIOC_BASE + 0x18). F1 I& j+ H+ k5 w
- y4 v7 _0 \: L) z
最终得到的地址为 :0x400208188 v& T- r5 p" e' [
通常情况下向这个地址赋值即可实现指定位拉高拉低操作:
0 ]. {( g* N* l2 ]7 W*((volatile unsigned long *) 0x40020818) = 0x80000000  //!<拉高& W/ x1 e7 B$ W
*((volatile unsigned long *) 0x40020818) = 0x00008000  //!<拉低
* h6 i  h0 x. ~8 s4 }  L( z& V- l7 D$ U8 Q# r, d
但通过位带,按照公式获取位带操作地址:
0 v* f% H) f$ l* ~5 S0 w6 d9 Y) T( }5 X/*这是拉高时寄存器地址*/
  e2 X$ q2 F0 h AddrH =  *((volatile unsigned long *)(( 0x40020818  & 0xF0000000)+0x2000000+(( 0x40020818  & 0xFFFFF)<<5)+(15 << 2)))  
& `$ e5 p. f; N  m) `# q. w. _AddrH = 1;   //!<置1就拉高
4 p# N+ R8 G0 u+ O3 Y/*这是拉低时寄存器地址*/* U& c+ ^$ \6 b4 U& A
AddrL =  *((volatile unsigned long *)(( 0x40020818  & 0xF0000000)+0x2000000+(( 0x40020818  & 0xFFFFF)<<5)+((15+16) << 2))) , D5 }- n; B' \" f( {1 G
AddrL = 1;   //!<置1就拉低    0 |# x" r. W4 F$ K. t% F5 \

; L+ m& v7 I4 K使用宏定义,即:(Addr为 GPIOC_BSRR  拉高时 BitNum为15 拉低时 BitNum是(15+16) )# m" m3 a+ W9 }# }6 \5 J
#define BitBand(Addr,BitNum) *((volatile unsigned long *)((Addr & 0xF0000000)+0x2000000+((Addr & 0xFFFFF)<<5)+(BitNum << 2)))
! K, z: ]: v# E7 q' P3 w- ~- Q+ \" L- A
精简之后 ,位带操作   :
7 V+ J) f- _4 A& k) S" m#define BitBand(Addr,BitNum) *((volatile unsigned long *)(PERIPH_BB_BASE|((Addr-PERIPH_BASE)<<5)|(BitNum << 2)))
7 k5 U2 c2 L7 O- g* t: }* e3 S0 Z( |  ~* C  B6 M3 S

) F! n0 i4 |7 H  x
收藏 评论0 发布时间:2021-12-1 21:47

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版