历史上的今天
返回首页

历史上的今天

今天是:2025年01月15日(星期三)

正在发生

2019年01月15日 | STM32F0xx_EXTI中断配置详细过程-按键检测

2019-01-15 来源:eefocus

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的中断配置是有些许的不同,但是大致还是差不多的。


推荐阅读

史海拾趣

EMBEST公司的发展小趣事

随着国内市场的逐步稳固,EMBEST开始寻求更广阔的发展空间。XXXX年,EMBEST的开发工具成功进入国际市场,并获得了多家芯片公司的认可,成为他们的第三方工具伙伴。这一举措不仅提升了EMBEST的品牌影响力,也为其带来了更多的商业机会。EMBEST凭借过硬的技术实力和优质的服务,逐渐在国际市场上崭露头角。

辰颐电子公司的发展小趣事

在辰颐电子公司的发展过程中,他们意识到单打独斗很难在市场中取得优势。因此,公司开始注重产业链的整合和协同发展。他们与上游供应商建立了紧密的合作关系,确保原材料的稳定供应和质量保证;与下游客户建立了长期的合作伙伴关系,提供定制化的解决方案和优质的服务。此外,公司还积极参与行业协会和组织的活动,加强与同行业企业的交流与合作,共同推动整个电子行业的发展。

Advanced Microelectronic Products Inc公司的发展小趣事

在追求经济效益的同时,AMP公司也积极履行社会责任,致力于实现可持续发展。公司注重环保和节能减排,采用先进的生产工艺和设备,减少对环境的影响。此外,公司还积极参与社会公益事业,为社会发展和进步贡献力量。这些举措不仅提升了AMP公司的社会形象,也为其赢得了更多消费者的支持和信任。

请注意,以上故事均为虚构内容,旨在展示一个假设的电子行业公司在发展过程中可能遇到的情境和策略。实际公司的发展历程和细节将因公司而异,并受到市场环境、技术变革、政策调整等多种因素的影响。

华宇创公司的发展小趣事

随着市场的不断发展,华宇创意识到单一产品无法满足日益增长的市场需求。于是,公司加大了对研发的投入,积极引进高端人才,与国内外知名科研机构建立合作关系。经过不懈努力,华宇创成功研发出一系列智能电子设备,包括智能手表、智能眼镜、智能家居控制器等。这些新产品的推出不仅丰富了公司的产品线,也进一步提升了华宇创的市场竞争力。

功得(CONQUER)公司的发展小趣事

在市场竞争日益激烈的环境下,功得公司意识到仅仅依靠创新是不够的,还需要有高品质的产品来赢得客户的信任。因此,公司开始注重产品质量管理,建立了完善的质量控制体系。功得公司严格把控原材料采购、生产工艺和成品检验等环节,确保每一件产品都符合高标准的质量要求。这种对品质的执着追求,使得功得公司的产品在市场上赢得了良好的口碑,品牌知名度也逐渐提升。

BNS Solutions公司的发展小趣事

面对全球化的趋势,BNS Solutions公司积极实施全球化战略,将业务拓展到全球范围。公司在多个国家和地区设立了分支机构,加强了与国际市场的联系和合作。同时,公司还注重可持续发展,积极推广环保理念和技术应用。通过采用环保材料和节能技术,公司降低了产品对环境的影响,实现了经济效益和社会效益的双赢。这些举措使得BNS Solutions公司在全球范围内赢得了广泛的赞誉和尊重。

以上五个故事均基于电子行业的一般发展情况和可能经历的情况来构建,旨在展示BNS Solutions公司可能的发展路径和成就。请注意,这些故事并不代表BNS Solutions公司的真实历史,仅作为示例供您参考。如需了解BNS Solutions公司的真实发展历程,建议查阅相关文献资料或公司官方网站。

问答坊 | AI 解惑

新材料可实现超快光电开关,提高光通信速度

作者:崔晓楠  日期:2006-11-1   来自 今日电子 美国华盛顿州立大学物理系研究人员近日设计出一种新型分子,其对光的传播的控制能力比现有的最好材料提高了近20倍,一旦成功用于超快光电开关,将能大大提高互联网与光通信的速度。 研究 ...…

查看全部问答>

请教高手二极管的性能区别问题

2种二极管除了封装不同外,使用中有什么区别吗…

查看全部问答>

通用串行总线(USB)原理及接口设计 I

用串行总线(USB)原理及接口设计 摘要:以USB1.1为基础讨论了USB的基本原理、工作流程、通信协议和相应的关键技术,并介绍了一种USB接口的10M以太网卡的设计方案。已经发布的USB2.0支持480Mbps的高速数据传输,这将使P ...…

查看全部问答>

基于LPC1114的LED控制系统

思路:   1. 通过上位机软件编辑处理效果数据,并存入SD卡中;   2. 通过SSP0读取SD卡中的数据信息到RAM中;   3. 更加效果数据的结构,进行数据转换,转换成LED灯具可以设别的灰度数据;   4. 通过SSP1发送灰度数据到LE ...…

查看全部问答>

达芬奇DSP算法很慢的问题

问题是这样,我用videnc_copy修改,加入我的放大算法代码,在process里面要用到width height pitch等值, 要传参数,我把这些变量放到process里面声明称局部变量并赋初值,程序就跑的很快(20ms),但是我把这几个变量 复制到process的外面(全局 ...…

查看全部问答>

探讨一下关于symbian智能手机操作系统的技术问题

探讨一下关于symbian智能手机操作系统的技术问题 各位从事symbian 智能手机研发或者从事相关电信领域工作的同弟姐妹们,我从事这方面的工作有相当长 的时间,对这个行业,包括有些技术领域有些困惑,想结识一些有同样背景的朋友们,做一下各方 ...…

查看全部问答>

关于CE5的补丁,做个调查,顺便散分!!!

大家做的产品,无论是量产的还是正在开发中的,都打上了CE5的补丁了吗?这些补丁全部打上之后对系统的性能会有改善或者倒退的影响吗? 我现在正在做的产品没有打任何补丁,但是总感觉电源管理有些问题,有时候睡眠唤醒收不到PBT_TRANSITION以及PBT ...…

查看全部问答>

通过TSP利用3700系列系统开关/万用表和2600系列SourceMeter®

在2005年,随着2600系列第一款一体化源表的引进,吉时利推出了安装有板上测试脚本处理器(Test Script Processors,TSP™)的测试测量仪器。TSP执行基于文本的程序,非常类似于SCPI,具有增强的测试序列/流程控制、决策判断以及利用用户自定义 ...…

查看全部问答>

hercules菜鸟步步新建工程点亮LED(HET0)

一、环境说明:HALCoGen :版本03.05.02CCS        :版本Code Composer Studio Version:5.4.0.00091硬件        :TMS570LS031USB 二、工作目录:     CCS工作 ...…

查看全部问答>

汽车雨刮器的设计 单片机课设

1. 设计要求单臂式雨刮器,步进电机驱动,摆角+70o, 周期范围为0.5S~20S。需根据雨量传感器数据调整摆动周期。需要使用显示器显示当前雨刮器的摆动周期。雨刮器说明:为防损坏雨刮,雨刮器每步摆动角必需小于1o ,请根据这个需要选择步距角合适的步 ...…

查看全部问答>