目录
一、位带操作
位带操作:由于板子是32位的,在进行寄存器操作时,按照32位操作更加快速,因此,比如我们要将GPIOB的ODR寄存器首位置1,前面的方法是通过库函数,配置好时钟、输出速率、模式等后,可以通过GPIO_SetBits库函数实现置位,也可以使用预设好的位带,通过宏定义这个位带,进行相应的置位操作。
可以进行位带操作的是SRAM和片上外设的前1MB空间,这1024*1024*8个位(1MB=1024KB=1024*1024 Byte=1024*1024*8 bit)已有映射好的位带,映射如下图所示,使用公式即可进行换算。
二、位带宏定义
例如我们要对GPIOB的ODR进行位带操作,定义好ODR的地址之后:
第一次与操作:辨别最高位,是4则是片上外设,是2则是片上SRAM;
加0X02000000:位带别名起始地址是0X42000000或者0X22000000;
与0x00FFFFFF:屏蔽高三位,相当于减去位带起始地址
<<5:字节中的1位膨胀成4位,*8*4也即2^5
<<2:序号位膨胀成4位
#define GPIOB_ODR_Addr (GPIOB_BASE+0x0C)
#define PBout(a) *(unsigned int*)((GPIOB_ODR_Addr & 0xF0000000)\
+0x02000000+((GPIOB_ODR_Addr & 0x00FFFFFF)<<5)+(a<<2))
三、主程序
宏定义好上述位带后,传入需要操作的位号,即可进行位带操作。
int main(void)
{
Button_GPIO_Config();
LED_GPIO_Config();
PBout(0) = 1;
}
参考
[野火®]STM32库开发实战指南——基于野火指南者开发板 — [野火]STM32库开发实战指南——基于野火指南者开发板 文档