相信不少和我一样的新手也有过对51单片机的中断优先级有过迷惑,之前我在自己的博客上做过简单的整理,现在搬运过来,希望能给和我一样的新手一个看得懂的解释。
51单片机有两种优先级——查询优先级&&执行优先级。
查询优先级:
查询优先级是指当51单片机的多个中断源同时引起中断时,CPU逐个查询中断标志位的次序,高优先级的中断标志位将被优先查询到,但并不代表查询优先级高的中断一定可以打断正在执行中断处理的低优先级中断。查询优先级由单片机硬件决定,不可更改,可在相应的数据手册中得知,如下:
(不熟悉本论坛的排版,图片可能会在文章末尾显示,请见谅)
举个栗子:
1、当定时器中断0和外部中断1同时引起时(没有设置中断优先级控制寄存器),则会首先执行定时器中断0的请求;
2、当定时器中断0和外部中断1同时引起且外部中断1正在执行请求时(没有设置中断优先级控制寄存器),外部中断1不能被任何中断(包括定时器中断0)所打断。
执行优先级:
执行优先级由中断优先级控制寄存器IP来控制。
(不熟悉本论坛的排版,图片可能会在文章末尾显示,请见谅)
寄存器IP设置如下:
高两位置0
PT2:定时器中断2优先级控制位
PS:串口中断优先级控制位
PT1:定时器中断1优先级控制位
PX1:外部中断1优先级控制位
PT0:定时器中断0优先级控制位
PX0:外部中断0优先级控制位
如果只设置IP,执行优先级则只有两级——高优先级(IP中的相应位置1)和低优先级(IP中的相应位置0)。若寄存器IP没有设置(即寄存器IP所有位全为0),则只按照查询优先级进行。
当多个中断源同时引起中断时,优先响应执行优先级高的中断;
同一执行优先级的中断则根据查询优先级依次响应;
一个正在执行的低优先级中断能被高优先级中断所打断,反之则不能;
一个正在执行的中断不能被新的同优先级中断所打断。
举个栗子:
当IP中的PX1位和PT0位置1,其余位置0时,中断的响应次序依次为:
定时器中断0 → 外部中断1 → 外部中断0 → 定时器中断1 → 串口中断 → 定时器中断2中断优先级控制寄存器
查询优先级,截取自STC89C52数据手册