之前写的code发现有Bug存在,于是去调试这个定时器,悲剧的是当时自己使用的最简单的定时模式,竟然出现一些难以理解的现象。
DM6437的Time有64bit ,32 bit等最简单的定时模式,对应的工作末模式包括once stop 和continuous 模;
以配置64bit模式如下:
/*set 1us unit times*/
void timer0_init(Uint32 times)
{
TIMER0_TGCR = 0;
TIMER0_EMUMGT = 0x0003;
TIMER0_TIM12 = 0;
TIMER0_TIM34 = 0;
TIMER0_PRD12 = times * 27; // 1us
TIMER0_PRD34 = 0;
TIMER0_TGCR = (0 << 2) |//TIMMODE 64bit GP Timer
(1 << 1) | //TIMER0 3:4 no reset
(1 << 0); // TIMER0 1:2 no reset
TIMER0_TRC = (0 << 22) |
(0 << 8) | //internal clock
(0 << 6) ; //one-time mode disable
}
void start_timer0()
{
TIMER0_TRC |= (1 << 6);
}
void stop_timer0()
{
TIMER0_TRC ^= (1 << 6); //disable the timer0.
TIMER0_TIM12 = 0;
TIMER0_TIM34 = 0;// clear count value
}
是的,配置代码就是这么简单,但是虽然我设置了once stop启动,但是JTAG拉着仿真器进入中断后,你会发现其实TIM12和TIM34的数值为0,这按datasheet说的是保持当前的count value,(Whenthe timer is enabledfor onetime operation(ENAMODE12=1),it counts up until the counter value equals the period value and then stops.)。故一直以为是配置有误了。占时还不知道这里面的原因,不过可以肯定的是,定时器是按着正常的配置来工作了的。只是进入中断后才出现的清空。
好吧,就这样的留点东西,分享给大家。
原因:目测可能是as hadow register当ccs5读取的时候?不过实测貌似的确自动回归0