本帖最后由 liuyuliuyuliuyu 于 2015-12-22 10:12 编辑
开发环境:MDK5.14 和STM32CubeMX4.11。
在上一个帖子Hello流水灯(https://bbs.21ic.com/forum.html?mo ... peid%26typeid%3D350)的基础上,利用GPIO的输入功能加入按键控制。先上电路图:
通过电路图可以看出,与按键控制相关的引脚为PA0,按键按下时为高电平。获取按键的值有两种方法,第一种是把PA0配置成普通输入模式,直接读PA0的值来判断按键是否按下,第二种是把PA0配置成中断模式,通过中断的方式判断按键是否按下。前一种方法需要通过轮询的方式实现,实时性不如中断方式。下面分别实现两种方法:
(1)轮询,PA0配置成普通输入模式
先在STM32CubeMX4.11中配置PA0,先找到PA0,选择GPIO_Input模式。在Configuration栏的GPIO里配置PA0。具体配置过程如下:
配置完成后,就可以生成工程了。
打开MDK工程,在main.c文件的main函数的while循环中代码替换为:
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_SET) //读引脚状态,并判断是否为高电平
{
HAL_Delay(20); //延时消抖
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_SET)
{
HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_6);
HAL_Delay(100);
HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_4);
HAL_Delay(100);
HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_5);
HAL_Delay(100);
HAL_GPIO_TogglePin(GPIOK,GPIO_PIN_3);
HAL_Delay(100);
}
}
编译,下载,通过按键,4个LED灯分别会依次点亮和依次熄灭。
(2)中断,PA0配置成外部中断模式
在STM32CubeMX4.11中将PA0的模式改为GPIO_EXTI0模式。点击Configuration栏的GPIO项,配置PA0为上升沿中断模式;点击Configuration栏的NVIC项,使能EXTI line0 interrupt,并配置优先级,也可以改变优先级分组。具体配置过程如下:
配置完成后,就可以生成工程了。
打开MDK工程,在main.c文件的main函数的while循环中不加入任何代码。在gpio.c文件中直接加入中断处理的回调函数,不需要声明。程序中,会通过中断处理函数调用该函数。如果没有生成gpio.c文件的话可以直接在main.c文件中加入。具体代码如下:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_0)
{
HAL_Delay(20);
if (GPIO_Pin == GPIO_PIN_0)
{
HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_6);
HAL_Delay(100);
HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_4);
HAL_Delay(100);
HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_5);
HAL_Delay(100);
HAL_GPIO_TogglePin(GPIOK,GPIO_PIN_3);
HAL_Delay(100);
}
}
}
编译,下载,通过按键,4个LED灯分别会依次点亮和依次熄灭。
|