1.位带操作的意义
GPIO_SetBits、GPIO_ResetBits、GPIO_WriteBit操作IO口的性能没有达到极致,因为这些函数都需要进行现场保护和现场恢复的动作,比较耗时间,没有进行一步到位,使用位带操作则没有上述的烦恼,简单快速。
2.公式
关于IO引脚对应的访问地址,可以参考以下公式
寄存器的位带别名 = 0x42000000 + (寄存器的地址-0x40000000)*32 + 引脚编号*4
例子如下:
uint32_t *PF9_BitBand = (uint32_t *)(0x42000000 + (GPIOF_BASE + 0x14 - 0x40000000)*32 + 9*4);
用法:*PF9_BitBand=1;
uint32_t *PF9_BitBand是定义一个PF9_BitBand的指针,等号右边的(uint32_t *)是强制转换。
GPIOF_BASE是F口的基地址,那为啥要加0X14呢,这是因为配置是输出口地址偏移为0x14,如果是输入口为0X10.具体可以看如下的结构体。
typedef struct
{
__IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */
__IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */
__IO uint