打印
[应用相关]

STM32外部中断实现按键输入判断

[复制链接]
439|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
简单的按键输入中断判断方法
1.了解按键的接线。常见的按键接线方式是:按键一端接到MCU,另外一端接到GND。如下图所示:


使用特权

评论回复
沙发
斧王FUWANG|  楼主 | 2022-3-31 17:06 | 只看该作者
2.第一部分按键引脚初始化程序:需要结合你的电路图。本文中的按键连接到PC6,所以初始化STM32中C组的第6引脚为输入。

使用特权

评论回复
板凳
斧王FUWANG|  楼主 | 2022-3-31 17:06 | 只看该作者
第二部分是NVIC初始化:
设置中断源:哪一个引脚就对应哪一个中断源。
设置IRQ通道:每一个引脚对应的通道不一样,可以跳转到stm32f10x.h文件中查看。
分配抢占优先级和响应优先级。注意一个工程的NVIC分组是同一个,对应的设置可以查看NVIC表格(网上有很多,可自行查找)。

使用特权

评论回复
地板
斧王FUWANG|  楼主 | 2022-3-31 17:07 | 只看该作者
第三部分:外部中断的配置。
配置外部中断线。每一个引脚对应一条中断线。
配置中断方式:中断或是事件。
配置边沿触发:上升沿、下降沿、边沿。

使用特权

评论回复
5
斧王FUWANG|  楼主 | 2022-3-31 17:08 | 只看该作者
/*
*功能: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);
}

使用特权

评论回复
6
斧王FUWANG|  楼主 | 2022-3-31 17:09 | 只看该作者
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);
}

使用特权

评论回复
7
斧王FUWANG|  楼主 | 2022-3-31 17:10 | 只看该作者
注意:可能遇到的问题
问题:按键反应太过灵敏,有时候按一次会触发多次。
解决:在按键的两端(上图中的4和2)连接一个104电容。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

259

帖子

0

粉丝