Bootstrap

STM32单片机中断系统

中断系统

中断系统的作用:用于响应和处理突发事件或紧急事件。

中断

中断定义:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。

中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。

中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。

STM32中断

68个可屏蔽中断通道,包含EXTI(外部中断)、TIM(定时器)、ADC(模数转换器)、 USART串口、SPI通信、12C通信、RTC实时时钟等多个外设。

NVIC作用:使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级。

STM32中的内核中断

这些中断比较高深,一般用不到,了解下即可。

STM32中的外设中断

WWDG窗口看门狗,用来监测程序运行状态的中断。

比如:你的程序卡死,没有及时喂狗,窗口看门狗就会申请中断,让你的程序调到窗口看门狗的中断程序里,在中断程序里就可以进行错误检查,看看出了什么问题。

PVD电源电压监测,如果你的供电电压不足,PVD电路就会申请中断,你在中断里就知道,现在供电不足,是不是电池没电了,赶紧保存一下重要数据。

外设电路检测到异常或事件,需要提醒一下CPU的时候,就可以申请中断,让程序调到对应的中断函数里运行一次,用来处理这个异常或事件。

EXTI0-EXTI4、EXTI9_5、EXTI15_10

中断地址的作用

因为我们程序中的中断函数的地址是由编译器来分配的,是不固定的,但是我们的中断跳转由于硬件的限制,只能跳到固定的地址执行程序,为了让硬件跳转到一个不固定的中断函数里,需要在内存中定义一个地址列表,这个地址列表是固定的,中断发生后,就跳到这个固定位置,然后在这个固定位置,由编译器,再加上一条跳转到中断函数的代码,这样中断跳转就可以跳转到任意位置。中断地址的列表就叫中断向量表,相当于中断跳转的一个跳板,用C语言编程时,不需要管这个中断向量表,因为编译器已经帮我们做好了。

NVIC的基本结构

NVIC(嵌套中断向量控制器)

用来统一分配中断优先级管理中断,是一个内核外设,是CPU的小助手

/n:表示一个外设可能同时占用n个中断通道,所以这里是n条线

NVIC优先级分组

NVIC的中断优先级由优先级寄存器的4位(0~15对应每个中断通道有16个可编程的优先等级)决定,这4位可以进行切分,分为高n位的抢占优先级和低4—n位的响应优先级

抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队、插队,抢占优先级和响应优先级均相同的按中断号排队(中断号为表55中的优先级)

EXTI(Extern Interrupt)外部中断

EXTI功能:EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序

支持的触发方式:上升沿/下降沿/双边沿/软件触发(代码编写)

支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断。意思就是:PA0和PB0不能同时用;PA1、PB1、PB1,pin一样,只能选其中一个作为中断引脚

通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒

16个GPIO_Pin是主要的;外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒是来蹭网的

触发响应方式:中断响应/事件响应

中断响应是正常的流程,引脚电平变化触发中断

事件响应不会触发中断,而是触发别的外设操作,属于外设之间的联合工作

EXIT基本结构

AFIO中断引脚选择:相当于数据选择器,可以在前面3个GPIO外设的16个引脚里选择其中的一个连接到后面EXIT的通道里

注意:外部中断的9~5给分配到了一个EXIT9_5通道里,触发同一个中断函数。15~10给分配到了一个EXIT9_5EXIT15_10通道里,也触发同一个中断函数。因此在编程时,我们在这两个中断函数里,需要再根据标志位来区分到底是哪个中断位进来的

右下角的20条输出线路:用来触发其他外设操作的,就是相应事件

AFIO复用IO口

功能:用于引脚复用功能的选择和重定义

在STM32中,AFIO主要任务:复用功能引脚重映射、中断引脚选择

从这个图也可以反映出为什么相同的Pin不能同时触发中断

EXTI内部框图

EXIT框图解释

20条输入线先进入边沿检测电路,边沿检测电路上面的上升沿寄存器和下降沿寄存器,可以选择是上升沿触发还是下降沿触发,或者两个都触发,接着触发信号就进入到或门输入端,硬件触发和软件中断寄存器的值连到了这个或门上,任意一个为1则输出1,所以,支持的触发方式是上升沿、下降沿、双边沿(上升沿和下降沿都触发)、软件触发。触发信号通过或门后的上面一路是触发中断的,下面一路是触发事件的。

上面一路是触发中断:触发中断首先挂起寄存器,相当于一个中断标志位,我们可读取该寄存器判断是哪个通道触发的中断,如果中断寄存器置1,那它会继续向左走,和中断屏蔽寄存器共同进入一个与门,再至NVIC中断控制器,这里的与门实际上是开关的作用,对与门来说,1与上任意数X,等于任意数X。相当于中断屏蔽寄存器给1,那另一个输入就是直接输入,也就是允许中断;中断屏蔽寄存器给0,那另一个输入无论是什么,输出都是0,相当于屏蔽这个中断。

下面一路是触发事件:首先是事件屏蔽寄存器进行开关控制,同上述原理,最后通过一个脉冲发生器,到其他外设,这个脉冲发生器就是给一个电平脉冲,用来触发其他外设动作。

/20:表示20根线,代表20个通道。

顶端是外设接口和APB总线,我们可以通过总线访问这些寄存器。

什么样的设备需要用到外部中断,使用外部中断的好处

使用外部中断模块的特性

对于STM32来说,想要获取的信号是外部驱动的很快的突发信号

比如:旋转编码器的输出信号,这个信号是突发的,STM32不知道什么时候会来,同时旋转编码器是外部驱动的,STM32只能被动读取,旋转编码器的输出信号非常快,STM32稍晚来一点,就会错过很多波形信号,因此就要使用外部中断;红外遥控接收头的输出。

按键不推荐使用外部中断来读取按键:虽然按键的动作是外部驱动的突发事件,但外部中断不好处理按键抖动和松手检测的问题,对于按键来说,他的输出波形也不是转瞬即逝的,要求不高的话可以在主程序中循环读取或者定时器中断读取的方式,这样既可以做到后台读取按键值、不阻塞主程序,也很好的处理按键抖动和松手检测的问题。

旋转编码器介绍

旋转编码器功能∶用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向

类型:机械触点式/霍尔传感器式/光栅式

中间的圆的金属片是一个按键,可以按下去

旋转编码器是怎么区分正转和反转?

编码盘,是一系列像光栅一样的东西,上面是金属触点,在旋转时,依次接通和断开两边的触点,这个金属盘的位置是经过设计的,它能让两侧触点的通断产生一个90°的相位差,配合外部电路,编码器的两个输出就会输出这样的波形:正转时,B的波形方波信号相较于A的波形滞后90°;反转时,A的波形方波信号相较于B的波形方波信号滞后90°。这样就区分了正转和反转。这种相位相差90°的波形就叫正交波形。带正交波形信号输出的编码器是可以用来测方向的。

还有其他测方向的方法:一个引脚输出一组方波信号代表转速,另一个输出高低电平代表旋转方向,正转高电平,反转低电平。

外部中断代码部分

;