目录
一、中断系统
中断系统是管理和执行中断的逻辑结构,外部中断是众多能产生中断的外设之一。
- 中断:在主程序运行过程中,出现了特定的中断触发条件(又叫中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。
- 中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。
- 中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。
中断触发条件,对于外部中断来说,可以是引脚发生了电平跳变;对于定时器,可以是定时的时间到了;对于串口通信,可以是接收到了数据。如果没有中断系统,外部中断会被忽略或者串口数据会被覆盖,主程序只能不断查询是否有这件事情发生,不能再做其他的事情。

如上图所示,在被暂停的地方,被称为断点,为保证程序执行之后还能回来继续执行原函数,在中断执行之前,会对程序现场进行保护,中断执行完毕之后,会再还原现场,这样保证主程序即使被打断,回来之后也可以继续运行,在用C 语言编程的时候,保护现场和还原现场的工作是编译器自动帮助做好的。

即当中断正在执行时,又有新的优先级更高的中断进来,那这里将会被再次打断,然后执行新的中断,新的中断执行结束之后,再继续原来的中断,原来的中断结束之后,再继续主程序 。一般中断程序都是在子函数中,这个函数是不需要我们调用的,当中断来临的时候,有硬件自动调用这个函数。
二、STM32中断
- 68个可屏蔽中断通道(中断通道即中断源的意思),包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设。(注意,对于具体的型号,可能没有这么多中断,68个中断源,这个是F1系列最多的中断数量,具体的数量以数据手册为准)。
- 使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级。(即NVIC是STM32中用来管理中断,分配优先级的)
最上面的灰色的部分,是内核中断。例如第一个Reset 就是复位中断,当产生复位事件时,程序就会自动执行复位中断函数,也就是复位后程序开始执行的位置,NMI 不可屏蔽中断,硬件失效,存储管理,总线错误,错误应用等,一般内核中的中断,都是比较复杂的,一般也用不到。
下面不是灰色部分的中断,是STM32外设中断。WWDG是窗口看门狗,PVD是电源电压检测等。
中间部分的EXT10~EXT14,EXT19_5和EXTI15_10就是一些常用的外部中断对应的中断资源。
最右边一列中断地址作用如下:在程序中的中断函数,它的地址是由编译器来分配的,是不固定的,但中断跳转,由于硬件条件的限制,只能跳到固定的地址执行程序,为了让硬件跳转到一个不固定的中断函数中,就有了在内存中定义一个地址列表的方法,这个列表地址是固定的,发生中断之后,只需跳到这个固定的位置即可,然后在这个固定位置,由编译器,再跳转到中断函数的代码,这样中断跳转就可以跳转到任意的位置。这个中断地址的列表,叫中断向量表。相当于中断跳转中的一个映射,但是在C语言编译中,中断向量表编译器已经做好了。
三、NVIC基本结构
NVIC的名字叫嵌套中断向量控制器,在STM32中,由其同意分配优先级和管理中断,NVIC是一个内核外设,是CPU的助手,因为STM32中的中断是非常多的,如果全都接入到CPU上,CPU 将分配出很多线进行适配,使其设计非常麻烦,同时如果很多中断同时申请,或者中断很多时会产生堵塞,所以才有了NVIC的出现,在NVIC中有很多的输入口可以提供给中断线路。
黑线箭头上的 n,代表的是一个外设可能会同时占用多个中断通道,所以有 n 条线,虽然NVIC只有一个输出口,但是NVIC会根据每个中断的优先级分配中断的先后顺序,然后通过这个输出口告诉CPU该处理哪一个中断,对于中断先后顺序分配的任务,CPU不需要知道。
四、NVIC 优先级分组
NVIC可以理解成为一个医院叫号系统,医生叫病人:叫号系统就是NVIC。
响应优先级:上一个病人在看病,当看完之后,紧急的病人即使是后面来的,也会优先看病,这种插队的优先级,叫响应优先级,响应优先级高的,就可以插队看病。
抢占优先级:如果病人更加紧急,此时医生已经在看其他的病人了,那他可以不等上一个人看完,直接冲进医生的屋里,让上一个病人靠边等待,先给他看病,看完之后,然后上一个病人再继续,上一个病人看完了,再从叫号系统找找下一个来,这种决定可不可以中断嵌套的优先级,叫抢占优先级,抢占优先级高的,可以中断嵌套。
NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级。(这里的4位指的是2*2*2*2=16种不同的转态,即组成0000~1111这16种不同的二进制位)
如下图所示,STM32的NVIC对优先级分组为抢占优先级和响应优先级,抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队。
优先级的数是值越小,优先级越高,0是最高优先级。
然后四位可以进行拆分,分位 n 位的抢占优先级和 4 - n 位的响应优先级。
抢占优先级和响应优先级均相同的按照中断号排队,中断号小的优先响应。中断号如下图所示:
五、EXTI 简介
- EXTI(Extern Interrupt)外部中断。
- EXTI 可以检测指定GPIO口的电平信号,当其指定的GPIO产生电平变化时,EXTI 将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI 对应的中断程序。
- 支持的触发方式:上升沿/下降沿/双边沿/软件触发。
- 支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断(就是PA0和PB0不能同时使用,只能选自一个作为中断引脚)
- 通道数:16个GPIO_Pin(GPIO_Pin0 ~ GPIO_Pin15),外加PVD输出,RTC 闹钟,USB唤醒,以太网唤醒。
- 触发响应方式:中断响应/事件响应
上升沿:即电平从低电平变到高电平的瞬间触发中断。
下降沿:即高电平变到低电平的瞬间触发中断。
双边沿:就是上升沿和下降沿都可以触发中断。
软件触发:即引脚电平什么变化都没有,程序里执行一句代码,就能触发中断。
中断响应:就是申请中断,让CPU执行函数。
事件响应:是STM32对外部中断增加的一种额外的功能,当外部中断检测到引脚电平变化时,正常的流程是选择触发中断,但是STM32中,也可以选择触发一个事件,如果选择触发事件,那外部中断的信号就不会通向CPU,而是通向其他外设,用来触发其他设备的操作。(比如触发ADC,DMA等)。总结一下:即中断响应走的是正常流程,引脚电平变化触发中断,事件触发不会触发中断,而是触发别的外设操作,属于外设之间的联合工作。
六、EXTI 基本结构
如上图所示,最左边是GPIO口的外设,每一个GPIO口有16个引脚,所以进来16根线。进入到红色AFIO中断引脚选择电路模式,即AFIO是一个数据选择器,可以在前面的GPIO外设的16个引脚里选择其中一个连接到后面的EXTI 通道中,与请问中的相同的Pin不能同时触发中断呼应。
然后通过 AFIO 选择之后的16个通道,接入到EXTI 边沿检测及控制电路上,加上下面四个,组成了EXTI 的20个输入信号。
经过EXTI电路之后,分为两种输出,上面的是接到 NVIC,是用来触发中断的。值得注意的是,本来20路输入,应该是20路中断输出,但是由于ST 公司觉得20个输出可能太多了,比较占用NVIC 的通道资源,因此把其中外部中断的9 ~ 5 和 15 ~ 10给分到了一个通道中,也就是说,外部中断的 9 ~ 5会触发同一个中断函数,15 ~ 10也会触发同一个中断函数,在编程时,我们在这两个中断函数里需要再根据标志位来区分到底是哪一个中断进来的。
右下方的20条输出线路是到其他外设的,这是用来触发其他外设操作的,也就是我们所说的事件响应。
七、AFIO 复用 IO 口
AFIO主要用于引脚复用功能的选择和重定义。(也就是数据选择器的作用)
在STM32中,AFIO主要完成两个任务:复用功能引脚重映射(就是把全文中引脚定义的途中的默认复用功能的引脚换到重定义的位置)、中断引脚选择。
通过数据选择器,最终选择一个,连接到EXTI上
八、EXTI 框图
上图第3个步骤,可以证明请问中的支持触发方式是正确的,即EXTI支持的触发方式是上升沿/下降沿/双边沿/软件触发。
在步骤7中,如果中断挂起寄存器置位1,就会继续向左走,与中断屏蔽寄存器共同进入一个与门,最后进入NVIC中断控制器。
步骤8触发中断中的与门实际是一个开关的作用。相当于当中断屏蔽寄存器给1,另外一个输入就直接输出,即允许中断;中断屏蔽寄存器给0,那就相当于屏蔽这个中断,故类似于开关的作用。
步骤6中的触发事件也是相同的道理,用一个事件赔不起进行开关控制,最后通过一个脉冲发生器,到其他外设,这个额脉冲发生器就是给一个电脉冲,用来触发其他外设动作。
剩下的最左边的斜线上写着20,表示的就是这是20个通道。最上面的就是外设接口和APB 总线,可以通过总线访问这些寄存器。
九、与门/或门/非门/数据选择器
下图是与门,或门,非门。
- 与门中可以有多个输入,但是只能有一个输出。执行的逻辑是在输入端只要有一个是低电平0,则输出就是0,只有全部都输如1,输出才是1。
- 或门也是可以有多个输入,但是也只能有一个输出。执行的逻辑是在输入端中,只要有一个高电平1,输出的就是高电平1,只有全部输入低电平0时输出才为0。
- 非门是三角号带圈的,只能有一个输入,一个输出。执行的逻辑是当输入端输入高电平1,输出端输出低电平0,反之亦然。
下图是数据选择器:有多个输入,一个输出,在侧面选择控制端的数据,从输入选择一个接到输。出