系列文章目录
STM32单片机系列专栏
C语言术语和结构总结专栏
文章目录
1. 中断基本概念
2. STM32中断
3. NVIC的基本组件
3.1 NVIC的基本组件
3.2 NVIC的优先级
4. EXTI外部中断
4.1 基本概念
4.2 基本结构
5. AFIO
1. 中断基本概念
中断(Interrupt):
- 中断是一个信号,表示一个事件需要立即得到处理。这个信号可以由硬件(外部中断)或软件(内部中断)生成。在STM32微控制器中,中断可以由很多源触发,包括外部引脚(例如用户按下按钮),或者内部源如定时器溢出或数据接收完成。
- 当中断发生时,如果它被使能(即允许中断),外部设备或内部模块(如计时器)会打断CPU的当前执行任务,保存当前的状态,强制CPU转而处理一个特定的任务(即中断服务程序)。
- 中断服务完成后,CPU会从中断返回,恢复之前的状态,并继续执行之前被打断的任务。
中断优先级(Interrupt Priority):
- 在系统中同时存在多个中断源时,必然存在一个优先级的概念。当两个或多个中断几乎同时发生时,CPU需要决定先服务哪一个中断。
- 在STM32中,这由NVIC来管理。每个中断源都可以配置一个优先级,数字越低,优先级越高。当低优先级的中断正在被处理时,高优先级的中断发生将会打断当前中断服务程序,CPU将先去执行高优先级的中断服务程序。
中断服务程序(Interrupt Service Routine,ISR):
- 中断服务程序是响应中断信号而执行的函数。这些函数是预先定义的,目的是对特定的中断事件做出快速反应。
- 在编写ISR时需要特别注意效率,因为ISR的执行时间会影响系统的响应时间。另外,ISR应尽量简短,并避免执行复杂的任务或长时间的等待。
中断嵌套
- 当一个中断程序正在运行时,又有了新的更高优先级的中断申请中断,CPU会暂停当前中断程序,转而去处理新的中断程序,处理完后依次进行返回。
中断标志:
- 每个中断源都有一个中断标志,该标志当中断事件发生时被设置。在处理中断时,通常需要在ISR中清除这个标志,否则中断请求会持续存在,导致中断服务程序不断被调用。
中断请求(Interrupt Request,IRQ):
- 当外设需要CPU的注意时,它会发送一个中断请求到NVIC。如果这个中断被使能,且优先级满足要求,NVIC会通知CPU来处理这个请求。
2. STM32中断
中断源:
- STM32提供多达68个可配置的中断源(不同的型号拥有的中断源数量也不一样),这意味着它可以响应来自68种不同来源的事件。这些中断源包括但不限于外部中断线(EXTI)、定时器(TIM)、模拟-数字转换器(ADC)、通用同步/异步收发器(USART)、串行外设接口(SPI)、I2C总线(I2C)、实时时钟(RTC)等。
NVIC(Nested Vectored Interrupt Controller):
- NVIC是ARM Cortex-M内核的一部分,负责管理所有中断。它允许每个中断源都有自己的优先级设置,以及嵌套中断,即一个高优先级的中断可以打断正在运行的低优先级中断服务程序。
- NVIC支持每个中断源的优先级分为16个或更多的优先级。这些优先级中,数值较小的优先级高,允许更高优先级的中断打断正在执行的较低优先级中断服务程序。
3. NVIC的基本组件
ARM Cortex-M微控制器,如STM32系列,包含一个称为嵌套向量中断控制器(NVIC)的高级中断管理器。NVIC是中断管理和优先级系统的核心,它允许每个中断线配置优先级和控制中断处理。
3.1 NVIC的基本组件
中断向量表(Interrupt Vector Table):
这是一个存储在固定内存位置的表,其中包含了所有中断和异常处理程序的入口地址。当特定的中断被触发时,处理器使用这个表来确定应该跳转到哪个地址来执行相应的中断服务程序(ISR)。
中断号(Interrupt Number):
每一个中断源都被分配了一个唯一的标识号。在STM32中,这个号码用于识别来自不同外设(如EXTI, TIM, ADC, USART等)的中断。
优先级寄存器(Priority Registers):
NVIC允许为每个中断分配一个优先级。中断的优先级确定了中断的响应顺序,高优先级中断可以打断低优先级中断的服务程序。在多任务系统中,这允许重要的任务可以优先于其他较不紧急的任务被处理。
中断使能寄存器(Interrupt Set-Enable Registers):
这些寄存器用于使能或禁用特定的中断。如果一个中断没有被使能,那么即使该中断被触发,处理器也不会响应它。
中断清除寄存器(Interrupt Clear-Enable Registers):
这些寄存器用于禁用中断,防止处理器响应已经发生的中断请求。
状态和控制寄存器(Status and Control Registers):
包含了用于控制中断状态的寄存器,如中断挂起(pending)和中断激活(active)状态标志。处理器通过检查这些状态来决定是否有中断需要处理。
3.2 NVIC的优先级
抢占优先级与响应优先级
- 抢占优先级:决定了中断是否可以打断其他中断。一个中断可以打断抢占优先级更低(数字更大)的中断。
- 响应优先级:在抢占优先级相同的情况下,用于决定中断处理的顺序。
优先级分组
在STM32微控制器中,NVIC允许把优先级分为几组,每组都包含一定数量的抢占优先级和响应优先级。分组方式有自己设定,具体分组情况如下:
分组方式 | 抢占优先级 | 响应优先级 |
分组0 | 0位,取值0(只有一个优先级) | 4位,取值0 - 15(16个子优先级) |
分组1 | 1位,取值0 - 1(2个抢占优先级) | 3位,取值0 - 7(8个子优先级) |
分组2 | 2位,取值0 - 3 | 2位,取值0 - 3 |
分组3 | 3位。取值0 - 7 | 1位,取值0 - 1 |
分组4 | 4位,取值0 - 15 | 0位,取值0 |
优先级分组的配置通常在系统初始化时进行设置,并且会影响整个系统中断响应的行为。开发者可以根据应用的需求和中断的特性来选择合适的优先级分组策略。例如,实时性要求高的系统可能会选择更多的抢占优先级来确保关键任务能够快速响应。
4. EXTI外部中断
4.1 基本概念
概述:
- EXTI(External Interrupt)是用于处理从GPIO引脚或其他一些内置外设(如PVD、RTC和USB唤醒事件)传入的外部信号的中断系统。它可以被配置为响应特定的信号边沿(上升沿、下降沿或者两者)来触发中断。
触发机制:
- 当配置的GPIO引脚检测到边沿变化时(例如从低电平变为高电平,或者相反),EXTI会产生一个中断请求。这个请求被发送到NVIC,由NVIC决定是否响应该中断。
触发响应方式:
- 中断响应:正常流程,引脚电平变化触发中断。
- 事件响应:外部中断的信号不会通向CPU,而是通向其他外设,不会触发中断,而且触发别的外设。
配置过程:
- 开发者需要配置GPIO引脚作为外部中断输入,并指定响应的边沿类型。还需要在NVIC中启用对应的中断,并设置相应的优先级。STM32提供了多条EXTI线路,允许多个引脚或事件映射到不同的EXTI线路。这意味着STM32可以同时处理多个外部中断源。
通道数:
- EXTI不仅限于16个GPIO_Pin,还可以管理来自于内置外设的中断,如电源电压检测(PVD)、实时时钟(RTC)的唤醒事件,或者USB的唤醒中断。
- 但是相同的Pin不能同时触发中断,例如PA0,PB0,PC0中只有一个可以用于中断。
应用场景
- 按键检测:当用户按下按钮时,产生一个中断,使CPU可以立即处理该事件。
- 传感器信号:例如,当一个运动传感器检测到运动时,通过EXTI产生中断进行处理。
- 低功耗模式唤醒:从休眠状态唤醒设备以响应外部事件。
4.2 基本结构
GPIOs:
- 多个GPIO端口(如GPIOA、GPIOB、GPIOC等)可用作外部中断源。每个GPIO端口有多个引脚(通常为16个),每个引脚可以单独配置为中断输入。
AFIO(Alternate Function I/O):
- AFIO是一个硬件模块,它可以映射或重新路由某些功能到不同的引脚。在中断上下文中,AFIO可用于选择哪个GPIO引脚将与哪个EXTI线路相关联。因为相同的Pin不能同时触发中断,例如PA0,PB0,PC0中只有一个可以用于中断。所以这就是AFIO的作用。
EXTI线路:
- EXTI模块包含多个中断线路,每个线路对应于一个或多个GPIO引脚。例如,EXTI0可能对应于所有端口的第0个引脚(如GPIOA0、GPIOB0等)。这些EXTI线路可以单独配置来响应特定的事件(例如,上升沿或下降沿触发)。
NVIC(Nested Vectored Interrupt Controller):
- 一旦外部事件触发了EXTI线路,相应的中断信号将被发送到NVIC。NVIC管理所有的中断请求,并根据设置的优先级决定执行哪个中断服务程序。
中断号:
- 每个EXTI线路都分配有特定的中断号。这些号码用于在NVIC中识别不同的中断请求。
- 这里注意,EXTI9 - 5会触发同一个中断函数,15 - 10也会触发同一个中断函数。
其他外设中断源:
- 除了GPIO,还有其他外设(如PVD、RTC、USB、ETH等)可以作为中断源直接连接到EXTI。这意味着它们同样可以生成中断请求,尽管它们不通过GPIO路由。
5. AFIO
在STM32微控制器中,AFIO(Alternate Function I/O)是一个硬件模块,它允许用户重新映射内部外设到不同的引脚上。
例如,许多STM32设备的引脚都具有多个功能。一个GPIO引脚不仅可以作为普通的I/O引脚,也可以作为外部中断线(EXTI),或者作为其他复杂外设(如USART、SPI等)的通信引脚。AFIO就是用来配置这些复杂映射的。
对于外部中断来说,可能有多个GPIO引脚需要配置为中断输入,但实际上它们可能共享相同的中断线。举个例子,可能有PA0、PB0、PC0等,它们都希望能够映射到EXTI0中断线上。使用AFIO模块,你可以选择其中的任意一个来触发EXTI0中断。通常情况下,每个EXTI线路(如EXTI0、EXTI1、EXTI15)都可以连接到同一端口的相应引脚上(如PA0对应EXTI0,PA1对应EXTI1等)。但如果你想用PB0来触发EXTI0,就需要通过AFIO来进行重新映射。