你好,
我在调试代码时发现有一处T2自动重载中断比理论值长5%。经反复测试,似乎是中断里的代码会影响T2的周期。我写了一个测试代码,可在多片CH552上复现此问题。暂时代码用Arduino框架执行。
void Timer2Interrupt(void) __interrupt (INT_NO_TMR2) { timer2IntrHandler();//debugwire related } void timer2IntrHandler() { // if (TF2) { TF2 = 0; P1_4 = 0; P1_4=0; P1_4=0; P1_4=0; P1_4=0; P1_4=0; P1_4=0; P1_4=0; P1_4=0; P1_4=0; P1_4=0; P1_4=0; P1_4=0; P1_4=0; P1_4=0; P1_4=0; P1_4=0; P1_4=0; P1_4=0; P1_4=0; P1_4=0; P1_4=0; // __asm__("nop"); // __asm__("nop"); // __asm__("nop"); // __asm__("nop"); // __asm__("nop"); // __asm__("nop"); // __asm__("nop"); // __asm__("nop"); // __asm__("nop"); // __asm__("nop"); // __asm__("nop"); // __asm__("nop"); // __asm__("nop"); // __asm__("nop"); // __asm__("nop"); // __asm__("nop"); // __asm__("nop"); // __asm__("nop"); // __asm__("nop"); // __asm__("nop"); P1_4 = 1; } } void setup() { // put your setup code here, to run once: TR2 = 0; // RCLK = 0; TCLK = 0; // clear RCLK,TCLK in T2CON C_T2 = 0; // clear C_T2 in T2CON for using internal clk EXEN2 = 0; // clear EXEN2 in T2CON to disable T2EX T2MOD |= (bT2_CLK) | bTMR_CLK; // set bT2_CLK, for fast clk.Using Fsys/4 CP_RL2 = 0; // clear CP_RL2 in T2CON for 16bit timer, reload mode RCAP2 = 65536 - 128; TF2 = 0; EXF2 = 0; TR2 = 1; // start timer TL2 = 0x00; // seem only work when timer is on? TH2 = 0xFF; ET2 = 1; } void loop() { // put your main code here, to run repeatedly: }
16M时钟下中断应该是125K的频率,一次8us。
但是如果我写一大堆P1_4=0,中断就会变慢。
如果我把多余的P1_4=0换成nop,就正常许多。
请问这是我对定时器理解不对还是芯片Bug?