STMCU小助手
发布时间:2021-12-1 21:47
|
手册中说:3 Q% M0 | f* H 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. 在这两个系列中外设和SRAM都有各自映射的位带区,以实现对位的单独操作。; r8 q# c. _8 Z The operations are only available for Cortex ® -M3 accesses, and not from other bus masters (e.g. DMA). 使用局限于M3内核。 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: 地址映射公式如下& A0 i1 `# i4 X) }# v! T" t7 ` bit_word_addr = bit_band_base + ( byte_offset x 32) + ( bit_number × 4)- p/ }) s5 e/ m/ Q6 g5 g where: – bit_word_addr is the address of the word in the alias memory region that maps to the targeted bit/ n2 k7 g, m+ n! j4 q: y' ? 一位扩展成了一个字。 – bit_band_base is the starting address of the alias region6 I1 ~5 N* ^, l* c: K 位带基地址是对应位带的起始地址。; h1 g# k* @: P6 G. Y – byte_offset is the number of the byte in the bit-band region that contains the targeted bit 这里的偏移值为包含操作位的寄存器偏移值。- A* W S7 p4 `( \/ G1 g6 j – bit_number is the bit position (0-7) of the targeted bit 3 }8 \! k$ s8 E, } 这里的位就是目标位。" l* D; J- z: \+ Y7 h; w* N M/ z ! U; P) I6 z5 x' l- ^& M 位带区在 SRAM上的地址范围:0x20000000 ~ 0x200FFFFF(SRAM区中最低1MB) 位带识别区在SRAM上的地址范围: 0x22000000 ~ 0x220FFFFF 位带区在片上外设的地址范围:0x4000 0000-0x400F FFFF(片上外设区中的最低1MB), 位带识别区在片上外设的地址范围:0x4200 0000~0x42FF FFFF;$ H* ?4 P. O- `$ b/ e2 N2 f! j% v. z 对应关系:位带区的每个bit位的值 对应 位带识别区1个 32位的地址的内容; 所以位带操作是:当你通过位带别名区访问这些32位的地址的内容时,就可以达到访2 |/ p, x- [0 H* S# Y9 { 问位带区对应的比特位。0 K( H/ ~9 v$ _ 举例: 要给GPIO PC15做拉高拉低操作。 首先找到操作寄存器的地址: GPIO为外设,故需用外设的基地址: PERIPH_BASE ((uint32_t)0x40000000): R, ~3 G: `7 ~# A6 r8 h/ k GPIOC在AH1外设上,故在之前基础上再做偏移:AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000). s9 j3 v( q% [ l) r/ l 同时需要再加上GPIOC的偏移: GPIOC_BASE (AHB1PERIPH_BASE + 0x0800) 然后找到位设置寄存器: GPIOC_BSRR (GPIOC_BASE + 0x18)% f; z3 b; x, y4 Z8 V5 R# m 最终得到的地址为 :0x40020818: i. i2 _, r* |8 B1 j8 q* J( p# \ 通常情况下向这个地址赋值即可实现指定位拉高拉低操作:7 {# H$ w+ [. F( Y5 m *((volatile unsigned long *) 0x40020818) = 0x80000000 //!<拉高* l3 f+ l' Y8 l1 w *((volatile unsigned long *) 0x40020818) = 0x00008000 //!<拉低$ b9 v! h+ W! T) ~ 但通过位带,按照公式获取位带操作地址: /*这是拉高时寄存器地址*/ AddrH = *((volatile unsigned long *)(( 0x40020818 & 0xF0000000)+0x2000000+(( 0x40020818 & 0xFFFFF)<<5)+(15 << 2))) AddrH = 1; //!<置1就拉高 # U4 ], [% l* h x7 v2 I /*这是拉低时寄存器地址*/ AddrL = *((volatile unsigned long *)(( 0x40020818 & 0xF0000000)+0x2000000+(( 0x40020818 & 0xFFFFF)<<5)+((15+16) << 2))) 3 R" o5 R; |: n- d2 Q AddrL = 1; //!<置1就拉低 " w6 s' Z0 O7 B# ^7 l 使用宏定义,即:(Addr为 GPIOC_BSRR 拉高时 BitNum为15 拉低时 BitNum是(15+16) )* Q" v5 {. \7 y" \+ ?. U #define BitBand(Addr,BitNum) *((volatile unsigned long *)((Addr & 0xF0000000)+0x2000000+((Addr & 0xFFFFF)<<5)+(BitNum << 2))) K+ V2 P5 c6 ? F/ M$ _ 精简之后 ,位带操作 :( w, D( J% U! t8 K #define BitBand(Addr,BitNum) *((volatile unsigned long *)(PERIPH_BB_BASE|((Addr-PERIPH_BASE)<<5)|(BitNum << 2))) - U( f3 ~6 P5 U |
微信公众号
手机版