求救!中断、定时器问题,请各位高手给指点一下!

[复制链接]
 楼主| ccjchen 发表于 2009-7-13 13:33 | 显示全部楼层 |阅读模式
外部两个中断不同时发生,用定时器1来对这两个中断发生的时间进行计时,不知为什么每次计时两个中断发生的时间竟然是一样的,请各位前辈给指点一下!<br />下面是我的程序:<br />#include&nbsp;&ltcsl.h&gt<br />#include&nbsp;&ltcsl_emifa.h&gt<br />#include&nbsp;&ltcsl_irq.h&gt<br />#include&nbsp;&ltcsl_chip.h&gt<br />#include&nbsp;&ltcsl_timer.h&gt<br />#include&nbsp;&ltcsl_gpio.h&gt<br />#include&nbsp;&ltstdio.h&gt<br />#include&nbsp;&quot;seeddm642.h&quot;<br />#include&nbsp;&quot;seeddm642_uart.h&quot;<br /><br /><br />static&nbsp;TIMER_Handle&nbsp;hTimer1;<br /><br />static&nbsp;Uint32&nbsp;TimerEventId;<br /><br />static&nbsp;unsigned&nbsp;int&nbsp;cnt&nbsp;=&nbsp;0;<br />static&nbsp;unsigned&nbsp;int&nbsp;t1&nbsp;=&nbsp;0;<br />static&nbsp;unsigned&nbsp;int&nbsp;t2&nbsp;=&nbsp;0;<br />static&nbsp;unsigned&nbsp;int&nbsp;v&nbsp;=&nbsp;0;<br />static&nbsp;Uint32&nbsp;TimerControl&nbsp;=&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;TIMER_CTL_RMK<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;(<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIMER_CTL_SPND_EMUSTOP,<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIMER_CTL_INVINP_NO,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TINP&nbsp;inverter&nbsp;control(INVINP)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIMER_CTL_CLKSRC_CPUOVR8,&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Timer&nbsp;input&nbsp;clock&nbsp;source&nbsp;(CLKSRC)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIMER_CTL_CP_PULSE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Clock/pulse&nbsp;mode(CP)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIMER_CTL_HLD_YES,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Hold(HLD)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIMER_CTL_GO_NO,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Go&nbsp;bit(GO)-<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;resets&nbsp;&&nbsp;starts&nbsp;timer&nbsp;counter<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIMER_CTL_PWID_ONE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Pulse&nbsp;width(PWID)-<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;used&nbsp;only&nbsp;in&nbsp;pulse&nbsp;mode<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIMER_CTL_DATOUT_0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Data&nbsp;output&nbsp;(DATOUT)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIMER_CTL_INVOUT_NO,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TOUT&nbsp;inverter&nbsp;control&nbsp;(INVOUT)&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIMER_CTL_FUNC_GPIO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Function&nbsp;of&nbsp;TOUT&nbsp;pin(FUNC)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br />extern&nbsp;far&nbsp;void&nbsp;vectors();<br />static&nbsp;unsigned&nbsp;char&nbsp;flag&nbsp;;<br />/*此程序可将四个采集口的数据经过Video&nbsp;Port0送出*/<br />void&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;TIMER_Config&nbsp;myTimConfig;<br />&nbsp;&nbsp;&nbsp;&nbsp;CSL_init();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQ_setVecs(vectors);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;hTimer1&nbsp;=&nbsp;TIMER_open(TIMER_DEV1,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;TimerEventId&nbsp;=&nbsp;TIMER_getEventId(hTimer1);<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIO_RSET(GPEN,0x1E0);//<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIO_RSET(GPDIR,0x100);/*将GPIO做为输出*/<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIO_RSET(GPVAL,0x000);<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQ_globalDisable();<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQ_nmiDisable();<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQ_nmiEnable();<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQ_globalEnable();<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQ_map(TimerEventId,&nbsp;15);<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQ_map(IRQ_EVT_EXTINT6,6);<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQ_map(IRQ_EVT_EXTINT7,7);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQ_reset(TimerEventId);<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQ_reset(IRQ_EVT_EXTINT6);<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQ_reset(IRQ_EVT_EXTINT7);<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQ_RSET(EXTPOL,0x0E);//下降沿中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myTimConfig.cnt&nbsp;=&nbsp;0x0;<br />&nbsp;&nbsp;&nbsp;&nbsp;myTimConfig.ctl&nbsp;=&nbsp;TimerControl;<br />&nbsp;&nbsp;&nbsp;&nbsp;myTimConfig.prd&nbsp;=&nbsp;0x00124f8;&nbsp;//定时1ms<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQ_enable(TimerEventId);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQ_enable(IRQ_EVT_EXTINT6);<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQ_enable(IRQ_EVT_EXTINT7);<br />&nbsp;&nbsp;&nbsp;&nbsp;TIMER_config(hTimer1,&nbsp;&myTimConfig);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIMER_start(hTimer1);&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br />interrupt&nbsp;void&nbsp;ext_isr6()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;t1&nbsp;=&nbsp;0.5+cnt*75000*8/600000;//75000对应myTimConfig.prd&nbsp;=&nbsp;0x00124f8<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;t1&nbsp;:&nbsp;%d
&quot;,t1);&nbsp;<br />}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />interrupt&nbsp;void&nbsp;ext_isr7()<br />{<br />&nbsp;&nbsp;&nbsp;t2&nbsp;=0.5+&nbsp;cnt*75000*8/600000;<br />&nbsp;&nbsp;&nbsp;printf(&quot;t2&nbsp;:&nbsp;%d
&quot;,t2);<br />}<br /><br />interrupt&nbsp;void&nbsp;CLK_cnt()<br />{<br />&nbsp;&nbsp;&nbsp;cnt++;<br />}<br /><br />以下是仿真结果:<br />t1&nbsp;:&nbsp;68//中断不同时发生t1,t2应该是不一样的啊,<br />t2&nbsp;:&nbsp;68//不知仿真结果为什么是一样的?<br />t1&nbsp;:&nbsp;165<br />t2&nbsp;:&nbsp;165<br />t1&nbsp;:&nbsp;348<br />t2&nbsp;:&nbsp;348<br />t1&nbsp;:&nbsp;531<br />t2&nbsp;:&nbsp;531<br />t1&nbsp;:&nbsp;713<br />t2&nbsp;:&nbsp;713<br />t1&nbsp;:&nbsp;893<br />t2&nbsp;:&nbsp;893<br />t1&nbsp;:&nbsp;1076<br />t2&nbsp;:&nbsp;1076<br />t1&nbsp;:&nbsp;1219<br />t2&nbsp;:&nbsp;1219
 楼主| ccjchen 发表于 2009-7-14 09:53 | 显示全部楼层

不知是我的定时算法有问题,还是中断有问题

恳请各位前辈给指点一下!
 楼主| ccjchen 发表于 2009-7-15 10:55 | 显示全部楼层

我 设置的外部中断6和7时间间隔至少为十几ms

而定时器时间间隔为1ms,为什么测试的数据t1和t2却是一样的呢?
 楼主| ccjchen 发表于 2009-7-15 15:19 | 显示全部楼层

又反复进行了实验,发现好像是printf函数的问题

printf运行所需时间比较长,不过如果我在DSP/bios中用LOG_printf的话应该怎么将t1、t2显示出来呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

175

主题

446

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

175

主题

446

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部