今天记录一下关于外部中断的知识点以及在32上外部中断的相关寄存器以及配置的流程。
一、原理介绍
首先,什么是中断
中断就是将正在做的事情停下来,先去完成另外一件事情,完成后继续回来做这件事。
比如:在吃饭的时候有电话打来,去接电话,打完电话后继续吃法。
在计算机科学中,中断(英语:Interrupt)是指处理器接收到来自硬件或软件的信号,提示发生了某个事件,应该被注意,这种情况就称为中断。
通常,在接收到来自外围硬件(相对于中央处理器和内存)的异步信号,或来自软件的同步信号之后,处理器将会进行相应的硬件/软件处理。发出这样的信号称为进行中断请求(interrupt request,IRQ)。硬件中断导致处理器通过一个运行信息切换(context switch)来保存执行状态(以程序计数器和程序状态字等寄存器信息为主);软件中断则通常作为CPU指令集中的一个指令,以可编程的方式直接指示这种运行信息切换,并将处理导向一段中断处理代码。中断在计算机多任务处理,尤其是即时系统中尤为有用。
上图就是中断的流程图,可以看出中断也支持嵌套,高级别的中断可以打断低级别的中断。
中断的分类:根据中断的来源可以分为内部中断、外部中断
根据中断来源的性质不同可以分为软件中断、硬件中断
根据系统处理和响应的方式可以分为向量中断、非向量中断
今天主要记录外部中断的一些要点,其他的分类方式以及各类中断的区分以后会再写博客记录。
外部指的是相对CPU来说的,也就是说这个中断是发生在CPU外的。
外部中断的触发方式有:电平触发和跳沿触发
边沿触发和电平触发基本就是触发器和锁存器的区别。
触发器是边沿触发,只有当时钟上升(或下降)的一瞬间,触发器会读取并锁存输入信号。输出信号仅在时钟信号上升(或下降)的一瞬间会发生变化。
锁存器是电平触发,只要使能(enable)信号处于高电平(或低电平),输出就会随着输入信号变化,直到使能信号变为低电平(或高电平)时,输出才会锁存,不再随输入变化。
二、在32上的外部中断
STM32F4的每个IO都可以作为外部中断输入。
STM32F4的中断控制器支持22个外部中断/事件请求:
EXTI线0~15:对应外部IO口的输入中断。
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口有16条中断线,但并不是能设置16个外部中断
IO口外部中断在中断向量表中只分配了7个中断向量,也就是只能使用7个中断服务函数
中断线5-9分配一个中断向量,共用一个中断服务函数,中断线10-15分配一个中断向量,公用一个中断服务函数。
中断的配置过程还是比较简单的
1、使能时钟
2、初始化IO口为输入模式
3、设置IO口与中断线的映射关系,并设置触发条件。
4、配置中断优先级(抢占、响应)以及中断分组。
5、编写中断服务函数(中断函数的最后一个语句是清除中断标记位)
关于中断优先级,要强调一些:在STM32上的中断优先级与51上的中断优先级不同,51上只是给每个中断一个数字,高优先级的可以打断低优先级,若低优先级的中断在高优先级中断执行的时候发生会被忽略;在32上中断优先级有抢占优先级和响应优先级之分,其中抢占优先级类似于51上的中断优先级,高抢占优先级的中断会打断低抢占优先级的中断,而响应优先级就是给相同抢占优先级的中断排了一个次序,若俩个相同抢占优先级的中断同时发生时,会先执行高响应优先级的中断,低响应优先级的中断会在之后执行。这样可以选择的配置方式就更多了。
在32上配置外部中断的代码还是很简单的,使能时钟和配置IO口的代码就不贴的
关于配置中断
Ex_NVIC_Config(GPIO_E,2,FTIR); //下降沿触发
MY_NVIC_Init(3,2,EXTI2_IRQn,2); //抢占3,子优先级2,组2
第一个函数用来配置PE2为下降沿中断,第二个函数设置中断线2的抢占优先级为3,响应优先级为2,中断分组为2。
接下来编写中断服务函数
void EXTI2_IRQHandler(void)
{
delay_ms(10); //消抖
if(KEY2==0)
{
LED0=!LED0;
}
EXTI->PR=1<<2; //清除LINE2上的中断标志位
}
首先是10ms的软件去抖动,此处的含义是按键按下后改变LED0的状态,最后要清除中断标志位。
三、总结
外部中断在开发中是时常用到的,但是对外部中断的使用也是有许多技巧和策略的,我了解的并不多,这需要时间和经验的积累,我知道的一点就是,在中断中处理尽可能少的事情,最好只是设置一个标志,把主要工作留给主函数来执行。
以上就是我对外部中断的总结
上一篇:错误解决:STM32F103串口1与串口3相同代码却结果不同
下一篇:STM32上的PWM
推荐阅读最新更新时间:2024-03-16 16:24
设计资源 培训 开发板 精华推荐
- ADI基于ADPD188BI的烟雾探测器集成解决方案 有奖直播 5月13日上午10:00-11:30 为您揭晓!
- ADI电磁流量计解决方案
- 【泰有聊】系列技术文章连载1:示波器“芯”升级,聊一聊TEK061/041 ASIC创新平台
- 与PI一起探索 LinkSwitch-TN2 的秘密看视频答题赢好礼!
- 直击富士通在线展会,答题赢好礼
- 【XILINX 主题分享月】 低功耗资料大搜集!
- 瓜分2000元新年开工红包!贸泽电子邀你元宵猜灯谜
- 有奖直播|TI 符合 USB 2.0 标准的最新隔离器件
- 有奖直播|是德科技感恩月—遇见KeysightCare - 贵重仪器安全避坑指南
- PI HiperPFS-4系列功率因数校正IC,了解产品特色,答题享好礼!