最近在学习HAL库的过程中,遇到了一些疑问,通过Goto发现,所有对GPIO引脚状态的设置函数均是对相关寄存器进行操作,这里只探讨我所遇见的疑问,请各位大佬指点。这里需要记在以下两点重要知识点,方便理解。
- 所有配置GPIO数据的库函数,均是设置ODR,BSRR,BRR 寄存器直接来控制引脚输出状态。
- ODR、BSRR、BRR寄存器均为32位。
主要参考以下大佬的博客:
BSRR代码
void SCL_OutPut(iic_bus_t *Bus, uint16_t Value)
{
if(Value)
{
Bus ->IIC_SCL_PORT->BSRR |= Bus->IIC_SCL_PIN;
}
else
{
Bus->IIC_SCL_PORT->BSRR = (uint32_t)Bus->IIC_SCL_PIN << 16U;
}
}
此代码中,通过直接操作BSRR寄存器即可实现IIC发送一位数据,对我这种常年调库的菜鸡来说,一下干到寄存器直接懵逼,这个寄存器是干什么的,为什么对他操作,能实现相关GPIO端口Pin的高低电平转换,于是带着疑问,Goto了一下这个寄存器,发现他是在stm32f4xx_hal_gpio.h里面定义的一个结构体成员:
GPIO结构体定义
typedef struct
{
__IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */
__IO uint32