STM32F0xx_EXTI中断配置详细过程-按键检测

发布者:创意驿站最新更新时间:2019-01-15 来源: eefocus关键字:STM32F0xx_EXTI  中断配置  按键检测 手机看文章 扫描二维码
随时随地手机看文章

1、概述

EXIT外部中断在使用到按键或者开关控制等应用中比较常见,低功耗中断唤醒也是很常见的一种。因此,EXIT在实际项目开发中也是比较常见的一种。EXTI(External interrupt/event controller) —外部中断/事件控制器, 管理了控制器的 20个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。 EXTI 可以实现对每个中断/事件线进行单独置可以单独配置为中断或者事件,以及触发事件的属性。


EXTI功能框图:


EXTI功能框图


2、准备工作


本次采用按键作为触发源的方式来使得控制器产生中断,并在中断服务函数中执行相应的命令。按键按下->LED状态做出相应的改变,并尝试用不同优先级的中断来让LED灯做出相应的改变。


硬件设计:

 

轻触按键在按下时会使得引脚接通,通过电路设计可以使得按下时产生电平变化。


按键消抖硬件设计 


3、代码描述


3.1 初始化用来中断的GPIO


3.2 初始化EXTI


3.3 配置NVIC


3.4编写中断服务函数


按键和EXTI宏定义:


按键和EXTI宏定义


嵌套向量中断控制器NVIC配置:

/**************************************************/

static void NVIC_Configuration(void)

{

    NVIC_InitTypeDef    NVIC_InitStructure;


    /*配置中断源:KEY2*/

    NVIC_InitStructure.NVIC_IRQChannel = KEY2_INT_EXTI_IRQ;

    NVIC_InitStructure.NVIC_IRQChannelPriority = 1;  //指定IRQ通道的优先级在NVIC_IRQChannel中,这个参数可以设定为0到3之间

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);


    /*配置中断源:KEY1*/

    NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;

    NVIC_InitStructure.NVIC_IRQChannelPriority = 0;  //指定IRQ通道的优先级在NVIC_IRQChannel中,这个参数可以设定为0到3之间

    NVIC_Init(&NVIC_InitStructure);


}


这个优先级参数可以自行设定(参数设定为0到3之间,0的优先级最高)


EXTI中断配置:

/*中断EXTI_PA0配置初始化*/

void EXTI_PA0_Config(void)

{

    GPIO_InitTypeDef    GPIO_InitStructure;

    EXTI_InitTypeDef    EXTI_InitStructure;

    //时钟使能

    RCC_AHBPeriphClockCmd(KEY1_INT_GPIO_CLK,ENABLE);

    RCC_APB2PeriphClockCmd(KEY1_INT_EXTI_CLK,ENABLE);


    NVIC_Configuration();

    //外部按键GPIO初始化,PA0

    GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;


    GPIO_Init(KEY1_INT_GPIO_PORT,&GPIO_InitStructure);


    //将EXTI0指向PA0

    SYSCFG_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE,EXTI_PinSource0);

    //EXTI0中断线配置

    EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;

    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//下降沿中断


    EXTI_InitStructure.EXTI_LineCmd = ENABLE;

    EXTI_Init(&EXTI_InitStructure);

}


void EXTI_PA2_Config(void)

{

    GPIO_InitTypeDef    GPIO_InitStructure;

    EXTI_InitTypeDef    EXTI_InitStructure;

    //时钟使能

    RCC_AHBPeriphClockCmd(KEY2_INT_GPIO_CLK,ENABLE);

    RCC_APB2PeriphClockCmd(KEY2_INT_EXTI_CLK,ENABLE);


    NVIC_Configuration();

    //外部按键GPIO初始化,PA2

    GPIO_InitStructure.GPIO_Pin = KEY2_INT_GPIO_PIN;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;


    GPIO_Init(KEY2_INT_GPIO_PORT,&GPIO_InitStructure);


    //将EXTI2指向PA2

    SYSCFG_EXTILineConfig(KEY2_INT_EXTI_PORTSOURCE,EXTI_PinSource2);

    //EXTI2中断线配置

    EXTI_InitStructure.EXTI_Line = KEY2_INT_EXTI_LINE;

    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//下降沿中断


    EXTI_InitStructure.EXTI_LineCmd = ENABLE;

    EXTI_Init(&EXTI_InitStructure);

}



EXTI中断服务函数:

//KEY1_IRQHandler()中断服务函数

void KEY1_IRQHandler(void)

{

    if(EXTI_GetITStatus(EXTI_Line0)!=RESET) //确保中断是否产生

    {

        //中断处理

        LED_ON();

        delay_ms(500);

        LED_OFF();

        delay_ms(500);

        LED_ON();

        delay_ms(500);

        LED_OFF();

        delay_ms(500);

        LED_ON();

        delay_ms(500);

        LED_OFF();

        delay_ms(500);

        LED_ON();

        delay_ms(500);


    }

    EXTI_ClearFlag(EXTI_Line0); //清除中断标志位

}


//KEY2_IRQHandler()中断服务函数

void KEY2_IRQHandler(void)

{

    if(EXTI_GetITStatus(EXTI_Line2)!=RESET) //确保中断是否产生

    {

        //中断处理

        LED_OFF();//LED熄灭

        delay_ms(1000);

    }

    EXTI_ClearFlag(EXTI_Line2); //清除中断标志位


}


当中断发生时,相应的中断服务函数就会被执行,我们可以在中断函数中实现一些控制。 

一般为确保中断确实发生,我们会在中断服务函数中调用中断标志位状态读取函数读取外设中断标志位并判断标志位状态。


主函数:

#include "ALL_Includes.h" //包含所有的头文件


int main(void)

{

    //初始化函数

    LED_Init();

    Delay_Init(48);

    LED_ON();

    delay_ms(5000);


    EXTI_PA0_Config(); //初始化中断

    EXTI_PA2_Config();

    while(1)

    {

        //等待

    }

}


总结:


stm32f030的中断配置与stm32f103的中断配置是有些许的不同,但是大致还是差不多的。


关键字:STM32F0xx_EXTI  中断配置  按键检测 引用地址:STM32F0xx_EXTI中断配置详细过程-按键检测

上一篇:STM32中NVIC_Init导致的上电程序不运行
下一篇:stm32之中断系统

推荐阅读最新更新时间:2024-03-16 16:22

51单片机外设之——按键检测(带有标志位的按键识别法)
前面提到了独立按键的扫描方法(延时,消抖的方法),可见这种方法很大程度上可以实现按键的准确扫描。但是仔细一看,可以发现,它有一个缺点——存在while语句的松手检测! 试想,倘若我们一直按着按键不松手,那我们的程序毫无疑问的一直卡在了while语句的松手检测上。这在很多场合是并不适用的。 对于独立按键的博文中所提到的配合数码管显示的实例中,由于我们数码管显示函数display() 位于主函数中,假如我们按键长时间按下,一定会存在数码管不能显示的情况。所以接下来给出一种不需要while松手检测的按键扫描——带有标志位的按键识别(在矩阵键盘同样适用,这里以独立键盘为例)。 首先附上原理图: 用跳帽连接排针 J5 的2脚与3脚,将键
[单片机]
51单片机外设之——<font color='red'>按键</font>的<font color='red'>检测</font>(带有标志位的<font color='red'>按键</font>识别法)
STM32三线检测八个按键(74HC165)
STM32三线检测八个按键是典型的IO扩展应用(并转串),思路和学习51单片机时一致,下面直接上图和代码! 简述: 1.74HC165使用1、2、9脚,15脚可直接接地 2.按键低电平为按下 PA1- SL 并行数据加载 PA2- CLK 时钟 PA3- DAT 串行数据输出 代码: #include 74HC165.h #include delay.h void Init_74HC165(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GP
[单片机]
STM32三线<font color='red'>检测</font>八个<font color='red'>按键</font>(74HC165)
按键检测非阻塞代码(2种模式)
按键检测的2种模式(低电平触发和高电平触发) 12f509为控制芯片 GP5口是按键检测口 key_time_cnt//延时计数器 key_flag//按键标志(key_flag=1按键有效,否则无效) TIME_MAX//计数阀值 num//按键的功能变量 模式1(低电平触发) if(GP5==1)//如果I/O是高电平,说明没有键按下 { key_flag=0;//按键标志清零(无效) key_time_cnt=0;//延时计数器清零 } else if(key_flag==0)//这句话的意思其实是else if((key_flag==0)&&(GP5==0))按键被按下,而且是第一次被按下 { key_time_cnt+
[单片机]
<font color='red'>按键</font><font color='red'>检测</font>非阻塞代码(2种模式)
stm32中断配置(NVIC)
内嵌向量中断控制器:Nested Vectored Interrupt Controller (NVIC) NVIC优先级结构体定义: typedef struct { uint8_t NVIC_IRQChannel; /*! Specifies the IRQ channel to be enabled or disabled */ uint8_t NVIC_IRQChannelPreemptionPriority; /*! 主中断优先级范围:0-16 */ uint8_t NVIC_IRQChannelSubPriority; /*! 从优先级 范围:0-16 *
[单片机]
关于STM32配置中断和GPIO针脚问题
 STM32是用的什么开发环境?   STM32系列单片机,这款单片机功能强大,而且很容易学习,官方示例代码很多,稍加修改就可以开发自己的东西了。   嵌入式软体搭配最新版的STM32CubeMX个人电 脑开发 工具使用, 设计人员 可在绘图介面向导内配置微控制器,只要按一下,即可生成初始化C代码,直接用於多款市面上流行的 第三方开发 工具。   STM32Nucleo 开发板可让开发人员连接微控制器的全部I/O介面,并整合了ST-Link侦错器(debugger)/程式设计(programmer),无需单独安装侦错器。最後, STM32Nucleo 开发板拥有mbedTM功能,这表示该开发板可与个人电脑直接连结,并直接在mbed
[单片机]
STM8S103 独立按键检测
硬件环境采用STM8SF103,电压为3.3V。 电路需要注意的是STM8SF103这系列的IO作为输入口时只能是上拉输入和悬浮输入,虽然是弱上拉,在VCC为3.3V电压时,仍然能够被拉升至3.0V左右。 所以按键检测电路IO口一端需要接地,而不是外接上拉。悬浮方式下IO仍然会有0.89V左右电压,读取对应的IO寄存器IDR,仍然处于逻辑高电平状态。 软件代码相对很简单,只需要将IO口设置成上拉输入即可。采用轮询代码如下: //初始化只需要设置IO口模式即可。 GPIO_Init(KEY2_PORT,KEY2_PIN,GPIO_MODE_IN_PU_NO_IT); //上拉输入,不产生中断 //按键检测部分
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved