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

【经验分享】STM32F2位带操作

[复制链接]
STMCU小助手 发布时间:2021-12-2 14:55
手册中说:
1 ~7 R* G( Y) ^9 `: e% m* ?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.
( q, \1 `7 ?$ I在这两个系列中外设和SRAM都有各自映射的位带区,以实现对位的单独操作。
6 L: s9 w. H$ [6 c  |& UThe operations are only available for Cortex ® -M3 accesses, and not from other bus masters (e.g. DMA).
2 w. ]) i  E9 r- u7 h( t2 A. N! K: `使用局限于M3内核。. I) b6 p, ~, {  }) [- W
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:1 m6 B) s7 g7 ]8 T4 _- N  S" k
地址映射公式如下+ E( p0 v7 U! g$ v
                               bit_word_addr  =  bit_band_base  + ( byte_offset  x 32) + ( bit_number  × 4)& J& m6 Z* s" c
where:
& P7 |/ N) P* G+ t: U& p3 W+ P1 n–  bit_word_addr  is the address of the word in the alias memory region that maps to the targeted bit
- y, y! ?& z2 J! R一位扩展成了一个字。
. d2 S6 b- O6 Q0 @; i. h+ L. S–  bit_band_base  is the starting address of the alias region
1 K6 ~  w% [* \2 D位带基地址是对应位带的起始地址。4 G$ W  k4 H' r- k+ f
–  byte_offset  is the number of the byte in the bit-band region that contains the targeted bit
5 o/ n/ k- `% P- ]$ \这里的偏移值为包含操作位的寄存器偏移值。5 E' Q$ ~: `. u& X# }, o
–  bit_number  is the bit position (0-7) of the targeted bit  
/ l1 p# T9 K7 k' {这里的位就是目标位。
2 i' r: c& C6 E+ W9 y2 q
4 b- \% u# V( S- @. x% p3 K位带区在 SRAM上的地址范围:0x20000000 ~ 0x200FFFFF(SRAM区中最低1MB)
# \, U. n8 o: L5 q8 r# _位带识别区在SRAM上的地址范围:   0x22000000 ~ 0x220FFFFF
0 Q6 b" T1 d3 j" v0 G5 q位带区在片上外设的地址范围:0x4000 0000-0x400F FFFF(片上外设区中的最低1MB),
, O0 Z3 w- D, n) A位带识别区在片上外设的地址范围:0x4200 0000~0x42FF FFFF;
1 p3 n/ k/ o1 l对应关系:位带区的每个bit位的值 对应 位带识别区1个 32位的地址的内容;! \* g8 O  ~3 L: Y
所以位带操作是:当你通过位带别名区访问这些32位的地址的内容时,就可以达到访1 @4 s; S+ b9 z0 U" C% M9 ?
问位带区对应的比特位。
# A1 B* e  `, z0 y$ {2 C4 j! {  M  \; E% p: r4 C5 }' M/ ~  a
举例:
' X0 q" ]5 `- A" Q5 s) P6 i要给GPIO PC15做拉高拉低操作。
( M$ X' M' z  F: z( V2 T首先找到操作寄存器的地址:) ~6 Y+ c  Q# w/ C0 ~
GPIO为外设,故需用外设的基地址:                   PERIPH_BASE               ((uint32_t)0x40000000)
5 C# s# p( W8 A4 G- p5 RGPIOC在AH1外设上,故在之前基础上再做偏移:AHB1PERIPH_BASE       (PERIPH_BASE + 0x00020000)
& y, D% m3 i! m0 C# Q7 \# I同时需要再加上GPIOC的偏移:                         GPIOC_BASE                  (AHB1PERIPH_BASE + 0x0800)8 j$ |$ m: i# m2 }
然后找到位设置寄存器:                                   GPIOC_BSRR                  (GPIOC_BASE + 0x18)
! Y. Q! |( t  E6 e9 O, @" j+ ?" s+ t
最终得到的地址为 :0x40020818- A1 c* r8 G- R# ^1 X
通常情况下向这个地址赋值即可实现指定位拉高拉低操作:8 l6 L6 K6 y2 u% `
*((volatile unsigned long *) 0x40020818) = 0x80000000  //!<拉高: {( M( L# Z% n7 |0 a! H
*((volatile unsigned long *) 0x40020818) = 0x00008000  //!<拉低
, V  A( S- o2 W: p4 v0 F1 V5 c6 \; P1 W8 {/ X, [
但通过位带,按照公式获取位带操作地址:
8 @) z5 ^: s' ]/*这是拉高时寄存器地址*/
4 l; J4 g8 g, |- @( F9 K AddrH =  *((volatile unsigned long *)(( 0x40020818  & 0xF0000000)+0x2000000+(( 0x40020818  & 0xFFFFF)<<5)+(15 << 2)))  0 ~) n7 }$ v3 k
AddrH = 1;   //!<置1就拉高
, c* Q" A/ @. H+ J/*这是拉低时寄存器地址*/- d  {( u& @) @1 J# M
AddrL =  *((volatile unsigned long *)(( 0x40020818  & 0xF0000000)+0x2000000+(( 0x40020818  & 0xFFFFF)<<5)+((15+16) << 2)))
& H3 S- ], \( \, IAddrL = 1;   //!<置1就拉低    # R! k4 `6 Z- e* @9 ]

6 O) {: L& d, j2 G/ C6 f使用宏定义,即:(Addr为 GPIOC_BSRR  拉高时 BitNum为15 拉低时 BitNum是(15+16) )5 k1 t" r( _" Y% I  T/ M. r
#define BitBand(Addr,BitNum) *((volatile unsigned long *)((Addr & 0xF0000000)+0x2000000+((Addr & 0xFFFFF)<<5)+(BitNum << 2))) " K( b; u. o/ t) ]

0 H4 w, E+ B" ~" A- {4 e2 @精简之后 ,位带操作   :, W2 z0 @+ M5 W* z' @0 i" G: W
#define BitBand(Addr,BitNum) *((volatile unsigned long *)(PERIPH_BB_BASE|((Addr-PERIPH_BASE)<<5)|(BitNum << 2)))! e, T* R' X# y! a, e: ]- M
6 k/ a9 d4 ^( C: w) ]4 ~4 n* f

2 N2 `8 L7 f* u; A
收藏 评论0 发布时间:2021-12-2 14:55

举报

0个回答

所属标签

相似技术帖

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