历史上的今天
返回首页

历史上的今天

今天是:2025年07月10日(星期四)

正在发生

2018年07月10日 | STM32F0xx_EXTI中断配置详细过程

2018-07-10 来源:eechina

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


推荐阅读

史海拾趣

AC Photonics Inc公司的发展小趣事

AC Photonics Inc深知品质是企业生存和发展的关键。因此,公司始终将品质管理放在首位,从原材料采购到生产流程控制,再到产品出厂检验,都严格遵循国际标准和行业规范。同时,公司还注重品牌建设,通过参加行业展会、举办技术研讨会等方式,不断提升品牌知名度和美誉度。这些努力使得AC Photonics Inc的产品在市场上获得了广泛的认可和好评。

Echelon_Corporation公司的发展小趣事

Echelon Corporation于1988年在美国加州成立,其初衷是开发和推广先进的通信和控制技术。在成立初期,Echelon便推出了其标志性的LonWorks控制网络平台。该平台采用了开放的通信协议,使得不同厂商的设备可以无缝连接和通信,为工业自动化、建筑自动化等领域带来了革命性的变化。LonWorks平台的成功推出,为Echelon在电子行业奠定了坚实的基础。

Genisco Electronics公司的发展小趣事
考虑发电机的维护和保养难易程度以及配件的供应情况。
Cybernetic Micro Systems公司的发展小趣事

Cybernetic Micro Systems(简称CMS)的创始人李华,是一位热衷于电子技术的天才工程师。他在大学期间就研发出了一款高效能、低功耗的微处理器原型,这一成果引起了业界的广泛关注。毕业后,李华决定创业,将他的研究成果商业化。于是,Cybernetic Micro Systems应运而生,专注于研发和生产高性能的微处理器和配套设备。凭借独特的技术优势,CMS很快在电子行业中崭露头角。

ALLTHREAD公司的发展小趣事

ALLTHREAD公司最初由一群对螺纹轧制技术充满热情的工程师创立。他们看到了电子行业对高精度螺栓的迫切需求,于是决定专注于这一领域。经过不断的研发和创新,ALLTHREAD成功推出了首款高精度、高可靠性的螺纹轧制螺栓,迅速在市场上获得了认可。

Exclara Inc公司的发展小趣事

Exclara Inc.自创立之初就致力于研发创新技术,以满足电子行业对高性能、低功耗产品的需求。公司通过不断的技术突破,成功开发出了一系列具有竞争力的产品。例如,其采用HVX技术构成的驱动电源在T8型LED市场中脱颖而出,相比同规格方案,能够降低30%的BOM成本,这一技术革新不仅提升了产品的竞争力,也为公司赢得了市场的广泛认可。

问答坊 | AI 解惑

诚问 WinCE嵌入式环境下能运行神经网络吗?

本人在利用wince开发汽车故障诊断系统 采用扬创S3c2440开发板 打算采用BP神经网络的作为诊断的算法 想知道有人做过类似的不? 系统资源能否支持呢? ps:s3c2440主频500M 32m内存 小弟再次谢过…

查看全部问答>

ARM9+linux入门

06年毕业 三年arm7+ucos 刚刚换公司,现在公司需要ARM9+linux 请问各位大虾知道一下: 1 一般来说windows下开发都有集成开发环境,二linux 下开发软件好像没有,需要自己搞定,思想上有点难以转变。linux 采用命令方式有点不习惯,但公司现在项 ...…

查看全部问答>

请教高手这段代码的意思?

这段代码是我老师给我的,是用keil uvision2软件纺写的 是bulkloop框架里的 void DA5384(unsigned char indata) {         unsigned char i; unsigned int mydata; unsigned int dataT; //SCLK =PA0, DIN=PA1 CS =PA5 ...…

查看全部问答>

串口通信问题求助

我在做串口通信 为什么在串口调试助手上找不到串口啊 有哪位高手知道指点一下好吗 先谢了 …

查看全部问答>

GAP的形成与内存控制问题(单片机)附map文件

#include bit b1,b2; bdata char bx,by; xdata char zz; pdata char buf[100]; void main (void) { {            b1=0;        b2=1;        bx=12;    ...…

查看全部问答>

寻支持二次开发的PDA

现需一款PDA,基本要求如下:支持二次开发+GPRS(最好支持EDGE)+摄像头+闪光灯.有意者请与许先生联系:13956057557.…

查看全部问答>

请问一道题目

试写出大尾数和小尾数机器中下图的数据结构,下图中a,b个占4bit长度 0   0 1 2 3 4 5 6 7   +-+-+-+-+-+-+-+-+   |       |       |   | a   &n ...…

查看全部问答>

请问能稳定运行Wince4.2的板子能否升级为5.0?钱不多了谢谢您!!

大家好! 朋友送了我一块4.2的板子 X86,PC104架构的,外设什么的都挺全。 我非常喜欢Wince,所以想基于这块板子搞点设计。 这块板子已经移植好4.2 了,但是我听说4.2已经被淘汰, 都用5.0和6.0了,所以想请问,一般这种板子能否设计成5.0的? ...…

查看全部问答>

请教没有INF,如何安装驱动程序?

通过编译,已经得到了sys文件,是不是说明我的驱动程序已经编译成功了? 我想把这个程序先在我的网卡上运行一下,能否不用INF文件,直接安装? 在网上搜到好像可以通过注册表里面键值的修改来安装sys文件,我写的是PCI的网卡驱动,请问用这种方法 ...…

查看全部问答>