STM32/GD32学习指南-踩坑之(四)GPIO作为简单IO,配置为输出模式时初始状态的注意事项

无论是GD32还是STM32,当GPIO配置为输出模式时,初始化完成后,都有一个初始的输出状态,有的可能时高电平,有的可能是低电平,不配置的话,可能初始化后一瞬间的上升或下降沿信号的输出,会对一些外围器件产生期望之外的操作等

例如如下的GPIO初始化的操作代码

当初始化只配置了时钟和输出参数时,用示波器查看波形,初始化一瞬间会有一个2ms的低电平,然后变为高电平,如果有哪个外设连接到该GPIO并且为低电平或下降沿复位的话,很有可能该外设就被复位掉了。

/**
  *功能:初始化GPIO参数
  *入参1:GPIO号
  *返回值:无
  */
void gd_gpio_init (uint32_t gpioNum, uint32_t gpio_mode, uint32_t gpio_pupd)
{
    /* 初始化GPIO时钟 */
    rcu_periph_clock_enable(GPIO_CLK[gpioNum]);

    /* 配置GPIO模式和输出选项 */ 
    gpio_mode_set(GPIO_PORT[gpioNum], gpio_mode, gpio_pupd,GPIO_PIN[gpioNum]);
    gpio_output_options_set(GPIO_PORT[gpioNum], GPIO_OTYPE_PP,                   
          GPIO_OSPEED_50MHZ,GPIO_PIN[gpioNum]);
}

 所有GPIO配置为输出模式时,初始化后需要给一个确定的输出状态,GPIO_BOP为置高,GPIO_BC为置低

/**
  *功能:GPIO输出置1
  *入参1:GPIO号
  *返回值:无
  */
void gd_gpio_on(uint32_t gpioNum)
{
    GPIO_BOP(GPIO_PORT[gpioNum]) = GPIO_PIN[gpioNum];
}

/**
  *功能:GPIO输出置0
  *入参1:GPIO号
  *返回值:无
  */
void gd_gpio_off(uint32_t gpioNum)
{
    GPIO_BC(GPIO_PORT[gpioNum]) = GPIO_PIN[gpioNum];
}

过程中还这样试过:

在初始化代码前,先将GPIO的输出寄存器置高,再对GPIO初始化,用示波器测量,低电平的时间从2ms变成了1ms,时间缩短了,对应控制的外设确实没有被复位,但是还是有风险

所以建议,对与控制外设低电平复位的GPIO,如果不想上电被再复位一次,建议哪里用到复位功能,再进行初始化,然后通过GPIO_BC置低,再延时即可,不要上电就初始化对应的GPIO

猜你喜欢

转载自blog.csdn.net/qq_38584212/article/details/132271658