根据以下的现实:
①中止子程序中,清楚中止标志位时,假如运用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指令的句子,因为我对汇编不太懂,暂时不实验。
这样就能够证明猜测正确,一起也得出了解决办法。