目录
一、中断简介
(一)中断(外部中断、定时器中断、串口中断... ...)
中断源:能够发出中断请求信号的来源统称为中断源
中断过程:程序运行时,因触发了特定的条件(中断触发条件)产生中断源(产生中断请求信号),从而迫使单片机的CPU暂停正在执行的程序 ,转而去进行中断事件的处理;中断处理完毕后.又返回主程序被中断前的位置(返回主程序),并继续执行中断前的代码。(自动进入和退出中断时能够自动保护主函数程序的现场和恢复主主函数程序的现场(保护和恢复现场))。
简单来说:CPU暂时停止执行当前的A程序,先去执行B程序,等B程序执行完以后,返回A程序中断前的代码所在地并继续执行A程序。
比如:小明在房间写作业写到第10行,小明的父母让其马上去厨房关火,于是小明停下手中的笔去厨房关火,之后再回到房间里从作业的第10行继续写作业。
上述的例子,写作业相当于是主程序,去厨房关火相当于中断服务函数的内容,触发中断的条件相当于小明的父母喊他去做这件事,从作业的第10行继续写作业相当于是返回并执行中断前的主程序。
(二)中断优先级与中断嵌套
1、中断优先级:同时出现多个中断的情况下,内核中的NVIC(所有需要经过CPU的中断都要配置NVIC,相当于是帮助CPU整理要执行中断的顺序的小助手)会通过各个中断的中断优先级排序,并逐一告诉CPU优先执行哪一个中断,中断优先级就是判断哪个中断先执行的标准。
2、中断嵌套:中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,此时会停止当前正在执行的级别较低的中断服务程序,转为去处理级别更高的中断源,待处理完毕,再返回到被打断的较低级的中断服务程序中,并继续执行被中断前所在位置程序的过程。
简单来说就是一个进行低级中断服务程序时被高级中断服务程序打断,进而停止执行低级中断去执行高级中断,执行完高级中断返回低级中断继续执行。(下图执行高级中断服务程序的部分就是中断嵌套)
原则:高级中断可以打断低级中断,而低级中断不能打断高级中断。
例如:小王上班敲代码时被经理叫去谈话,在和经理谈话的过程中又被老板单独叫去办公室训话,被老板训完话之后又去经理那继续剩下的谈话,谈完话之后又回去接着敲代码。
上述例子,被经理叫去谈话相当于低级中断,被老板叫去训话相当于高级中断,和经理谈话的过程中被叫去和老板谈话就相当于是低级中断被高级中断打断,这时就相当于是中断嵌套。
二、外部中断
使用场景:想要获取的信号是外部驱动的很快的突发信号,若放在主函数的while(1)中,由于信号非常快时,32可能会跟不上,导致错过很多波形(红外,旋转编码器等);
按键虽然也是外部驱动的突发事件,但不好处理按键抖动和松手检测的问题,且输出波形也不是转瞬即逝,对按键检测灵敏要求不高的可以在主函数while中读取。
外部中断: 所有IO都可以当中断源(中断信号产生的端口),中断函数的名字都是固定的(中断号都在_hd.s),51只有固定的2个IO可以当外部中断。(中断号都在_hd.s)但不能用相同的PIN触发中断, eg:PA0、PB0/PA1、PB1、PC1等不能同时触发中断,中断通道(中断源)有20个:16个GPIOx_PIN、其他4个不常用。(下图为中断线0~15图示,