参考资料:
- STM32F4xx中文参考手册
一、STM32F429位带区与位带别名区
- 片上外设(Peripheral)和SRAM都有1MB的位带区。
- 位带区中的每个位,都可以通过位带别名区中的地址来访问。
- 位带区中的一个位,对应位带别名区中的4个字节。
二、地址转换
- 外设位带区与外设位带别名区的地址转换:
AliasAddr = 0x42000000 + (A - 0x40000000)*8*4 + n*4
- SRAM位带区与SRAM位带别名区的地址转换:
AliasAddr = 0x22000000 + (A - 0x20000000)*8*4 + n*4
其中,AliasAddr表示位带别名区地址,A表示我们要操作的位所在寄存器的地址,n为位号。
- 将上述两个公式统一为一个:
((addr & 0xF0000000) + 0x02000000 + ((addr & 0x000FFFFF) << 5) + (bitnum << 2))
其中,addr表示要操作的位所在寄存器的地址,bitnum表示位号,即寄存器中的第几位。
三、应用
目标:通过位带操作控制LED
- 新建位带操作头文件bitband.h,并添加至工程
- 编写bitband.h
#define GPIOB_ODR_ADDR (GPIOB_BASE + 0x14)
#define BITBAND(addr, bitnum) ((addr & 0xF0000000) + 0x02000000 + ((addr & 0x000FFFFF) << 5) + (bitnum << 2))
#define PBout(n) (*(volatile unsigned long *)(BITBAND(GPIOB_ODR_ADDR, n)))
- main.c
#include "stm32f4xx.h"
#include "led.h"
#include "bitband.h"
int main(void)
{
GPIO_Config();
PBout(1) = 0; // 点亮 LED0
PBout(0) = 0; // 点亮 LED1
while(1)
{
}
}
- 编译运行即可