请教下关于定时器的问题:
在原有的6670程序上参考Timer例程(感谢Andy Yin1大大,http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/47664.aspx),因为初始化是用gel配置好的,我在原来的代码(非例程的)上增加了例程中的Timer_Interrupts_Init()中断初始化函数、Timer_ISR()中断服务函数和generate_clocks_by_timer()定时器函数,并在程序目录中新增.asm文件,将中断服务程序挂接到14号HWI上。
在main函数新一个Task任务和调用Timer_Interrupts_Init()后,通过任务在Task任务中调用generate_clocks_by_timer()。
发现定时器在计数,但是中断服务程序没用被调用过(uiTick不变化)。检查了下定时器的寄存器,感觉是配的是对的,不知道理解的对不对,如下(只进入了64位定时器模式):
emumgt_clkspd 0x00060000 (6分频)
cntlo 0x005e04b4 (计数,程序跑起来就再变)
cnthi 0x00000000 (计数 高位应该没用到)
prdlo 0x007f2814 (定时器周期)
prdhi 0x00000000
tcr 0x00000088 (会在88和89之间变化,好像表示TIMEOUT电平,其他是模式选择和使能)
tgcr 0x00000003wdtcr 0x00000000
PS:查看中断寄存器,IER是将14号HWI打开的,但是IFR的14号标志一直没变化,想手动修改IFR数值(CCS3.3可以)看中断服务函数是否挂上,但是不能修改不知道为什么?
Andy Yin1:
原来的例程能够跑通么,你是将timer移植到bios工程么,关于bios下中断配置有区别,请参考:
http://processors.wiki.ti.com/index.php/Configuring_Interrupts_on_Keystone_Devices
qwer:
回复 Andy Yin1:
谢谢Andy大大的关注,我又试了一下,把“ITSP = 0x800000”注释掉了(原来的程序gel初始化到另一个地址了),又把中断号改为12(14、13被其他占用了,用了有影响),就可以进中断,但是又出现新的问题,就是只能进3次中断,GIE和IER12都被清0了,IFR12还是1,程序还在run,如果停止程序,出现过2种情况(与定时器周期有关),一、程序停在中断服务函数的最后,就是uiTick++下面的反括号处;二,弹出“can't find a source file at "/tmp/TI_MKLIBy3wfGo/SRC/exit.c"”(好像也出现过找不到idel.c);如果在程序还在跑的时候,置GIE为1,IER12为1,会马上再次触发中断,uiTick加了1。 另外,原来的程序在gel初始化时已启动了定时器,而且在bios中开启了clock(10us周期),如果用这个clock直接挂中断(只用Timer_Interrupts_Init()),也是类似的现象。
请Andy大大和其他牛人指点下。
PS: 原来的例程直接跑我没能通,我用的不是标准开发板,不知道是不是有影响。