什么是寄存器?
寄存器是特殊的RAM,特殊功能寄存器是控制单片机硬件的开关(例如IE)或者是指示单片机状态的信号(例如PSW),通过特殊寄存器你就可以方便的控制整个MCU,并且知道当前的MCU的工作状态。
中断概念:
CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生),那么CPU就会暂停当前的工作(A事件),去执行B事件(中断响应和中断服务),然后B事件做完之后,再回到原来的事件(A事件)中继续工作(中断的返回)。
优点:
- 分时操作:CPU可以分时为多个I/O设备服务,提高了计算机的利用率。
- 实时操作:CPU能够及时处理应用系统的随机事件,系统的实时性大大增强。
- 可靠性高:CPU具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性更高。
中断系统结构:
如果EA没置1,其他的允许位置1,也不会发生中断。
中断处理过程:
1.中断允许寄存器IE
EA: 总中断允许。 EA=0;CPU屏蔽所有中断的请求 EA=1;开放所有中断。
ES:串行口中断允许位。ES=0; 禁止串行中断。ES=1; 允许串口中断。
ET0、ET1: 定时器/计数器0 和 定时器/计数器 1 中断允许位 =0时 禁止相应的定时器中断。 =1 允许相应的定时器中断。
EX0、EX1: 外部中断0 和 外部中断 1 中断允许位。=0时 禁止相应的外部中断。 =1时 允许相应的外部中断。
——:无效位
2.中断优先级寄存器IP
PS——串行口中断优先级控制位
PS=1,串行口中断定义为高优先级中断。
PS=0,串行口中断定义为低优先级中断。
PT1——定时器/计数器1中断优先级控制位
PT1=1,定时器/计数器1中断定义为高优先级中断。
PT1=0,定时器/计数器1中断定义为低优先级中断。
PX1——外部中断1中断优先级控制位
PX1=1,外部中断1定义为高优先级中断。
PX1=0,外部中断1定义为低优先级中断。
PT0——定时器/计数器0中断优先级控制位
PT0=1,定时器/计数器0中断定义为高优先级中断。
PT0=0,定时器/计数器0中断定义为低优先级中断。
PX0——外部中断0中断优先级控制位
PX0=1,外部中断0定义为高优先级中断。
PX0=0,外部中断0定义为低优先级中断。
中断优先级(高到低)
外部中断0TCON
T0溢出中断
外部中断1
T1溢出中断
串行口中断
T2溢出中断(52)
在没有设置中断优先级情况下,若几个同级中断同时向CPU请求中断响应,按照自然优先级响应中断;在设置中断优先级后,则按照设置顺序先后响应中断。
各中断源响应优先级及中断服务程序入口
3.定时器/计数器控制寄存器TCON
IE0/IE1:外部中断申请标志位
=0:没有外部中断申请
=1:有外部中断申请
IT0/IT1:外部中断请求的触发方式选择位
=0:在INT0/INT1端申请中断的信号低电平有效
=1:在INT0/INT1端申请中断的信号负跳变有效(下降沿)
中断函数与普通函数的区别
中断函数:void 中断函数名(void) interrupt n.(using m),其中:n表示第n个中断,m表示第m组工作寄存器,默认为0.n取0-3,m取0-5
例如:void timeroisr (void) interrupt 1using 1
①中断函数与普通函数相比要注意在入口屏蔽一些中断,在出口恢复,防止中断函数在处理重要工作中又被中断重入,导致处理异常。
②中断函数还要注意在入口保存重要的寄存器状态,特别是函数中用到的寄存器,在出口恢复,防止中断函数结束后给正常程序带来异常。
③普通函数相当于子程序,完全可以写到主函数当中去。
④中断函数一般是和硬件相关联,在一定条件下才跳转进入的函数。
⑤中断函数需要预先设定中断条件。
⑥中断服务程序的入口地址是相对固定的,而普通的功能程序入口则是随意设置的,此外,中断服务程序的调用是靠中断申请信号而非普通程序。
中断函数的编码注意事项
三个大注意事项
1、中断函数代码应尽量简洁。一般不宜在中断函数内编写大量复杂冗长的代码;应尽量避免在中断函数内调用其他自定义函数;
2、尽量避免在中断内调用数学函数。因为某些数学函数涉及相关的库函数调用和中间变量较多,可能出现交叉调用。在必须使用数学函数时,可考虑将复杂的数学函数运算任务交给主程序完成,中断函数通过全局变量引用其结果;
3、宏的定义与调用。在中断函数中调用宏,可减少在函数调用中压栈与出栈的开销。
九个小注意事项
1、中断函数不能进行参数传递
2、中断函数没有返回值
3、在任何情况下都不能直接调用中断函数
4、中断函数使用浮点运算要保存浮点寄存器的状态。
5、如果在中断函数中调用了其它函数,则被调用函数所使用的寄存器必须与中断函数相同,被调函数最好设置为可重入的。
7、中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明。防止其它程序调用。
8、在设计中断时,要注意的是哪些功能应该放在中断程序中,哪些功能应该放在主程序中。一般来说中断服务程序应该做最少量的工作,这样做有很多好处。
首先系统对中断的反应面更宽了,有些系统如果丢失中断或对中断反应太慢将产生十分严重的后果,这时有充足的时间等待中断是十分重要的。其次它可使中断服务程序的结构简单,不容易出错。中断程序中放入的东西越多,他们之间越容易起冲突。简化中断服务程序意味着软件中将有更多的代码段,但可把这些都放入主程序中。
9、中断服务程序的设计对系统的成败有至关重要的作用,要仔细考虑各中断之间的关系和每个中断执行的时间,特别要注意那些对同一个数据进行操作的中断
使用中断服务函数应遵循的规则
(1)中断服务西数不能进行参数转递。
(2)在任何情祝下,都不能直接调用中断服务函数。