STM32上的外部中断

        今天记录一下关于外部中断的知识点以及在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的状态,最后要清除中断标志位。

三、总结

        外部中断在开发中是时常用到的,但是对外部中断的使用也是有许多技巧和策略的,我了解的并不多,这需要时间和经验的积累,我知道的一点就是,在中断中处理尽可能少的事情,最好只是设置一个标志,把主要工作留给主函数来执行。

        以上就是我对外部中断的总结

        


        

猜你喜欢

转载自blog.csdn.net/a568713197/article/details/80522359