[ZLG-ARM] 2214的,CAP1.0捕获中断,中断不了啊,哪儿出错啦,帮偶瞧瞧

[复制链接]
2947|12
 楼主| jstu023123 发表于 2007-12-3 23:26 | 显示全部楼层 |阅读模式
ic, ni, TI, se, Order
&nbsp;&nbsp;&nbsp;&nbsp;使用CAP1.0测频,上升沿捕获并产生中断,现在程序不能采集到数据,郁闷。main中测试是否采集BORDER_NUM&nbsp;个数据,蜂鸣器未响,后将if(&nbsp;num==BORDER_NUM&nbsp;)一句注释掉,仍未响,说明没有跳出中断或者就没有进入中断,查了好久还没发现问题所在,还望高手提点一下!!!<br /><br />程序如下:<br />#define&nbsp;BORDER_NUM&nbsp;&nbsp;&nbsp;17<br />static&nbsp;UINT16&nbsp;num=0;<br />static&nbsp;BOOL&nbsp;sgCapFinished&nbsp;=&nbsp;FALSE;<br />static&nbsp;UINT32&nbsp;counter[BORDER_NUM];<br /><br />void&nbsp;__irq&nbsp;IRQ_Time1(void)&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;中断程序<br />{&nbsp;&nbsp;T1IR&nbsp;=&nbsp;0x10;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(sgCapFinished&nbsp;==&nbsp;FALSE&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;counter[num++]&nbsp;=&nbsp;T1CR0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;num&gtBORDER_NUM-1)&nbsp;&nbsp;&nbsp;//&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;sgCapFinished&nbsp;=&nbsp;TRUE;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T1CCR&nbsp;=&nbsp;0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0x00;<br />}<br /><br />void&nbsp;Timer1_Init(&nbsp;void&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnClr&nbsp;|=&nbsp;0x20;<br />&nbsp;&nbsp;&nbsp;&nbsp;num=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;sgCapFinished&nbsp;=&nbsp;FALSE;<br />&nbsp;&nbsp;&nbsp;&nbsp;T1PR&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;预分频为0<br />&nbsp;&nbsp;&nbsp;&nbsp;T1CCR&nbsp;=&nbsp;0x05;&nbsp;&nbsp;//&nbsp;&nbsp;上升沿捕获,产生中断<br />&nbsp;&nbsp;&nbsp;&nbsp;T1IR&nbsp;=&nbsp;0x10;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntSelect&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl0&nbsp;=&nbsp;0x25;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr0&nbsp;=&nbsp;(UINT32)IRQ_Time1;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;T1TCR&nbsp;=&nbsp;0x03;<br />&nbsp;&nbsp;&nbsp;&nbsp;T1TCR&nbsp;=&nbsp;0x01;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;|=&nbsp;0x20;<br />}<br /><br />int&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT32&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Timer1_Init(&nbsp;);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;sgCapFinished&nbsp;==&nbsp;FALSE&nbsp;);&nbsp;//&nbsp;&nbsp;等待<br />&nbsp;&nbsp;&nbsp;&nbsp;sgCapFinished&nbsp;==&nbsp;FALSE;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;num&nbsp;=&nbsp;0;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;num==BORDER_NUM&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;测试是否取到17个数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PWM2_EnbleSound(2600);&nbsp;&nbsp;&nbsp;//&nbsp;蜂鸣器响<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Data_Process(&nbsp;counter&nbsp;);&nbsp;&nbsp;&nbsp;//&nbsp;数据处理<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;}<br />
 楼主| jstu023123 发表于 2007-12-4 08:34 | 显示全部楼层

少写了一行

main()中加一行&nbsp;&nbsp;&nbsp;&nbsp;<br />PINSEL0&nbsp;=&nbsp;(PINSEL0&0xFF0FFFFF)|0x02&lt&lt20;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;CAP1.0
kernel99 发表于 2007-12-4 08:54 | 显示全部楼层

还少了点东西

main()中加一行&nbsp;&nbsp;&nbsp;&nbsp;<br />PINSEL0&nbsp;=&nbsp;(PINSEL0&0xFF0FFFFF)|0x02&lt&lt20;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;CAP1.0&nbsp;<br />以及在void&nbsp;Timer1_Init(&nbsp;void&nbsp;){}<br />中<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntSelect&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl0&nbsp;=&nbsp;0x25;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr0&nbsp;=&nbsp;(UINT32)IRQ_Time1;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;T1TCR&nbsp;=&nbsp;0x03;<br />&nbsp;&nbsp;&nbsp;&nbsp;T1TCR&nbsp;=&nbsp;0x01;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;|=&nbsp;0x20;<br /><br />语句前面加上一条IRQEnable();语句<br />
 楼主| jstu023123 发表于 2007-12-4 09:10 | 显示全部楼层

回kernel99

VICIntSelect&nbsp;=&nbsp;0x00;&nbsp;这条就是分配为IRQ啊。。。&nbsp;
kernel99 发表于 2007-12-4 09:31 | 显示全部楼层

回jstu023123

VICIntSelect&nbsp;=&nbsp;0x00;只是选择中断为向量中断(IRQ);<br />还得用IRQEnable();语句使能它中断啊!<br /><br />
 楼主| jstu023123 发表于 2007-12-4 11:45 | 显示全部楼层

还是不行嘛!

编译是通过的,但还是没有反应<br />void&nbsp;Timer1_Init(&nbsp;void&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnClr&nbsp;|=&nbsp;0x20;<br />&nbsp;&nbsp;&nbsp;&nbsp;num=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;sgCapFinished&nbsp;=&nbsp;FALSE;<br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;=&nbsp;(PINSEL0&0xFF0FFFFF)|0x02&lt&lt20;<br />&nbsp;&nbsp;&nbsp;&nbsp;T1PR&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;预分频为0<br />&nbsp;&nbsp;&nbsp;&nbsp;T1CCR&nbsp;=&nbsp;0x05;&nbsp;&nbsp;//&nbsp;&nbsp;上升沿捕获,产生中断<br />&nbsp;&nbsp;&nbsp;&nbsp;T1IR&nbsp;=&nbsp;0x10;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQEnable(&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntSelect&nbsp;=&nbsp;0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl0&nbsp;=&nbsp;0x25;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr0&nbsp;=&nbsp;(UINT32)IRQ_Time1;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;T1TCR&nbsp;=&nbsp;0x03;<br />&nbsp;&nbsp;&nbsp;&nbsp;T1TCR&nbsp;=&nbsp;0x01;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;|=&nbsp;0x20;<br />}<br /><br />IRQEnable&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;调用这个<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;开IRQ中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MRS&nbsp;&nbsp;&nbsp;R0,&nbsp;SPSR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BIC&nbsp;&nbsp;&nbsp;R0,&nbsp;R0,&nbsp;#NoInt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;SPSR_c,&nbsp;R0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVS&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;LR<br />
kernel99 发表于 2007-12-4 12:17 | 显示全部楼层

再分析

  
kernel99 发表于 2007-12-4 12:29 | 显示全部楼层

分析

看了下LPC2214资料,觉得<br />&nbsp;PINSEL0&nbsp;=&nbsp;(PINSEL0&0xFF0FFFFF)|0x02&lt&lt20;<br />改为<br />&nbsp;PINSEL0&nbsp;=&nbsp;(PINSEL0&0xFF0FFFFF)|0x01&lt&lt20;先试下<br />
 楼主| jstu023123 发表于 2007-12-4 14:32 | 显示全部楼层

现在好中断了。。。

&nbsp;&nbsp;&nbsp;刚才换板子试了,可以中断的,但就是跳不出来,一直在&nbsp;&nbsp;while(&nbsp;sgCapFinished&nbsp;==&nbsp;FALSE&nbsp;);&nbsp;&nbsp;等待,跑不下去,一直在中断着啊!在中断采集完数据后T1CCR就清掉了啊,且sgCapFinished为TRUE了。帮我想想哪儿错了,谢谢咯。。。
kernel99 发表于 2007-12-4 15:47 | 显示全部楼层

变量num

static&nbsp;UINT16&nbsp;num=0;<br />能这么定义吗?改成&nbsp;volatile&nbsp;UINT16&nbsp;num=0;试试<br />觉得中断那段程序,<br />if(&nbsp;num&gtBORDER_NUM-1)&nbsp;&nbsp;&nbsp;//&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;sgCapFinished&nbsp;=&nbsp;TRUE;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T1CCR&nbsp;=&nbsp;0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br /><br />可能因为num一直没变化就没进去,所以sgCapFinished&nbsp;=&nbsp;TRUE;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T1CCR&nbsp;=&nbsp;0x00;两句就没起作用<br /><br />
 楼主| jstu023123 发表于 2007-12-4 16:22 | 显示全部楼层

很奇怪哦

&nbsp;&nbsp;&nbsp;&nbsp;我原来在main函数中测试,和采集中断等被调用函数不在同一个.C文件中。现去static,改用volatile还是一样的,测试过了,当采集完毕后是sgCapFinished&nbsp;=&nbsp;TRUE,num=BORDER_NUM,T1CCR&nbsp;=&nbsp;0x00的,还是在那儿等待,跑不下去,也没再进中断,太奇怪咯。。。去哪儿玩儿了呢
kernel99 发表于 2007-12-4 16:45 | 显示全部楼层

调试的乐趣就在于测试,修改代码中!

volatile&nbsp;UINT16&nbsp;num=0;不是在main()函数所在的.C文件中的话,就在<br />main()函数所在的.C文件中&nbsp;写上:&nbsp;extern&nbsp;volatile&nbsp;UINT16&nbsp;num;<br />然后改:while(&nbsp;sgCapFinished&nbsp;==&nbsp;FALSE&nbsp;);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;为如下形式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;sgCapFinished&nbsp;==&nbsp;FALSE&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{}&nbsp;;<br />&nbsp;
 楼主| jstu023123 发表于 2007-12-4 17:40 | 显示全部楼层

哇,帅哥太有才了。。。

&nbsp;&nbsp;&nbsp;是的啊,调试花的时间比较长!<br />&nbsp;&nbsp;&nbsp;根据测试所观察的现象,我感觉好像中断中少了某一操作,采集完数据置位、清T1CCR后不能跳出中断,使程序不能往下跑,猜测的。。。但我该关的都关了啊,再找找。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

93

帖子

0

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