前 言
本文仅供个人参考记录复习,如有错误或者模糊的地方欢迎指教.
中断是计算机硬件和软件间进行协调的一种机制,它允许向处理器发送一个信号,以使当前正在执行的进程或程序暂停执行,转而执行一个与其优先级高的程序(即中断服务程序),待该程序完成后再返回到之前的上下文中继续执行。
中断可以分为外部中断和内部中断。外部中断由外部设备(如串口、定时器等)引起,内部中断是由CPU内部某些事件(如除零错误、栈溢出等)引起。
STM32中断
简介
EXTI可以连接到多个GPIO引脚,通过外部中断触发的方式,当引脚上的电平或边沿变化时,会产生相应的中断请求,并触发对应的中断服务程序执行。
不同型号的STM32单片机具有不同数量的EXTI线路,每个线路对应一个或多个GPIO引脚。可以通过配置寄存器将GPIO引脚与EXTI线路进行映射。
EXTI支持多种触发模式,包括边沿触发(上升沿、下降沿、上升/下降沿)、低电平触发和任意电平触发。可以通过配置寄存器设置所需的触发模式。
针对不同的EXTI线路,可以设置不同的中断优先级。优先级较高的中断服务程序将优先执行。
每个EXTI线路都有一个屏蔽位(包括EXTI、TIM、ADC、USART、SPI、I2C、RTC等外设),用于控制该线路的中断是否被屏蔽。可以通过配置寄存器或相关函数设置和清除屏蔽位。
EXTI线路对应的中断标志位用于指示中断事件是否发生。在中断服务程序中,需要清除相应的中断标志位,以便允许再次触发中断。
NVIC
STM32使用NVIC用来分配中断优先级
中断向量表
NVIC包含一个中断向量表,存储了每个中断的中断服务程序(Interrupt Service Routine,简称ISR)的地址。中断向量表是一段特定内存区域,在系统启动时就被初始化,并且不能被修改。当中断发生时,处理器会根据中断号从中断向量表中获取对应的ISR地址。
中断优先级
NVIC通过中断优先级来确定在多个中断请求同时到来时的优先级顺序。中断优先级由若干位表示,通常为16位,取决于具体的ARM Cortex-M系列处理器。较低的数值表示较高的优先级。可以通过配置NVIC的优先级寄存器来设置中断的优先级。
中断使能
NVIC负责控制每个中断的使能状态。通过配置NVIC的使能/禁止寄存器,可以选择性地使能或禁止特定中断。只有使能状态的中断才会被处理器接受并响应。
中断嵌套
NVIC支持中断嵌套功能,允许多个中断同时发生时按照优先级的顺序进行处理。在发生更高优先级中断时,处理器会挂起当前正在执行的低优先级中断,并立即开始处理高优先级中断。中断嵌套使得处理器能够灵活响应紧急事件,并提供更好的实时性能。
特殊异常/中断处理
NVIC也负责处理一些特殊的异常情况,例如硬件异常、系统异常等,这些异常可以通过专用的异常向量表进行处理。NVIC还提供用于处理系统Tick定时器中断的SysTick定时器接口。
寄存器
中断设置使能寄存器(NVIC_ISERx)
中断设置使能寄存器用于配置中断向量表中特定中断优先级的中断请求是否可以触发相应的中断服务程序。通过对该寄存器编程,可以启用或禁用相应中断线路,以便灵活地控制中断服务程序的执行。
中断清除使能寄存器(NVIC_ICERx)
中断清除使能寄存器用于在一次中断请求后自动清除中断请求,从而允许下一个中断请求到达。通过对该寄存器编程,可以控制中断服务程序仅对单个中断请求响应,而不会连续触发多次。
中断设置挂起寄存器(NVIC_ISPRx)
中断设置挂起寄存器用于控制中断请求是否会被挂起,而不是直接触发中断服务程序。通过对该寄存器编程,可以暂时禁用中断响应,直到相应的中断服务程序完成某些任务或判断某种条件。
中断清除挂起寄存器(NVIC_ICEPx)
中断清除挂起寄存器用于清除已经挂起的中断请求,以允许其他中断请求优先执行。通过对该寄存器编程,可以强制启动先前被挂起的中断服务程序,并处理未完成的中断请求。
中断活动位寄存器(NVIC_IABRx)
中断活动位寄存器用于表示当前系统是否正在服务某个中断请求,以便在优先级相同时,选择正在服务中断请求的优先级更高的中断服务程序。在中断服务程序中,如果又有其他中断请求,则通过该寄存器来进行优先级判断。
中断优先级寄存器(NVIC_IPRx)
中断优先级寄存器用于设置中断请求的优先级,其中每个中断优先级有一个预定义的值。通过对该寄存器的编程,可以为每个中断请求分配特定的优先级。
软件触发中断寄存器(NVIC_STIR)
软件触发中断寄存器用于在没有硬件中断请求的情况下,由软件直接触发某个中断服务程序执行。通过对该寄存器的编程,可以在特定的应用场景下启动相应的中断服务程序。
EXTI外部中断
不同型号的STM32单片机具有不同数量的EXTI线路,每个线路对应一个或多个GPIO引脚。但是相同的pin口不能同时触发。可以通过配置寄存器将GPIO引脚与EXTI线路进行映射。
EXTI支持多种触发模式,包括边沿触发(上升沿、下降沿、上升/下降沿)、低电平触发和任意电平触发。可以通过配置寄存器设置所需的触发模式。
支持两种EXTI响应模式,分别是中断响应模式和事件响应模式。在中断响应方式下,检测到引脚电平变化时触发中断;而在事件响应模式下,检测到引脚电平变化时触发的是其他外设工作。
EXTI基本结构
由GPIO外设引脚接入AFIO中断引脚选择,经过AFIO选择之后,相同的pin只能有一个能够街道EXTI的通道上接入EXTI边沿检测及控制。然后部分输出线路接到NVIC(中断响应),剩下部分接入其他外设(事件响应)。
AFIO中断引脚选择
AFIO模块允许将一个特定的GPIO引脚与EXTI线路相关联,从而实现引脚与外部中断的连接。通过AFIO模块,可以将某个GPIO引脚与对应的中断线路进行映射。这样,当GPIO引脚的状态变化满足触发条件时,就会触发相应的外部中断。
且一个GPIO引脚通常具有多种功能。这些特殊功能依赖于引脚与相应的外设进行连接。通过AFIO模块,可以选择特定的外设功能,并将其映射到相应的GPIO引脚上,从而实现不同的应用场景。
在一些特殊情况下,某些外设或应用需要更灵活地控制和管理引脚映射关系。为了满足这种需求,AFIO模块提供了引脚重映射的功能。通过引脚重映射,可以将某个GPIO引脚与另一个I/O口或者其他不同的引脚进行映射,从而实现更多元化的应用需求。
EXTI边沿检测及控制
EXTI模块提供了边沿检测和控制的功能,用于确定何时触发外部中断。
上升沿触发:当GPIO引脚由低电平切换到高电平时,触发中断。
下降沿触发:当GPIO引脚由高电平切换到低电平时,触发中断。
上升和下降沿触发:既可以检测上升沿,也可以检测下降沿,并在满足任一条件时触发中断。
寄存器
中断屏蔽寄存器(EXTI_IMR)
中断屏蔽寄存器用于配置是否允许某个或某组外部中断请求触发CPU的中断服务程序。通过对该寄存器编程,可以禁止或启用特定的外部中断请求, 并减少CPU资源占用。
事件屏蔽寄存器(EXTI_EMR)
事件屏蔽寄存器用于配置外部中断请求事件是否屏蔽。通过对该寄存器编程,可以使能或禁用特定的外部中断请求事件触发中断服务程序,以适应不同的应用场景。
上升沿触发选择寄存器/下降沿触发选择寄存器(EXTI_RTSR / EXTI_FTSR)
上升沿/下降沿触发选择寄存器用于配置外部中断请求的触发方式。通过对该寄存器编程,可以设置特定的边缘触发类型(上升/下降),并控制触发中断服务程序的时序和优先级。
软件中断事件寄存器(EXTI_SWIER)
软件中断事件寄存器用于在没有硬件中断请求的情况下,由软件直接触发EXTI模块的中断服务程序执行。通过对该寄存器的编程,可以灵活地控制特定的应用场景。
挂起寄存器(EXTI_PR)
挂起寄存器用于控制中断请求是否会被挂起,而不是直接触发中断服务程序。通过对该寄存器编程,可以暂停中断响应,直到相应的中断服务程序完成某些任务或判断某种条件。