STM32F2位带操作

手册中说:
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都有各自映射的位带区,以实现对位的单独操作。
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:
地址映射公式如下
                               bit_word_addr bit_band_base + (byte_offset x 32) + (bit_number × 4)
where:
– 
bit_word_addr is the address of the word in the alias memory region that maps to the targeted bit
一位扩展成了一个字。
– 
bit_band_base is the starting address of the alias region
位带基地址是对应位带的起始地址。
– 
byte_offset is the number of the byte in the bit-band region that contains the targeted bit
这里的偏移值为包含操作位的寄存器偏移值。
– 
bit_number is the bit position (0-7) of the targeted bit  
这里的位就是目标位。

位带区在SRAM上的地址范围:0x20000000 ~ 0x200FFFFF(SRAM区中最低1MB)
位带识别区在SRAM上的地址范围: 0x22000000 ~ 0x220FFFFF
位带区在片上外设的地址范围:0x4000 0000-0x400F FFFF(片上外设区中的最低1MB),
位带识别区在片上外设的地址范围:0x4200 0000~0x42FF FFFF;
对应关系:位带区的每个bit位的值 对应 位带识别区1个 32位的地址的内容;
所以位带操作是:当你通过位带别名区访问这些32位的地址的内容时,就可以达到访
问位带区对应的比特位。

举例:
要给GPIO PC15做拉高拉低操作。
首先找到操作寄存器的地址:
GPIO为外设,故需用外设的基地址:                   PERIPH_BASE               ((uint32_t)0x40000000)
GPIOC在AH1外设上,故在之前基础上再做偏移:AHB1PERIPH_BASE       (PERIPH_BASE + 0x00020000)
同时需要再加上GPIOC的偏移:                         GPIOC_BASE                  (AHB1PERIPH_BASE + 0x0800)
然后找到位设置寄存器:                                   GPIOC_BSRR                  (GPIOC_BASE + 0x18)

最终得到的地址为 :0x40020818
通常情况下向这个地址赋值即可实现指定位拉高拉低操作:
*((volatile unsigned long *)0x40020818) = 0x80000000  //!<拉高
*((volatile unsigned long *)0x40020818) = 0x00008000  //!<拉低

但通过位带,按照公式获取位带操作地址:
/*这是拉高时寄存器地址*/
 AddrH = 
*((volatile unsigned long *)((0x40020818 & 0xF0000000)+0x2000000+((0x40020818 & 0xFFFFF)<<5)+(15 << 2)))  
AddrH = 1;   //!<置1就拉高 

/*这是拉低时寄存器地址*/
 AddrL = 
*((volatile unsigned long *)((0x40020818 & 0xF0000000)+0x2000000+((0x40020818 & 0xFFFFF)<<5)+((15+16) << 2))) 
AddrL = 1;   //!<置1就拉低  

使用宏定义,即:(Addr为GPIOC_BSRR 拉高时BitNum为15 拉低时BitNum是(15+16)
#define BitBand(Addr,BitNum) *((volatile unsigned long *)((Addr & 0xF0000000)+0x2000000+((Addr & 0xFFFFF)<<5)+(BitNum << 2))) 

精简之后,位带操作 
#define BitBand(Addr,BitNum) *((volatile unsigned long *)(PERIPH_BB_BASE|((Addr-PERIPH_BASE)<<5)|(BitNum << 2)))
STM32 F1-F2-F4 比较.pdf STM32各系列比较: F1-F2-F4STM32 – 领先的Cortex-M 产品家族 闪存容量 (字节) 1024K STM32F407VG STM32F417VG STM32F407ZG STM32F417ZG STM32F407IG STM32F417IG STM32F405RG STM32F415RG STM32F405VG STM32F415VG STM32F405ZG STM32F415ZG STM32F207VG STM32F217VG STM32F207ZG STM32F217ZG STM32F207IG STM32F217IG STM32F205RG STM32F215RG STM32F205VG STM32F215VG STM32F205ZG STM32F215ZG STM32F101RG STM32F103RG STM32F101VG STM32F103VG STM32F101ZG STM32F103ZG 768K STM32F205RF STM32F205VF STM32F207VF STM32F205ZF STM32F207ZF STM32F207IF STM32F101RF STM32F103RF STM32F101VF STM32F103VF STM32F101ZF STM32F103ZF 512K STM32F407VE STM32F417VE STM32F407ZE STM32F417ZE STM32F407IE STM32F417IE STM32F207VE STM32F217VE STM32F207ZE STM32F217ZE STM32F207IE STM32F217IE STM32F205RE STM32F215RE STM32F205VE STM32F215VE STM32F205ZE STM32F215ZE STM32F101RE STM32F101VE STM32F101ZE STM32F100RE STM32F103RE STM32F100VE STM32F103VE STM32F100ZE STM32F103VE 384K STM32F101RD STM32F101VD STM32F101ZD STM32F100RD STM32F103RD STM32F100VD STM32F103VD STM32F100ZD STM32F103ZD 256K STM32F205RC STM32F205VC STM32F207VC STM32F205ZC STM32F207ZC STM32F207IC STM32F105RC STM32F105VC STM32F101RC STM32F107RC STM32F101VC STM32F107VC STM32F101ZC STM32F100RC STM32F103RC STM32F100VC STM32F103VC STM32F100ZC STM32F103ZC 128K STM32F205RB STM32F205VB STM32L151CB STM32L152CB STM32L151RB STM32L152RB STM32L15VB STM32L152VB STM32F105R8 STM32F105VB STM32F103TB STM32F101CB STM32F103CB STM32F101RB STM32F103RB STM32F101VB STM32F107VB STM32F101TB STM32F100CC STM32F102CB STM32F100RB STM32F102RB STM32F100VB STM32F103VB 64K STM32L151C8 STM32L152C8 STM32L151R8 STM32L152R8 STM32L15V8 STM32L152V8 STM32F105R8 STM32F105V8 STM32F103T8 STM32F101C8 STM32F103C8 STM32F101R8 STM32F103R8 STM32F101V8 STM32F103V8 STM32F101T8 STM32F100C8 STM32F102C8 STM32F100R8 STM32F102R8 STM32F100V8 STM32L151C6 STM32L152C6 STM32L151R6 STM32L152R6 32K STM32F103T6 STM32F101C6 STM32F103C6 STM32F101R6 STM32F103R6 STM32F101T6 STM32F100C6 STM32F102C6 STM32F100R6 STM32F102R6 16K STM32F103T
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值