ARM中断问题请教...

[复制链接]
 楼主| lhy_radio 发表于 2009-3-13 18:37 | 显示全部楼层 |阅读模式
ARM, dc, AD, se, ADC
用ARM驱动触摸屏,中断方式<br />打印到串口终端的信息如下:<br /><br />Test&nbsp;Touch&nbsp;Screen...<br />HandlerIRQ...<br />Select&nbsp;IRQ&nbsp;function...<br />HandlerTC...<br />Auto&nbsp;xy&nbsp;mode...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;鎬<br /><br />显示已经跳转到HandlerTC子函数,也进入了自动xy模式.<br />可是怎么就死了呢?<br /><br />有时候多按几下复位键,又能够读出xy坐标:<br />Test&nbsp;Touch&nbsp;Screen...<br />HandlerIRQ...<br />Select&nbsp;IRQ&nbsp;function...<br />HandlerTC...<br />Auto&nbsp;xy&nbsp;mode...<br />HandlerADC...<br />X=0287&nbsp;Y=0316&nbsp;<br /><br />很奇怪,不知道是哪里出错了<br />贴上自己的程序:<br /><br />#define&nbsp;ISR_ADC_OFT&nbsp;31<br /><br />void&nbsp;HandlerTC(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;//Disable&nbsp;TC&nbsp;intrrupt<br />&nbsp;&nbsp;&nbsp;&nbsp;rSUBSRCPND&nbsp;|=&nbsp;(1&lt&lt9);<br />&nbsp;&nbsp;&nbsp;&nbsp;rSRCPND&nbsp;|=&nbsp;(0x8000);<br />&nbsp;&nbsp;&nbsp;&nbsp;rINTPND&nbsp;|=&nbsp;(0x8000);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;UartSendString(&quot;HandlerTC...&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if(rADCDAT0&nbsp;&&nbsp;0x8000)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rADCTSC&nbsp;=&nbsp;(1&lt&lt7)&nbsp;|&nbsp;(1&lt&lt6)&nbsp;|&nbsp;(1&lt&lt4)&nbsp;|&nbsp;(3);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UartSendString(&quot;wait&nbsp;intrrupt&nbsp;mode...&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//AUTO_PST&nbsp;=&nbsp;1,&nbsp;PULL_UP&nbsp;=&nbsp;1,XY_PST&nbsp;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rADCTSC&nbsp;=&nbsp;(1&lt&lt3)&nbsp;|&nbsp;(1&lt&lt2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UartSendString(&quot;Auto&nbsp;xy&nbsp;mode...&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rADCCON&nbsp;|=&nbsp;1;//ADC&nbsp;start<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />void&nbsp;HandlerADC(void)<br />{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//Disable&nbsp;ADC&nbsp;intrrupt<br />&nbsp;&nbsp;&nbsp;&nbsp;rSUBSRCPND&nbsp;|=&nbsp;(1&lt&lt10);<br />&nbsp;&nbsp;&nbsp;&nbsp;rSRCPND&nbsp;|=&nbsp;(0x8000);<br />&nbsp;&nbsp;&nbsp;&nbsp;rINTPND&nbsp;|=&nbsp;(0x8000);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;UartSendString(&quot;HandlerADC...&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;SEND_XY_VALUE;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;rADCTSC&nbsp;=&nbsp;(1&lt&lt7)&nbsp;|&nbsp;(1&lt&lt6)&nbsp;|&nbsp;(1&lt&lt4)&nbsp;|&nbsp;(3);<br />}<br /><br />void&nbsp;TouchScrIntHandle(void)<br />{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;UartSendString(&quot;Select&nbsp;IRQ&nbsp;function...&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(rSUBSRCPND&nbsp;&&nbsp;(1&lt&lt9))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HandlerTC();<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(rSUBSRCPND&nbsp;&&nbsp;(1&lt&lt10))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HandlerADC();<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UartSendString(&quot;other&nbsp;interrupt&nbsp;occur...&quot;);<br />}<br /><br />void&nbsp;SysClkSet(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;//Fin&nbsp;=&nbsp;12MHz,&nbsp;FCLK&nbsp;=&nbsp;400MHz,&nbsp;FCLK:HCLK:PCLK&nbsp;=&nbsp;1:4:4<br />&nbsp;&nbsp;&nbsp;&nbsp;//FCLK&nbsp;=&nbsp;400MHz,HCLK&nbsp;=&nbsp;100MHz,&nbsp;PCLK&nbsp;=&nbsp;100MHz;<br />&nbsp;&nbsp;&nbsp;&nbsp;rMPLLCON&nbsp;=&nbsp;(42&lt&lt12)&nbsp;|&nbsp;(1&lt&lt4);//FCLK&nbsp;=&nbsp;400MHz<br />&nbsp;&nbsp;&nbsp;&nbsp;rCLKDIVN&nbsp;=&nbsp;(2&lt&lt1);//FCLK:HCLK:PCLK&nbsp;=&nbsp;1:4:4<br />}<br /><br />void&nbsp;ADC_Init(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;isr_handle_array[ISR_ADC_OFT]&nbsp;=&nbsp;TouchScrIntHandle;<br />&nbsp;&nbsp;&nbsp;&nbsp;rINTMSK&nbsp;&=&nbsp;~(1&lt&lt31);//Enable&nbsp;ADC&nbsp;interrupt<br />&nbsp;&nbsp;&nbsp;&nbsp;rINTSUBMSK&nbsp;&=&nbsp;~(1&lt&lt9);//Enable&nbsp;INT_TC&nbsp;interrupt<br />&nbsp;&nbsp;&nbsp;&nbsp;rINTSUBMSK&nbsp;&=&nbsp;~(1&lt&lt10);//Enable&nbsp;INT_ADC_S&nbsp;interrupt<br />&nbsp;&nbsp;&nbsp;&nbsp;//PRSCVL&nbsp;=&nbsp;99,&nbsp;A/D&nbsp;CLK&nbsp;=&nbsp;PCLK&nbsp;/&nbsp;(PRSCVL&nbsp;+&nbsp;1)=&nbsp;1MHz<br />&nbsp;&nbsp;&nbsp;&nbsp;rADCCON&nbsp;=&nbsp;(1&lt&lt14)&nbsp;|&nbsp;(99&lt&lt6);<br />&nbsp;&nbsp;&nbsp;&nbsp;rADCDLY&nbsp;=&nbsp;50000;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//UD_SEN&nbsp;=&nbsp;0,&nbsp;PULL_UP&nbsp;=&nbsp;0,&nbsp;XP_SEN&nbsp;=&nbsp;1,&nbsp;XM_SEN&nbsp;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;//YP_SEN&nbsp;=&nbsp;1,&nbsp;YM_SEN&nbsp;=&nbsp;1,&nbsp;XY_PST&nbsp;=&nbsp;3.<br />&nbsp;&nbsp;&nbsp;&nbsp;rADCTSC&nbsp;=&nbsp;(1&lt&lt7)&nbsp;|&nbsp;(1&lt&lt6)&nbsp;|&nbsp;(1&lt&lt4)&nbsp;|&nbsp;(3);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//AUTO_PST&nbsp;=&nbsp;1,<br />&nbsp;&nbsp;&nbsp;&nbsp;//rADCTSC&nbsp;|=&nbsp;(1&lt&lt2);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//AUTO_PST&nbsp;=&nbsp;1,<br />&nbsp;&nbsp;&nbsp;&nbsp;//rADCDAT0&nbsp;|=&nbsp;(1&lt&lt14);<br />&nbsp;&nbsp;&nbsp;&nbsp;//rADCDAT1&nbsp;|=&nbsp;(1&lt&lt14);<br />}<br /><br /><br />void&nbsp;LCD_Init(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;//I/O&nbsp;port&nbsp;Init,<br />&nbsp;&nbsp;&nbsp;&nbsp;rGPCUP&nbsp;&nbsp;&nbsp;=&nbsp;0xffffffff;//&nbsp;Disable&nbsp;pullup<br />&nbsp;&nbsp;&nbsp;&nbsp;rGPCCON&nbsp;&nbsp;=&nbsp;0xaaaaaaaa;//&nbsp;GPIO管脚用于VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rGPDUP&nbsp;&nbsp;&nbsp;=&nbsp;0xffffffff;//&nbsp;Disable&nbsp;pullup<br />&nbsp;&nbsp;&nbsp;&nbsp;rGPDCON&nbsp;&nbsp;=&nbsp;0xaaaaaaaa;//&nbsp;GPIO管脚用于VD[23:8]<br />&nbsp;&nbsp;&nbsp;&nbsp;rGPGUP&nbsp;=&nbsp;0xffffffff;<br />&nbsp;&nbsp;&nbsp;&nbsp;rGPGCON&nbsp;=&nbsp;(3&lt&lt8);//GPG4:LCD_PWREN<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//CLKVAL&nbsp;=&nbsp;4,&nbsp;VCLK&nbsp;=&nbsp;HCLK&nbsp;/&nbsp;[(CLKVAL&nbsp;+&nbsp;1)&nbsp;*&nbsp;2]&nbsp;=&nbsp;50MHz<br />&nbsp;&nbsp;&nbsp;&nbsp;//PNRMODE&nbsp;=&nbsp;0b11,&nbsp;TFT&nbsp;LCD<br />&nbsp;&nbsp;&nbsp;&nbsp;//BPPMODE&nbsp;=&nbsp;0b1100,&nbsp;16BPP<br />&nbsp;&nbsp;&nbsp;&nbsp;rLCDCON1&nbsp;=&nbsp;(4&lt&lt8)&nbsp;|&nbsp;(3&lt&lt5)&nbsp;|&nbsp;(12&lt&lt1);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//VBPD&nbsp;=&nbsp;1,&nbsp;LINEVAL&nbsp;=&nbsp;320-1,&nbsp;VFPD&nbsp;=&nbsp;5,&nbsp;VSPW&nbsp;=&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;rLCDCON2&nbsp;=&nbsp;(1&lt&lt24)&nbsp;|&nbsp;(319&lt&lt14)&nbsp;|&nbsp;(5&lt&lt6)&nbsp;|&nbsp;(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//HBPD&nbsp;=&nbsp;36,&nbsp;HOZVAL&nbsp;=&nbsp;240-1,&nbsp;HPFD&nbsp;=&nbsp;19,<br />&nbsp;&nbsp;&nbsp;&nbsp;rLCDCON3&nbsp;=&nbsp;(36&lt&lt19)&nbsp;|&nbsp;(239&lt&lt8)&nbsp;|&nbsp;(19);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//HSPW&nbsp;=&nbsp;5,<br />&nbsp;&nbsp;&nbsp;&nbsp;rLCDCON4&nbsp;=&nbsp;5;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//FRM565&nbsp;=&nbsp;1,&nbsp;INVVLINE&nbsp;=&nbsp;1,&nbsp;INVVFRAME&nbsp;=&nbsp;1,&nbsp;BSWP&nbsp;=&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;rLCDCON5&nbsp;=&nbsp;(1&lt&lt11)&nbsp;|&nbsp;(1&lt&lt9)&nbsp;|&nbsp;(1&lt&lt8)&nbsp;|&nbsp;(1&lt&lt1);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;rLCDSADDR1&nbsp;=&nbsp;((LCDBUFFER&gt&gt22)&lt&lt21)&nbsp;|&nbsp;(0x1FFFFF&nbsp;&&nbsp;(LCDBUFFER&gt&gt1));<br />&nbsp;&nbsp;&nbsp;&nbsp;rLCDSADDR2&nbsp;=&nbsp;(0x1FFFFF)&nbsp;&&nbsp;((LCDBUFFER&nbsp;+&nbsp;240*320*2)&gt&gt1);<br />&nbsp;&nbsp;&nbsp;&nbsp;rLCDSADDR3&nbsp;=&nbsp;120;<br />}<br /><br />void&nbsp;HandlerIRQ(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;oft&nbsp;=&nbsp;rINTOFFSET;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;UartSendString(&quot;HandlerIRQ...&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//清中断<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(oft&nbsp;==&nbsp;4)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rEINTPEND&nbsp;=&nbsp;1&lt&lt7;<br />&nbsp;&nbsp;&nbsp;&nbsp;rSRCPND&nbsp;=&nbsp;1&lt&ltoft;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rINTPND&nbsp;=&nbsp;rINTPND;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;isr_handle_array[oft]();<br />}<br /><br />void&nbsp;Isr_Init(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;rINTMOD=0x0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;All=IRQ&nbsp;mode<br />&nbsp;&nbsp;&nbsp;&nbsp;rINTMSK=BIT_ALLMSK;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;All&nbsp;interrupt&nbsp;is&nbsp;masked.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;pISR_IRQ&nbsp;=&nbsp;(int)HandlerIRQ;<br />}<br /><br /><br />int&nbsp;Main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;ADDR;<br />&nbsp;&nbsp;&nbsp;&nbsp;SysClkSet();<br />&nbsp;&nbsp;&nbsp;&nbsp;Isr_Init();<br />&nbsp;&nbsp;&nbsp;&nbsp;UartInit();<br />&nbsp;&nbsp;&nbsp;&nbsp;ADC_Init();<br />&nbsp;&nbsp;&nbsp;&nbsp;LCD_Init();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rTPAL&nbsp;|=&nbsp;(0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;rTPAL&nbsp;|=&nbsp;(1&lt&lt24);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;UartSendString(&quot;Test&nbsp;Touch&nbsp;Screen...&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;for(;;)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />
 楼主| lhy_radio 发表于 2009-3-13 19:39 | 显示全部楼层

没人理我,自己顶起....

  
 楼主| lhy_radio 发表于 2009-3-13 20:48 | 显示全部楼层

为什么会产生未定义指令中断?

仔细看了下启动代码和C程序,做了一些改动,<br />算是可以读出xy坐标的值,但是每次都会产生未定义指令中断?<br />就不知道怎么回事了...<br />哪位给我指点一下吧...<br /><br />Test&nbsp;Touch&nbsp;Screen...<br />Select&nbsp;IRQ&nbsp;function...<br />HandlerTC...<br />Auto&nbsp;xy&nbsp;mode...<br />HandlerTC&nbsp;Finish...<br />HandlerADC...<br />X=0436&nbsp;Y=0314<br />Undefined&nbsp;instruction&nbsp;exception!!!
阿南 发表于 2009-3-13 21:27 | 显示全部楼层

产生未定义指令中断,有时更多的是硬件上的不稳定

比如SDRAM读写出错等产生
 楼主| lhy_radio 发表于 2009-3-13 21:29 | 显示全部楼层

谢谢阿南了.....

这程序烦了我一天了...<br />还是有问题<br />我再仔细看看...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

162

帖子

1

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

27

主题

162

帖子

1

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