虽然推挽输出可以输出高电平,但是输出能力是有限的,它仅仅只能够驱动一些电流不大的器件比如LED灯,如果是其他电流消耗较大的器件,直接使用推挽输出的话,很可能会导致这个引脚的损坏。
先来介绍一下本次使用的GD32芯片的固件库函数:
systick_config();//系统时钟的配置函数,配置系统的滴答定时器。
rcu_periph_clock_enable(RCU_GPIOA)//使能外设时钟GPIOA
gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_8)//设置GPIO模式,参数分别是端口、引脚模式(选择输入输出模式)、选择是否带上下拉电阻、引脚选择
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);//设置GPIO输出模式和速度,参数分别是端口、输出的模式、输出的最大速度、和具体的引脚号
gpio_bit_reset(GPIOA,GPIO_PIN_8)//复位引脚值,即输出低电平
gpio_bit_set(GPIOA,GPIO_PIN_8)//输出高电平
我们要点亮的LED灯对应到GD32的引脚就是PC14和PC15,对应的代码中要进行修改
我们要点亮的LED灯对应到GD32的引脚就是PC14和PC15,对应的代码中要进行修改
以下是初始化函数和开关灯函数:
void Init_LEDGPIO(void)
{
rcu_periph_clock_enable(RCU_GPIOC);
gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_14 | GPIO_PIN_15);
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_14);//根据上图原理图所示,要实现输出低电平点亮LED灯,这里可以选择推挽输出
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);
}
void Open_LED(void)
{
gpio_bit_reset(GPIOC, GPIO_PIN_14);
gpio_bit_reset(GPIOC, GPIO_PIN_15);
}
void Close_LED(void)
{
gpio_bit_set(GPIOC, GPIO_PIN_14);
gpio_bit_set(GPIOC, GPIO_PIN_15);
}
按键检测

消抖分为硬件消抖和软件消抖:
硬件消抖一般会在按键检测引脚处加入电容与电阻,通过RC延迟电路将按键按下时的高频振荡吸收滤除掉。

软件消抖一般是通过延时。当检测到按键按下时,不会立即去检测电平,而是经过短暂的延时之后,再去检测当前引脚的电平这样就可以去掉抖动过程中的干扰,一般抖动时间在10ms以内。

驱动原理:驱动独立按键,首先需要判断按键两端的引脚,根据按键两侧引脚接法的不同,可分为两种情况:
按键一侧接电源:GPIO需要设置为下拉,也就是默认为低电平,通过判断对应GPIO引脚为高电平,从而判断按键是否按下

按键一侧接地:GPIO需要设置为上拉,也就是默认为高电平,通过判断对应GPIO引脚为低电平,从而判断按键是否按下,


按键原理图中的按键检测是接地的,所以GPIO引脚应该默认为高电平。我们要通过KEY1按键与KEY2按键来控制底板的LED灯,当KEY1按下时,底板LED2、LED3点亮,当KEY2按下时,底板LED2和LED3熄灭
这部分使用的函数和前面LED使用到的函数差不多,主要多了一个消抖时会用到的检测电平函数:
gpio_input_bit_get(GPIOC, GPIO_PIN_13)//参数是端口和引脚号,返回值是SET或者RESET
按键模块代码如下:
void Init_Key(void)
{
rcu_periph_clock_enable(RCU_GPIOB);
gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_13);
gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_14);
}
void Scanf_Key(void)
{
if(!gpio_input_bit_get(GPIOB, GPIO_PIN_13))
{
delay_1ms(10);
if (!gpio_input_bit_get(GPIOB, GPIO_PIN_13))
{
while(!gpio_input_bit_get(GPIOB, GPIO_PIN_13));//按键一直按下,等待一次按下结束后再进行之后的操作
Open_LED();
}
}
if(!gpio_input_bit_get(GPIOB, GPIO_PIN_14))
{
delay_1ms(10);
if (!gpio_input_bit_get(GPIOB, GPIO_PIN_13))
{
while(!gpio_input_bit_get(GPIOB, GPIO_PIN_13));
Close_LED();
}
}
}