微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机两个PIT中断不能同时运行的解决方法

单片机两个PIT中断不能同时运行的解决方法

时间:11-24 来源:互联网 点击:
基于以下的事实:

①中断子程序中,清楚中断标志位时,如果使用BSET位操作指令,PITTF清零,PIT1的中断标志位也被清零;(《单片机嵌入式系统开发方法》P238)
PIT中断优先级通道0大于通道1;
③1s恰好是10ms的整数倍。

所以,每到1s的时候,通道0和通道1同时发生中断,由于通道0优先级高,先进入通道0的中断子程序,而通道0的中断子程序中的清中断动作把通道1的中断标志位也清零,这样等通道0的中断程序返回时,通道1就不能发生中断了,这样通道1的中断子程序就永远不能运行。
我查看了PITTF_PTF = 1;的汇编代码为C083 BSET 0x0345,#2。

当然这只是猜想,验证如下:
1)针对③,把PIT1中断时间改为979.975ms,200*39199/8000000=0.979975s,可以运行。
2)针对②,PIT0清中断的方式是关闭PIT通道后再开启,PIT1清中断的方式是“PITTF_PTF1 = 1;”,可以运行。解释如下:通道0的中断程序运行后,马上关闭通道0,这时CPU响应通道1的中断,通道0的中断程序被中断,等到通道1的中断程序返回后,再运行通道0的中断程序。如果把PIT1清中断的方式变为关闭PIT通道后再开启效果相同。
3)针对②,将PIT0和PIT1的中断时间反转,PIT01s中断一次,PIT110ms中断一次,这样,运行1s,PIT1失效一次,可以运行。
4)把清中断的C语句改为不编译为BSET指令的语句,由于我对汇编不太懂,暂时不试验。

这样就可以证明猜想正确,同时也得出了解决方法。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top