简单的按键输入中断判断方法
1.了解按键的接线。常见的按键接线方式是:按键一端接到MCU,另外一端接到GND。如下图所示:
2.第一部分按键引脚初始化程序:需要结合你的电路图。本文中的按键连接到PC6,所以初始化STM32中C组的第6引脚为输入。
第二部分是NVIC初始化:
设置中断源:哪一个引脚就对应哪一个中断源。
设置IRQ通道:每一个引脚对应的通道不一样,可以跳转到stm32f10x.h文件中查看。
分配抢占优先级和响应优先级。注意一个工程的NVIC分组是同一个,对应的设置可以查看NVIC表格(网上有很多,可自行查找)。
第三部分:外部中断的配置。
配置外部中断线。每一个引脚对应一条中断线。
配置中断方式:中断或是事件。
配置边沿触发:上升沿、下降沿、边沿。
/*
*功能:KEY初始化
* 参数:无
* 返回值:无
*/
void KEY_Init(void)
{
EXTI_InitTypeDef EXTI_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
/************* 第一部分 **************/
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStruct);
/************* 第二部分 **************/
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource6);
NVIC_InitStruct.NVIC_IRQChannel=EXTI9_5_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&NVIC_InitStruct);
/************* 第三部分 **************/
EXTI_InitStruct.EXTI_Line=EXTI_Line6;
EXTI_InitStruct.EXTI_LineCmd=ENABLE;
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStruct);
}
3.中断服务程序,在中断处理函数里面可以实现简单的处理程序。尽量不要在里面处理太多东西,内容尽量的少。
//按键中断服务程序
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line6) != RESET) //检测是否触发对应的中断
{
delay_ms(10);
key1_on=~key1_on;
if(key1_on)
{
LCD_ShowString_12X24(24*6,5, "LED", White, Black,1);
}
else
{
LCD_ShowString_12X24(24*6,5, " ", White, Black,1);
}
}
EXTI_ClearITPendingBit(EXTI_Line6);
}
注意:可能遇到的问题
问题:按键反应太过灵敏,有时候按一次会触发多次。
解决:在按键的两端(上图中的4和2)连接一个104电容。