位带及位带别名区的关系:
位带是指在存储区中可以按位操作的地带;
位带别名区(Bit Band Alias)是指存储区的另一个区域,该区域中的每1个字与位带中的1个位一一对应。
对位带区的1个位的操作和对对应的别名区中的】个字的操作结果一样,但对位带别名区操作代码效率更高。STM32F407中有两个区域支持位带,一个是SRAM区的最低1MB范围(0x2000 0000~0x200FFFFF),另一个是片内外设区的最低1MB范围(0x4000 0000~0x400F FFFF)。这两个区中的地址除了可以像普通的 RAM一样使用,它们还都有自己的“位带别名区”,位带别名区把位带区的每个位膨胀成一个32 位的字,即每个位带别名区有 32MB。其中,SRAM的位带别名区的地址范围为:0x22000000~0x23FF FFFF;片内外设的位带别名区的地址范围为:0x4200 0000~0x43FF FFFF。
GPIOF_ODR的bit9映射到位带别名区的地址的计算:
0x4002 1414&0xf000 0000 + 0x200 0000 +(0x4002 1414&0xfffff)<<5 + 9<<2 = 0x4242 82A4
> 故定义:
#define LED0 (*(volatile unsigned *)0x424282A4)
方便以下LED0的使用.
LED0定义宏
#define LED0 (*(volatile unsigned *)0x424282A4)
main.c
//GPIOF口相关寄存器的定义
/*将项目2-1中的7)、regdef.h文件下//GPIOF口相关寄存器的定义拷贝过来*/
//注意,只需复制定义,不用复制条件编译
//GPIOF口相关寄存器的定义
#define GPIOF_MODER (*(volatile unsigned *)0x40021400) //端口x输入输出模式配置寄存器,控制位=00输入,=01通用输出,=10复用,=11模拟
#define GPIOF_OTYPER (*(volatile unsigned *)0x40021404) //端口输出类型配置寄存器。=0推挽输出,=1开漏输出
#define GPIOF_OSPEEDR (*(volatile unsigned *)0x40021408) //端口x输出速度配置寄存器。=00,2MHz;=01,25M;=10,50M;=11,30pF时为100M.
#define GPIOF_PUPDR (*(volatile unsigned *)0x4002140C) //端口上拉下拉配置寄存器。=00无上下拉,=01上拉,=10下拉,=11保留
#define GPIOF_ODR (*(volatile unsigned *)0x40021414) //端口输出数据寄存器,某位=0对应端口输出低电平,=1输出高电平。
//时钟系统相关寄存器的定义
#define RCC_CR (*(volatile unsigned *)0x40023800)
#define RCC_PLLCFGR (*(volatile <