打印
[STM32F4]

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

[复制链接]
3256|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 liuyuliuyuliuyu 于 2015-12-22 10:12 编辑

开发环境:MDK5.14 和STM32CubeMX4.11。
在上一个帖子Hello流水灯(https://bbs.21ic.com/forum.php?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灯分别会依次点亮和依次熄灭。
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

184

帖子

3

粉丝