历史上的今天
返回首页

历史上的今天

今天是:2024年12月11日(星期三)

正在发生

2018年12月11日 | STM32的外部中断EXTI及NVIC中断优先级介绍

2018-12-11 来源:eefocus

一、什么是中断?


打断当前的操作,执行中断需要做的事情。


中断的作用:中断机制不仅赋予了系统处理意外情况的能力,就可以“同时”完成多个任务,提高了并发“处理”能力。


和线程的区别:线程是同时执行多个任务,中断是停下来去执行其他的(注意优先级),执行完了再回来执行,


定时器才相当于线程,定一个时间,每到这个时间执行一次



二、中断概述


STM32F4并没有使用CM4内核的全部东西,而是只用了它的一部分。


STM32F40xx/STM32F41xx总共有92个中断


STM32F42xx/STM32F43xx则总共有96个中断


STM32F40xx/STM32F41xx的92个中断里面,包括10个内核中断和82个可屏蔽中断,具有16级可编程的中断优先级,而我们常用的就是这82个可屏蔽中断。


三、外部中断/事件线映射多达140个GPIO。


 

根据图文,发现我们的中断线总共有23根,其中16根是连接PA~PI引脚。 


STM32F4供IO使用的中断线只有16个:EXTI线0~15:对应外部IO口的输入中断。


剩下的七根是分别连接专用设备的:


 另外七根 EXTI 线连接方式如下:


● EXTI 线 16 连接到 PVD 输出


● EXTI 线 17 连接到 RTC 闹钟事件


● EXTI 线 18 连接到 USB OTG FS 唤醒事件


● EXTI 线 19 连接到以太网唤醒事件


● EXTI 线 20 连接到 USB OTG HS(在 FS 中配置)唤醒事件


● EXTI 线 21 连接到 RTC 入侵和时间戳事件


● EXTI 线 22 连接到 RTC 唤醒事件


四、中断服务函数分配


IO口外部中断在中断向量表中只分配了7个中断向量,也就是只能使用7个中断服务函数



从表中看出,外部中断线5~9分配一个中断向量,共用一个服务函数 外部中断线10~15分配一个中断向量,共用一个中断服务函数


中断服务函数列表如下:



四、设置中断优先级的分组


1、中断优先级有两种:


      抢占(占先式)优先级 --》 第一序列                  响应(副)优先级 --》 第二序列


 2、抢占优先级 &响应优先级区别:


       高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。


       抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。


       抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。


       如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;



3、中断优先级设置步骤


    ①系统运行后先设置中断优先级分组。调用函数:


void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);整个系统执行中只设置一次中断分组。


   ②针对每个中断,设置对应的抢占优先级和响应优先级:


void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);


  ③如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可



五、外部中断的一般配置步骤


①使能SYSCFG时钟:


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);


②初始化IO口为输入。


    GPIO_Init();


③设置IO口与中断线的映射关系。


    void SYSCFG_EXTILineConfig();//通过设置SYSCFG寄存器,建立IO口和中断线的连接


④初始化线上中断,设置触发条件等。


    EXTI_Init();


⑤配置中断分组(NVIC),并使能中断。


    NVIC_Init();



⑥编写中断服务函数。


    EXTIx_IRQHandler();


且清除中断标志位


EXTI_ClearITPendingBit();//清除中断标志位是为了表示中断已经开始执行,可以接收下一个中断。


----------------------------------------------------------------------------------------------------------------------------------------------------------


代码如下:


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

*

*功能:四个按键中断

*

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

#include "exti.h"

 

 

//外部中断初始化程序

//初始化PE2~4,PA0为中断输入.

void EXTI4_Init(void)

{

    NVIC_InitTypeDef   NVIC_InitStructure;

    EXTI_InitTypeDef   EXTI_InitStructure;

    GPIO_InitTypeDef  GPIO_InitStructure;

 

 

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOA,GPIOE时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟

 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //KEY0 KEY1 KEY2对应引脚

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉

    GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4

 

    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4);//PE4 连接到中断线4

 

    /* 配置EXTI_Line2,3,4 */

    EXTI_InitStructure.EXTI_Line = EXTI_Line4;

    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件

    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发

    EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能

    EXTI_Init(&EXTI_InitStructure);//配置

 

    NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;//外部中断4

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//抢占优先级1

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道

    NVIC_Init(&NVIC_InitStructure);//配置   

}

 

 

void EXTI3_Init(void)

{

    NVIC_InitTypeDef   NVIC_InitStructure;

    EXTI_InitTypeDef   EXTI_InitStructure;

    GPIO_InitTypeDef  GPIO_InitStructure;

 

 

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOA,GPIOE时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟

 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //KEY0 KEY1 KEY2对应引脚

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉

    GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4

 

    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3);//PE4 连接到中断线4

 

 

    /* 配置EXTI_Line2,3,4 */

    EXTI_InitStructure.EXTI_Line = EXTI_Line3;

    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件

    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发

    EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能

    EXTI_Init(&EXTI_InitStructure);//配置

 

    NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;//外部中断4

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//抢占优先级1

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道

    NVIC_Init(&NVIC_InitStructure);//配置   

}

 

 

void EXTI2_Init(void)

{

    NVIC_InitTypeDef   NVIC_InitStructure;

    EXTI_InitTypeDef   EXTI_InitStructure;

    GPIO_InitTypeDef  GPIO_InitStructure;

 

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOA,GPIOE时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟

 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //KEY0 KEY1 KEY2对应引脚

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉

    GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4

 

    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);//PE4 连接到中断线4

 

 

    /* 配置EXTI_Line2,3,4 */

    EXTI_InitStructure.EXTI_Line = EXTI_Line2;

    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件

    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发

    EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能

    EXTI_Init(&EXTI_InitStructure);//配置

 

    NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;//外部中断4

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//抢占优先级1

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道

    NVIC_Init(&NVIC_InitStructure);//配置   

}

 

 

void EXTI0_Init(void)

{

    NVIC_InitTypeDef   NVIC_InitStructure;

    EXTI_InitTypeDef   EXTI_InitStructure;

    GPIO_InitTypeDef  GPIO_InitStructure;

 

 

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA,GPIOE时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟

 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //KEY0 KEY1 KEY2对应引脚

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉

    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOE2,3,4

 

    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);//PE4 连接到中断线4

 

 

    /* 配置EXTI_Line2,3,4 */

    EXTI_InitStructure.EXTI_Line = EXTI_Line0;

    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件

    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发

    EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能

    EXTI_Init(&EXTI_InitStructure);//配置

 

    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//外部中断4

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//抢占优先级1

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道

    NVIC_Init(&NVIC_InitStructure);//配置   

}

 

 

//外部中断4服务程序

void EXTI4_IRQHandler(void)

{

     if(EXTI_GetITStatus(EXTI_Line4) != RESET)//判断是否置位

    {} 

    EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中断标志位  

}

 

 

//外部中断3服务程序

void EXTI3_IRQHandler(void)

{

    delay_ms(15);

 

    EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中断标志位  

}

 

 

//外部中断2服务程序

void EXTI2_IRQHandler(void)

    EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中断标志位  

}

 

 

//外部中断0服务程序

void EXTI0_IRQHandler(void)

    EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中断标志位  

}


推荐阅读

史海拾趣

Advanced Interconnections Corp公司的发展小趣事

在电子行业的早期阶段,AIC公司凭借其前瞻性的技术创新,成功开发了一种新型的连接器技术。这种连接器具有更高的传输速度和更强的稳定性,满足了市场对高性能电子产品的迫切需求。AIC公司的这一技术突破迅速获得了市场的认可,公司的销售额和市场份额均实现了快速增长。

维峰电子(WCON)公司的发展小趣事

质量是企业的生命线。维峰电子始终将质量管理作为公司发展的重中之重。公司建立了完善的质量管理体系,从原材料采购、生产过程到产品检验等各个环节都进行严格把控。同时,公司还引入了先进的检测设备和技术,确保产品的质量和性能达到最高标准。这些措施的实施不仅提升了产品的竞争力,也赢得了客户的信任和好评。

Enterpoint公司的发展小趣事

在Enterpoint公司的发展过程中,他们始终将客户服务放在首位。公司建立了一套完善的客户服务体系,为客户提供从产品咨询、技术支持到售后服务的全方位支持。这种对客户的关注和投入,不仅赢得了客户的信任和好评,也为公司的品牌建设打下了坚实的基础。

台湾第一电阻(Firstohm)公司的发展小趣事
定期清洁电冰箱对于保持其良好工作状态至关重要。首先,使用吸尘器或软布清理冰箱背面和底部的灰尘和污垢,确保通风良好。其次,定期清理冰箱内部的食物残渣和异味来源,保持内部清洁。此外,还应注意清理冷却器和风扇等部件上的灰尘和污垢,以确保制冷效果。
GainSpan ( Telit)公司的发展小趣事

随着业务的不断扩展和技术实力的提升,风华电子厂于1993年实施股份制改革,并更名为广东风华高新科技股份有限公司。1996年,公司在深圳证券交易所成功上市(证券简称风华高科,证券代码000636),成为电子元器件行业的重要一员。上市不仅为公司筹集了更多资金,也进一步提升了公司的知名度和市场竞争力。

超音(CY)公司的发展小趣事

为了进一步提升品牌影响力,超音开始积极拓展国际市场。公司参加了多个国际展会,与国际知名音频设备厂商建立了合作关系。同时,超音还加强了与国际市场的沟通和交流,了解不同地区的消费者需求,针对性地推出符合当地市场需求的产品。这些努力使得超音在国际市场上的知名度不断提升,产品销量也稳步增长。

问答坊 | AI 解惑

扬声器感冒了

扬声器型号:BSTC  8530  -273  2A, 器件质量没问题,焊好后在酒精里超声冲洗, 完了上电一试,声音变得很小。 是不是超声损坏了扬声器啊?…

查看全部问答>

玩网页游戏会关机

电脑进入正常,玩中游也正常,但只要是一玩网页游戏就会自动关机,检测电源显卡正常…

查看全部问答>

招聘Senior wince/windows mobile应用开发工程师!

精通C/C++,理解面向对象思想,有良好的编程习惯。 3~5年Windows/Windows Mobile程序开发经验,精通Windows编程,熟悉Win32API, COM。 熟悉TCP/IP等通信协议,熟悉Socket应用,多线程和进程间通讯编程。 熟悉数据库开发, 有实际数据库开发经验 ...…

查看全部问答>

如何防止WINCE 5.0 多镜像地址空间重叠?

在config.bib中把CE镜像划分为了4个部分,例如: KERNEL.BIN,DRIVER.BIN,APP.BIN,NK.BIN 这样做以便后期对单个镜像文件升级,现在问题来了,每个BIN文件中的DLL在SLOT0,SLOT1中所占用的地址空间都是在编译器时计算好的。如果后面我的APP.BIN变化 ...…

查看全部问答>

那位高手用过ads1210芯片呀,能给个程序么。

那位高手用过ads1210芯片呀,能给个程序么。…

查看全部问答>

菜鸟提问:关于触摸屏驱动加载的问题

本人在研华的PCM3350上移植WinCE4.2,目前触摸屏驱动一直加不上   具体情况如下:触摸屏光盘上提供了两个dll:TOUCHP.DLL  USBPort.dll  我先修改了project.bib文件在MODULES里加入   TOUCHP.DLL  ...…

查看全部问答>

无铅制造时代,恒温烙铁焊台大可借鉴蓄水池效应

    很多价格昂贵的无铅焊台都喜欢强调和炫耀瞬间强大的温度恢复能力,其实这个有一些钻牛角尖的做法,虽然性能是上去了,但焊台本身的总体制造成本以及使用成本也跟着抬高,势必转嫁到最终用户身上。       &nb ...…

查看全部问答>

分享给看国嵌视频的朋友, 课程5-内核驱动进阶班更新啦!

replyreload += \',\' + 1344538;         看国嵌视频的朋友有部分可能也和我一样,在看完国嵌内核模块和驱动程序的视频后,没办法自己写,感觉自己是听懂了,能理解,但就是没办法写。这个很郁闷啊。 但是 ...…

查看全部问答>

如何解决MSP430的复位问题

MSP430有时候在整个系统断电之后,不能马上复位,需要在断电之后将整个系统的电源短路几分钟才能让MSP430复位,要不然程序都没法下载。…

查看全部问答>