32-Bit Timer Unchained Mode下,想产生一个10秒的中断,发现每次中断产生的时间都不一样,代码如下:
void int_init()
{ CSR = 0x100; //disable all interrupts
IER = 1; //disable all interrupts except NMI
ICR = 0xffff; //clear all pending interrupts
ISTP = 0x10800000; //set the ISTP equals the INT address in the .cmd
INTC_EVTCLR0 = 0xFFFFFFFF;
INTC_EVTCLR1 = 0xFFFFFFFF;
INTC_EVTCLR2 = 0xFFFFFFFF;
INTC_EVTCLR3 = 0xFFFFFFFF;
INTC_EVTMASK0 = 0xFFFFFFEF; //Timer0-TINT12 is combined
INTC_EVTMASK1 = 0xFFFFFFFF;
INTC_EVTMASK2 = 0xFFFFFFFF;
INTC_EVTMASK3 = 0xFFFFFFFF;
INTC_INTMUX3 = 0x00040000; //map Timer0-TINT12 to INT14
TIMER0_TIM12 = 0x00000000;
TIMER0_PRD12 = 0x1017DF80; //27M时钟,10S计时
TIMER0_TGCR = 0x00000005;
TIMER0_TCR = 0x00000080;//The timer is enabled one time. The timer stops after the counter reaches the period.
IER |= 0x00004002; //enable int14-timer0
CSR=0x01 ; // enable all interrupts
}
以上代码没有产生期望的十秒中断,在中断产生时查看输出的TIMER0_TIM12的值每次都不一样。TIMER0_PRD12这个值是怎么计算的?
Shine:
Emulation Management Register (EMUMGT)寄存器是怎么配的? 如果是Free模式的话, 因为你用的是continous计时模式, 所以即使仿真器断点停下了, timer还是在计数的. TOUT管脚输出信号频率是多少?
devin chen1:
回复 Shine:
EMUMGT 寄存器是0,我要的是10秒的计时,定时器启动到10S就发出一个中断。Tout输出等都没有去配置,都是default值0。
Shine:
回复 devin chen1:
第一次进timer中断, TIM12 count寄存器值对吗, 能计到0x1017DF80吗? 后面几次的TIM12计数器值都不对?
devin chen1:
回复 Shine:
第一次中断进入,TIM12 count寄存器值就不对,后面的中断再进入也不对。每次TIM12 count寄存器值都不一样
Shine:
回复 devin chen1:
看你的timer配置没问题. 如果能进中断的话, TIM12的值会计到PRD才会产生中断.你能配一下TOUT吗? 看看输出波形有没有什么规律? 或者你先PRD设小一点, 如10, 看能正确计数吗?
devin chen1:
回复 Shine:
设置TIM0BK为1,pin设置为Tout0L,用示波器量,发现pin被设置为Tout0L后就一直输出1.58833MHz的波形,改动PRD值都不会影响到这个波形。
PRD值不管改大改小,都不能正确的计数。
Shine:
回复 devin chen1:
参考一下PSP的timer例程吧, 正好是unchained mode, 在DM648_BIOSPSP_RELEASE_01_10_03\pspdrivers_1_10_03\packages\ti\sdo\pspdrivers\soc\dm6437\examples\timer
下载BIOS PSP Release version 1.10.03http://software-dl.ti.com/dsps/dsps_registered_sw/sdo_sb/targetcontent/psp/bios_psp/index.html