无论是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