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

【经验分享】STM32F2位带操作

[复制链接]
STMCU小助手 发布时间:2021-12-1 21:47
手册中说:
) }( `1 t* |  pIn 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.
' B; L% W; H% [! z- g1 j9 O1 I在这两个系列中外设和SRAM都有各自映射的位带区,以实现对位的单独操作。3 m! ^+ k- ?) P# ~
The operations are only available for Cortex ® -M3 accesses, and not from other bus masters (e.g. DMA).
$ ?5 s, @  L' U* B使用局限于M3内核。
! H& G9 t- \9 o: a/ R4 D) uA 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:5 O1 o3 U  H5 w& u1 f2 a1 O
地址映射公式如下8 O1 @5 {% J1 y  N: l
                               bit_word_addr  =  bit_band_base  + ( byte_offset  x 32) + ( bit_number  × 4)
. o8 U, ~8 J* N. Owhere:1 Z6 W! _% s* w1 V) o' Q
–  bit_word_addr  is the address of the word in the alias memory region that maps to the targeted bit" t* X$ j: P" }- X9 ?9 s$ B  t" I
一位扩展成了一个字。9 h; [% u! p8 U& g! ]  ]
–  bit_band_base  is the starting address of the alias region0 t0 [8 F5 d8 r% `' V, `9 i5 u
位带基地址是对应位带的起始地址。
( f/ x4 H! n- ?) Y–  byte_offset  is the number of the byte in the bit-band region that contains the targeted bit+ `% R  |8 a; g4 [! l9 A( M
这里的偏移值为包含操作位的寄存器偏移值。7 q7 a# F9 v; J- W. y
–  bit_number  is the bit position (0-7) of the targeted bit  5 }* I! o9 O" Q3 x2 x
这里的位就是目标位。% G+ ~7 w# _; x6 T1 n
# D9 ?! c. k- o
位带区在 SRAM上的地址范围:0x20000000 ~ 0x200FFFFF(SRAM区中最低1MB)9 ?8 e6 y" O6 f7 |. m
位带识别区在SRAM上的地址范围:   0x22000000 ~ 0x220FFFFF. E$ u( C1 Y  c4 m" k* u
位带区在片上外设的地址范围:0x4000 0000-0x400F FFFF(片上外设区中的最低1MB),
" ]  S6 g2 j  @% U/ I/ v位带识别区在片上外设的地址范围:0x4200 0000~0x42FF FFFF;# v4 B  h: Q  c
对应关系:位带区的每个bit位的值 对应 位带识别区1个 32位的地址的内容;
  k" i) W+ A& \+ T所以位带操作是:当你通过位带别名区访问这些32位的地址的内容时,就可以达到访1 \2 S1 e. o6 Z, t: r% R" @1 h7 N
问位带区对应的比特位。: Z8 t" |9 F! ?5 @9 m; K

: B" A: L1 I) }+ L7 u7 Y( p; x. l% `举例:# l5 f; q9 {: l7 g# N+ G
要给GPIO PC15做拉高拉低操作。8 R0 L1 ^: a5 z
首先找到操作寄存器的地址:* B) ^6 Z, L0 x$ I
GPIO为外设,故需用外设的基地址:                   PERIPH_BASE               ((uint32_t)0x40000000)
  U  c  l) H' f5 ^GPIOC在AH1外设上,故在之前基础上再做偏移:AHB1PERIPH_BASE       (PERIPH_BASE + 0x00020000)
5 I8 Q( e. F7 S( J% p同时需要再加上GPIOC的偏移:                         GPIOC_BASE                  (AHB1PERIPH_BASE + 0x0800)
; w! o6 r+ W! z4 ?4 _然后找到位设置寄存器:                                   GPIOC_BSRR                  (GPIOC_BASE + 0x18)# ?# |/ Q/ Y/ i3 H7 k. y  P

" l4 [, c8 S' v! M最终得到的地址为 :0x40020818! z5 U" r0 y# T) x  e( W$ V
通常情况下向这个地址赋值即可实现指定位拉高拉低操作:
  {, v! q/ R# s2 m0 _& H6 m*((volatile unsigned long *) 0x40020818) = 0x80000000  //!<拉高
) Y5 ?; V* |# n/ {) D8 b. B*((volatile unsigned long *) 0x40020818) = 0x00008000  //!<拉低/ Q8 I# ~3 p: C- m( L

& o! k! ^3 P4 ~* ~$ T* M但通过位带,按照公式获取位带操作地址:
1 F( s9 V1 m. Z; c  s1 ?/*这是拉高时寄存器地址*/' q" }( d# c/ ~0 M
AddrH =  *((volatile unsigned long *)(( 0x40020818  & 0xF0000000)+0x2000000+(( 0x40020818  & 0xFFFFF)<<5)+(15 << 2)))  , K! o- y& ^' s( d+ Z
AddrH = 1;   //!<置1就拉高 , W# C; I' w) W$ @
/*这是拉低时寄存器地址*/7 I: x3 d$ [6 ?0 q) |5 M
AddrL =  *((volatile unsigned long *)(( 0x40020818  & 0xF0000000)+0x2000000+(( 0x40020818  & 0xFFFFF)<<5)+((15+16) << 2)))
  b4 r( t2 B& e$ u/ F2 |  ^/ D( {AddrL = 1;   //!<置1就拉低   
4 A$ Z; |4 T8 Y0 P7 i3 _. Q
) w1 l0 I; F' R; P' {使用宏定义,即:(Addr为 GPIOC_BSRR  拉高时 BitNum为15 拉低时 BitNum是(15+16) )- G0 ]6 I2 }" h" B
#define BitBand(Addr,BitNum) *((volatile unsigned long *)((Addr & 0xF0000000)+0x2000000+((Addr & 0xFFFFF)<<5)+(BitNum << 2)))
* @1 }( Z/ q" k1 n7 W0 v; \
+ t) F' a0 X) z, j1 l# u精简之后 ,位带操作   :
& R& x+ z; e, O, U8 ^, a#define BitBand(Addr,BitNum) *((volatile unsigned long *)(PERIPH_BB_BASE|((Addr-PERIPH_BASE)<<5)|(BitNum << 2)))
* E% E& Z6 @- X& i9 ]8 ]( W9 L+ t! z+ |: C% U
5 T, C; U& w) R
收藏 评论0 发布时间:2021-12-1 21:47

举报

0个回答

所属标签

相似技术帖

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