我在做自己的试验时,发现每当我的计数器寄存器值达到输出比较寄存器1值时,确实的发生了中断,但是在中断的过程中,计数器寄存器值立刻跳到输出比较寄存器2的值后面,如果oc2R=0x8000,则计数器寄存器值会在0x800c等几个值,总之不管oc2r改为多少,经常性的出现这个情况。 而且有时候没有出现这个情况时,我的csr值会不知道被那个步骤给事先读取,这样子csr就被清零了,不能实现我的目标;事实上我的程序还没有运行到读取TBcsr那一步。 难道是因为c语言和汇编的问题,汇编稳定性高?
还有个问题,你们给的那个输出比较定时器例程,我也单步执行了,结果是正确的(ps 我那个定时器程序几乎和你们给的一样,除了我自己的那些main程序) 但是你们的当执行到while (TimerTick < 100)时,刚好是tof被置位的第二步,理论上应该是先读csr再写或读clr才能清掉tof这一位,但事实上你们的程序没有这个代码他也自动把tof给清零了,这是怎么回事?难道我理解有问题? 而且你们的中断代码里还有那个清除tof的代码,要是之前被自动清除的话这句就没意义了啊。
但愿我仿真器没问题。 main() { // 第一次使能Timer时,Counter是从0xFFFC开始计数,所以第一次输出比较的值要减4 Timer_Step = OC1_10us - 4; // Timer start from 0xFFFC, so deduct 4
TACSR = CSR_TIMD; // Disable the Timer TACR1 = CR1_OCIE; // Enable OC interrupt TACR2 = 0x04; // Prescaler = /2 TAOC1HR = Timer_Step >> 8; TAOC1LR = Timer_Step; TACLR = 0; // Clear the counter TACSR = 0; // Enable the timer //Timer_Step += OC1_10us; // Prepare next time OC value _asm("rim"); // Enable global interrupt
TimerTick = 0; while (TimerTick < 100) { // 分别用100和200各运行一次 //TACLR=0x07; _asm("nop"); } _asm("nop"); // 调试时在此设一个断点,察看执行的时间 _asm("halt"); } |