[STM32F4] 【STM32F469I试用】+3.STM32CubeMX按键控制流水灯(轮询,中断)

[复制链接]
3634|0
 楼主| liuyuliuyuliuyu 发表于 2015-12-18 19:33 | 显示全部楼层 |阅读模式
本帖最后由 liuyuliuyuliuyu 于 2015-12-22 10:12 编辑

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

  1. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  2. {
  3.   if (GPIO_Pin == GPIO_PIN_0)
  4.   {
  5.                 HAL_Delay(20);
  6.                 if (GPIO_Pin == GPIO_PIN_0)
  7.                 {
  8.                         HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_6);
  9.                         HAL_Delay(100);
  10.                         HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_4);
  11.                         HAL_Delay(100);
  12.                         HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_5);
  13.                         HAL_Delay(100);
  14.                         HAL_GPIO_TogglePin(GPIOK,GPIO_PIN_3);
  15.                         HAL_Delay(100);
  16.                 }
  17.   }
  18. }
编译,下载,通过按键,4个LED灯分别会依次点亮和依次熄灭。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

184

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部