前言:程序以10ms定时中断处理按键,设置按键标志位,防止多次执行。
一、CubeMX配置:
定时器配置:
打开中断NVIC:
按键配置略:
由于按键为按下低电平,故设置为上拉输入。
二、代码部分:
在main中开启定时器1:
HAL_TIM_Base_Start_IT(&htim1);
创建interrupt.h和interrupt.c文件用于写关于中断的代码
interrupt.h代码:
#ifndef _INTERRUPT_H
#define _INTERRUPT_H
#include "main.h"
#include "tim.h"
#include "led.h"
#include "stdbool.h"
struct keys{
uint8_t flag;
bool state;
bool signal;
};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
#endif
解释:设置keys结构体,bool state为按键此时的状态,uint8_t flag为标志位,bool signal为按键触发信号,在按键事件被处理后要将signal清零,防止被多次触发。
interrupt.c代码:
#include "interrupt.h"
struct keys key[4]={0,0,0,0};
void Keyprocess(){
key[0].state = !HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
key[1].state = !HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
key[2].state = !HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
key[3].state = !HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
for(int i=0;i < 4;i++){
if(key[i].state == true){
if(key[i].flag == 0) key[i].flag ++;
else if(key[i].flag == 1){
key[i].signal = 1;
key[i].flag ++;
}
}
else{
key[i].flag = 0;
key[i].signal = 0;
}
}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==htim1.Instance) //10ms中断
{
Keyprocess();
}
}
解释:该程序含有四个按键,由于是上拉输入,故将读取结果取非。当按键按下时判断标志位,首次进入flag由0变1,10ms后下一次进入程序,若仍为按下状态则确定状态为按下按键挂起按键信号signal,此过程为消抖及消去电平跳变所带来的干扰的过程。 HAL_TIM_PeriodElapsedCallback为10ms中断处理。
主程序中处理按键方法:
extern struct keys key[];
if(key[0].signal == 1){
//按键按下时的处理代码
key[0].signal = 0;
}
注意:清除signal标志位!