STM32EXIT外部中断&中断系统
中断系统
中断触发条件:
对外部中断来说,可以是引脚发生了电平跳变
对定时器来说,可以是定时的时间到了
对串口通信来说,可以是接收到了数据
当这些事件发生时,情况比较紧急,比如外部中断来了,如果不处理,下一个跳变信号就跟着过来了。
比如串口接收中断来了,如果不读取接收到的数据,那下一个数据再过来,就会把原来的数据覆盖掉。
所以希望当中断条件满足时,CPU能够立即停下当前执行的程序,转而去处理中断事件的程序。
中断处理流程和用途:
比如外部中断来了,需要计次,那就变量++;串口中断来了就把接收到的数据转存起来;处理完紧急事情后,CPU回到原来程序运行的位置。
使用中断系统,能极大地提高程序的效率,如果没有中断系统,为了防止外部中断被忽略或者串口数据被覆盖,那主程序就只能不断地查询是否有这些事件发生,不能在干其他的事情。
如果没有定时器中断,那主函数就只有靠Delay函数,才能实现定时的功能。有了中断系统之后,主程序就可以放心执行其他事情,有中断的时候再去处理。大大提升效率。
中断优先级是根据程序设计的需求,自己设置的。紧急的事情优先级要设置地高一点,这样可以更好地安排中断事件,防止紧急的事件被别的中断耽误。
中断嵌套也是为了照顾非常紧急的中断的,能否进行中断嵌套,由中断优先级来决定。
中断来了,主程序都得立即暂停,程序由硬件电路自动跳转到中断程序中。
中断执行前,进行现场保护
中断执行后,会再还原现场。保证主程序即使被中断了,回来后也能继续运行。
用C语言编程,保护现场和还原现场并不需要我们操作(操作系统里面有中断的概念),由编译器做好。
C语言程序中中断的执行流程:
一般中断程序都是在一个子函数里面,这个函数不需要我们调用,当中断来临时,由硬件自动调用这个函数。
STM32中断
中断通道就是中断源的意思,68个是F1系列最多的中断数量,对于一个具体的型号来说,可能没有这么多中断,所以这个数量看看就行,具体以对应型号的数据手册为准。
STM32的中断非常多,几乎所有模块都能申请中断,
NVIC就是STM32中用来管理中断,分配优先级的。
灰色的部分是内核的中断,
1.Reset复位中断 当产生复位事件时,程序就会自动执行复位中断函数,也就是复位后程序开始执行的位置
2.后面的各种灰色的中断都是内核里面的,一般比较高深,看上去也难理解,但是这些中断我们一般用不到,所以了解一下即可
不是灰色的部分的:就是STM32外设的中断了。
比如:
WWDG 窗口看门狗,用来监测程序运行状态的中断,比如程序卡死了,没有及时喂狗,窗口看门狗就会申请中断,程序就会调到窗口看门狗的中断程序里,在中断程序里就可以进行一些错误检查,看看出现什么问题了。
PVD 电源电压监测,如果供电电压不足,PVD电路就会申请中断,在中断里就知道,现在供电不足,是不是电池没电了,要赶紧保存一下重要数据。
TAMPER 外设电路检测到异常或者什么事件,需要提示CPU的时候,就可以申请中断,让程序调到对应的中断函数里运行,用来处理异常或事件
EXTI0-EXTI4,EXTI9_5-EXTI15_10就是本节外部中断对应的中断资源。
中断的地址的作用:因为程序中的中断函数,它的地址由编译器分配的,是不固定的。但是中断的跳转,由于硬件限制,只能跳转到固定的地址执行程序,所以为了能让硬件跳转到一个不固定的中断函数里面,就需要在内存中定义一个地址的列表。这个列表地址固定,中断发生后,就跳到这个固定位置。然后有编译器再加上一条跳转到中断函数的代码,这样中断函数就可以跳转到任意位置了。
中断地址的列表:叫做中断向量表,相当于中断跳转的一个跳板。(不过C语言编程不需要管这个中断向量表,因为编译器帮我们做好了)
NVIC嵌套中断向量控制器基本结构
在STM32中,NVIC用来统一分配中断优先级和管理中断的,NVIC是一个内核外设,是CPU的小助手。
STM32中断非常多,如果把中断都接到CPU上,那么CPU得引出很多线进行适配,设计上就很麻烦,并且很多中断同时申请,或者中断很多产生了拥堵,CPU就很难处理,毕竟CPU主要用来做运算的。所以中断分配的任务就放到别的地方。所以NVIC就出现了。
NVIC有很多输入口,有多少个中断线路,都可以接过来。(这里斜杠上写个n,意思是一个外设可能会同时占用多个中断通道,所以有n条线),