历史上的今天
返回首页

历史上的今天

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


推荐阅读

史海拾趣

Hongfa公司的发展小趣事

Hongfa宏发公司,全称厦门宏发电声股份有限公司,由郭满金先生于1984年创立。公司初创时,仅有简陋的厂房和设备,投资不过360万元,员工仅数十人。但宏发从一开始就明确了产品定位与市场定位,专注于继电器研发及制造领域。1987年,宏发成功以中国厂家商标及型号取得UL认证,进一步奠定了其在国际市场上的基础。通过不断的技术积累和市场开拓,宏发逐渐在国内继电器行业中崭露头角。

BULGIN公司的发展小趣事

BULGIN公司的历史可以追溯到1923年,当时A.F.Bulgin先生和他的同伴在英国创立了A.F.Bulgin有限公司。公司专注于无线电电子零件的制造与生产,凭借产品的优质口碑,BULGIN的品牌逐渐广为人知。随着订单的不断增加,公司迅速成长,并在二战前已经拥有了当时最先进的现代化大规模生产线。

Boundary Devices公司的发展小趣事

作为一家有社会责任感的企业,Boundary Devices始终关注环境保护和可持续发展。公司在生产过程中积极采用环保材料和技术,减少对环境的影响。同时,公司还积极参与社会公益活动,为社会的发展贡献自己的力量。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

以上五个故事基于Boundary Devices公司的发展背景和电子行业的一般趋势进行创作,旨在展示该公司在不同阶段的成长与发展。然而,实际的公司发展历程可能更加复杂和丰富,需要更多的资料和信息来深入了解。

GREEGOO公司的发展小趣事
如果电路板上有专用的时钟芯片或晶体振荡器,其下方应覆铜隔离,以防止电源和时钟互相干扰。
General Semiconductor ( Vishay )公司的发展小趣事

1962年,物理学家Felix Zandman博士在美国宾夕法尼亚州创立了Vishay公司,起初专注于研发和生产Bulk Metal箔电阻。这一电阻技术由Zandman博士发明,具有极高的精确性和稳定性,远超当时市场上的同类产品。公司以此为基础,逐步建立了自己在电子元件领域的地位。这一初期的成功为Vishay后续的快速发展奠定了坚实的基础。

Global Connector Technology公司的发展小趣事
检查继电器内部元件是否损坏或老化,必要时进行更换。

问答坊 | AI 解惑

请哪位高手解释下这个quartus编译waring

converted tri node “端口名”that feeds logic to a wire removing OPNDRN node “端口名” that feeds logic 请问意思是说把三态门和OD门 remove掉了吗?出现这个warning的原因是什么呀? 我的代码剪切下来如下: inout dq; reg oe; assig ...…

查看全部问答>

急!串口通讯只能发送,无法接收

请教一下高手,我现在用Microchip的30F系列的单片机6011A与触摸屏进行485串口通讯,现在的情况是:液晶模块可以显示汉字等,但是不能实现翻屏。也就是单片机可以发送给液晶,但是液晶触摸屏反馈来的信息单片机没有回应,没有接收。用串口调试助手, ...…

查看全部问答>

WinCE依据什么来调用同名但是不同功能的的函数

在WinCE当中定义了很多函数,它们具有一些特定的功能。但是在各个厂商的BSP当中也有定义很多同名的函数,提供了针对该平台的一些特定功能。那么WinCE到底靠什么来确定该调用那个函数了。比喻说在在在InterruptInitialize()调用OEMInterruptEnable ...…

查看全部问答>

C51定义结构体时,位对齐的一个怪问题

typedef struct {         uchar src_mac_id        :8;         uchar dest_mac_id        :8;         uchar ack      ...…

查看全部问答>

μC/os Ⅲ较μC/OSⅡ的改进

上传一点资料,看看μC/os Ⅲ较μC/OSⅡ的改进。…

查看全部问答>

初学者问ARM和操作系统相关问题

最近刚开始学习arm-linux,手头有个2410的开发板,看了些东西了,但是有个问题纠结着,不要笑话哈~初学者~:::::::::::::::::::::::::::::::::::::::::::::::::linux操作系统和自己编写的程序(点 ...…

查看全部问答>

【跟TI学电源】系列-----TI模拟应用期刊2012年前三期

TI每季度的模拟应用期刊---2012 [ 本帖最后由 qwqwqw2088 于 2012-11-15 23:04 编辑 ]…

查看全部问答>

CircuitCo免费赠送Educational BoosterPack

依旧是launchpad的扩展板,资源比较丰富 ompatibilityMSP430 LaunchPadPower3.3V via expansion headerDisplay type2x16 character LCDDisplay interfaceSerialIndicatorsTri-color (RGB) LED and white LEDSensor typeAccelerometerSensor inpu ...…

查看全部问答>

学习MSP430G2553遇到的定时器和串行I2C的问题求助

最近在学MSP430G2553这个单片机,一切觉得都还不错,但就是有两个问题不大理解 1:定时器那不会(不是看门狗定时器),就特别简单的定时程序要怎么写呢?还有那个PMW波又是什么意思? 2:串行通信的I2C软件程序要怎么编写,里面有发送/接收字节 ...…

查看全部问答>