请选择 进入手机版 | 继续访问电脑版

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

【经验分享】STM32F2位带操作

[复制链接]
STMCU小助手 发布时间:2021-12-2 14:55
手册中说:  F* |7 S( _6 a  M3 r
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.7 d( M( \& Y8 ~: s
在这两个系列中外设和SRAM都有各自映射的位带区,以实现对位的单独操作。( {3 L# L5 R2 k9 U3 s) }' c
The operations are only available for Cortex ® -M3 accesses, and not from other bus masters (e.g. DMA).
* c# U% W( p; u使用局限于M3内核。
! f4 c& |, b' I2 l9 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:) D+ d: b5 i" \6 c8 g% X) K
地址映射公式如下* S) b/ G2 Y8 \% @# M5 L
                               bit_word_addr  =  bit_band_base  + ( byte_offset  x 32) + ( bit_number  × 4)7 a6 M: B% R. A
where:
( v, n* P3 `, G% E" B- ^. V; p–  bit_word_addr  is the address of the word in the alias memory region that maps to the targeted bit) n( Q7 I/ N' ]" n
一位扩展成了一个字。
; ~1 T( S9 f/ B* y–  bit_band_base  is the starting address of the alias region
' D6 {2 {. C* ?位带基地址是对应位带的起始地址。
7 y/ x3 b; f2 Z+ i# n( O–  byte_offset  is the number of the byte in the bit-band region that contains the targeted bit
, ]9 [# P/ C! k& }9 ^/ d5 T这里的偏移值为包含操作位的寄存器偏移值。  ^0 V1 q6 ^( |4 g; Z0 A
–  bit_number  is the bit position (0-7) of the targeted bit  
, W- x# y( W, |0 E2 h这里的位就是目标位。) |2 u% h) E4 @% X% _
# c% f! G( n" Z/ K$ a
位带区在 SRAM上的地址范围:0x20000000 ~ 0x200FFFFF(SRAM区中最低1MB)/ F3 S# p; k# C1 V
位带识别区在SRAM上的地址范围:   0x22000000 ~ 0x220FFFFF
' l9 d- Z9 U$ ?/ z) a位带区在片上外设的地址范围:0x4000 0000-0x400F FFFF(片上外设区中的最低1MB),
  M3 N* c% B! Z% x/ L位带识别区在片上外设的地址范围:0x4200 0000~0x42FF FFFF;
5 Z8 k# X" \4 _/ y对应关系:位带区的每个bit位的值 对应 位带识别区1个 32位的地址的内容;8 T6 c# ~6 d4 B' }% |
所以位带操作是:当你通过位带别名区访问这些32位的地址的内容时,就可以达到访
) Z/ ~' w6 _" w0 ]0 W3 |问位带区对应的比特位。
& c8 h0 L: J6 j$ E/ F9 V* ]  Y1 R6 d$ l
举例:7 X/ e9 k  A. v0 [4 P
要给GPIO PC15做拉高拉低操作。
& Q6 k' n. j' {+ j5 q6 a: {5 ^首先找到操作寄存器的地址:# Q2 J8 G- S7 M! e
GPIO为外设,故需用外设的基地址:                   PERIPH_BASE               ((uint32_t)0x40000000): E; d( R6 \& U
GPIOC在AH1外设上,故在之前基础上再做偏移:AHB1PERIPH_BASE       (PERIPH_BASE + 0x00020000)
8 N+ A" `& ]. U$ U同时需要再加上GPIOC的偏移:                         GPIOC_BASE                  (AHB1PERIPH_BASE + 0x0800)
8 d4 P" P! u) K, L4 B, |3 {% {然后找到位设置寄存器:                                   GPIOC_BSRR                  (GPIOC_BASE + 0x18)" g4 ~2 v6 {: P+ X
) }; J1 H6 _: |5 _& K3 f5 h& W
最终得到的地址为 :0x40020818
: G( m8 d' t: L通常情况下向这个地址赋值即可实现指定位拉高拉低操作:
0 \4 C* c5 X6 C' s8 w9 T6 l* M, z*((volatile unsigned long *) 0x40020818) = 0x80000000  //!<拉高; s& e3 g3 o* l3 S3 ~$ n9 a7 H
*((volatile unsigned long *) 0x40020818) = 0x00008000  //!<拉低0 i& B6 d  o  @5 h, K  e
' [6 \, w# g; w9 e5 s
但通过位带,按照公式获取位带操作地址:
$ ^2 S! [) {6 V/*这是拉高时寄存器地址*/
2 u. t; ~+ t0 e- y: G3 j AddrH =  *((volatile unsigned long *)(( 0x40020818  & 0xF0000000)+0x2000000+(( 0x40020818  & 0xFFFFF)<<5)+(15 << 2)))  
# u* h# `' F1 t& _* dAddrH = 1;   //!<置1就拉高 ! b) v  T4 D1 c5 L2 N
/*这是拉低时寄存器地址*/4 {6 J5 {+ R" n
AddrL =  *((volatile unsigned long *)(( 0x40020818  & 0xF0000000)+0x2000000+(( 0x40020818  & 0xFFFFF)<<5)+((15+16) << 2)))
- N/ W* ?! d" {AddrL = 1;   //!<置1就拉低    7 Z3 {' L! D1 g' D. Z, h; U9 t
! a1 q; X) \$ J, q. n* Y
使用宏定义,即:(Addr为 GPIOC_BSRR  拉高时 BitNum为15 拉低时 BitNum是(15+16) )
* S$ {/ l, \/ p4 Q* j% e#define BitBand(Addr,BitNum) *((volatile unsigned long *)((Addr & 0xF0000000)+0x2000000+((Addr & 0xFFFFF)<<5)+(BitNum << 2)))
; G! x; v# H0 ]) T
" q7 H8 S6 |- r: Q* |2 |精简之后 ,位带操作   :
/ y* J7 ?0 S" V. E( a#define BitBand(Addr,BitNum) *((volatile unsigned long *)(PERIPH_BB_BASE|((Addr-PERIPH_BASE)<<5)|(BitNum << 2)))
. X' V% C" \6 _. q7 O& T9 ~8 z% G  W+ g' y& x2 G

/ M- T1 H  c$ ~' m' J. Y6 i
收藏 评论0 发布时间:2021-12-2 14:55

举报

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