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

【经验分享】STM32F2位带操作

[复制链接]
STMCU小助手 发布时间:2021-12-2 14:55
手册中说:8 A- y( @' n! H7 X
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.
1 O+ |) }9 K  w7 ?! P+ ?/ a- G/ L在这两个系列中外设和SRAM都有各自映射的位带区,以实现对位的单独操作。
. s. P& a# B' j! FThe operations are only available for Cortex ® -M3 accesses, and not from other bus masters (e.g. DMA).* a3 A/ s9 p6 ^) \% E" c- p( ?
使用局限于M3内核。
* J7 L- r" N& rA 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:
; y" ^6 y  [2 E- k地址映射公式如下
& q9 D" K1 U7 a5 Y                               bit_word_addr  =  bit_band_base  + ( byte_offset  x 32) + ( bit_number  × 4), n! \9 d8 g) ~& D% E5 k" H' U  O
where:
! Y. u0 F1 Z) W. u) P–  bit_word_addr  is the address of the word in the alias memory region that maps to the targeted bit' w0 V- N0 R( Z7 u' F- O7 @
一位扩展成了一个字。
, j+ w, O4 A0 f0 I& c–  bit_band_base  is the starting address of the alias region
; d. `8 u$ `4 ]' N位带基地址是对应位带的起始地址。1 a/ Y  ?% _0 `
–  byte_offset  is the number of the byte in the bit-band region that contains the targeted bit5 n* K# N4 l' n! J* S; e7 W" B
这里的偏移值为包含操作位的寄存器偏移值。
3 [+ Y" @& F8 V5 W6 m' }9 J–  bit_number  is the bit position (0-7) of the targeted bit  
; l+ J5 J' y# L' O这里的位就是目标位。9 c( b% I3 r8 u& i4 K( G" I

9 ^1 O2 z# C7 }5 Y* W- W' |  a位带区在 SRAM上的地址范围:0x20000000 ~ 0x200FFFFF(SRAM区中最低1MB)9 I* E8 t  M: s" O0 D) @
位带识别区在SRAM上的地址范围:   0x22000000 ~ 0x220FFFFF
2 c  f7 W0 S# d! [位带区在片上外设的地址范围:0x4000 0000-0x400F FFFF(片上外设区中的最低1MB),
+ }" h& c0 h* w  t/ \位带识别区在片上外设的地址范围:0x4200 0000~0x42FF FFFF;  p! @0 O* L1 D- m
对应关系:位带区的每个bit位的值 对应 位带识别区1个 32位的地址的内容;% O4 A% Z9 Y$ X: K+ o$ Z
所以位带操作是:当你通过位带别名区访问这些32位的地址的内容时,就可以达到访: v* Q" k; H) o& e% i
问位带区对应的比特位。
, P( {; r( m" g) L% l* w, D' T3 j  C1 U/ P$ z  a
举例:
2 M: M+ e0 j9 N/ B+ x4 r1 U" `要给GPIO PC15做拉高拉低操作。$ V; t# p$ Z5 \4 }  C
首先找到操作寄存器的地址:
9 [9 B# D/ j4 D# @: j, x4 ^GPIO为外设,故需用外设的基地址:                   PERIPH_BASE               ((uint32_t)0x40000000)* _& E3 ^/ Y1 g% f1 |9 y
GPIOC在AH1外设上,故在之前基础上再做偏移:AHB1PERIPH_BASE       (PERIPH_BASE + 0x00020000)
( V, @7 E4 j+ l) j: h; i' x同时需要再加上GPIOC的偏移:                         GPIOC_BASE                  (AHB1PERIPH_BASE + 0x0800)' ]% k. h4 U" |. g% r3 L
然后找到位设置寄存器:                                   GPIOC_BSRR                  (GPIOC_BASE + 0x18)
( n; K; ]3 X$ Q
/ U9 h+ ?. L6 M9 a最终得到的地址为 :0x40020818
; `9 J4 J6 b3 s; a9 _通常情况下向这个地址赋值即可实现指定位拉高拉低操作:  x/ p6 J3 @9 h9 `! g3 z
*((volatile unsigned long *) 0x40020818) = 0x80000000  //!<拉高
; v1 q) |2 G# m3 t( |5 H*((volatile unsigned long *) 0x40020818) = 0x00008000  //!<拉低
5 p/ k( y* n0 ~4 H# A* l* o! q+ d+ v1 c2 I7 N5 c
但通过位带,按照公式获取位带操作地址:
. x! |* r! e1 R. ]) ?8 P1 X/*这是拉高时寄存器地址*/
( c8 Y8 N  E/ g7 W AddrH =  *((volatile unsigned long *)(( 0x40020818  & 0xF0000000)+0x2000000+(( 0x40020818  & 0xFFFFF)<<5)+(15 << 2)))  7 r2 o- m* q! {0 z/ b1 R; ]0 L" X
AddrH = 1;   //!<置1就拉高 6 z% B7 Z8 u+ d
/*这是拉低时寄存器地址*/
  P( P; [. G) b1 a AddrL =  *((volatile unsigned long *)(( 0x40020818  & 0xF0000000)+0x2000000+(( 0x40020818  & 0xFFFFF)<<5)+((15+16) << 2))) / ]* \- A( P+ t8 T
AddrL = 1;   //!<置1就拉低    ; W. k( k2 v6 Q

) K" ^& I! @. S* c& t使用宏定义,即:(Addr为 GPIOC_BSRR  拉高时 BitNum为15 拉低时 BitNum是(15+16) )5 c  n4 C4 i+ e: }: ?& g
#define BitBand(Addr,BitNum) *((volatile unsigned long *)((Addr & 0xF0000000)+0x2000000+((Addr & 0xFFFFF)<<5)+(BitNum << 2)))
- Z& C4 `$ j/ r0 |1 m( x, V' q" d9 s' a: B
精简之后 ,位带操作   :2 L) Z! a6 `* g  ?9 |6 \5 z9 ]6 G  p
#define BitBand(Addr,BitNum) *((volatile unsigned long *)(PERIPH_BB_BASE|((Addr-PERIPH_BASE)<<5)|(BitNum << 2)))! C5 o6 I& c2 V9 {
# T3 T9 Y. c6 R! r4 y5 U
! W0 L1 a6 w3 @0 I
赞 收藏 评论0 发布时间:2021-12-2 14:55

举报

0个回答

所属标签

相似技术帖

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