简单易懂的STM32外部中断实现按键输入判断

简单的按键输入中断判断方法

1.了解按键的接线。常见的按键接线方式是:按键一端接到MCU,另外一端接到GND。如下图所示:
简单易懂的STM32外部中断实现按键输入判断_第1张图片

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电容。

你可能感兴趣的:(STM32初级篇)