[ZLG-ARM] 请教LPC2214有关外部中断的BUG问题!

[复制链接]
 楼主| zhixiang75 发表于 2007-5-22 14:27 | 显示全部楼层 |阅读模式
<br />我最近正在调试一个LCP2214的应用,调试外部中断时,总无法触发,电路设计是用P0.09和P0.20内部或门高电平触发INT3,lpc2214_err.pdf中提出了一些芯片BUG,我照着修改程序,还是无法触发中断,郁闷!请用过的朋友指点一下,无胜感激!<br /><br />初始化代码如下:<br /><br />uint32&nbsp;VPBDIV_BAK;<br />//lpc2214_err.pdf要求在修改EXTMODE和EXTPOLAR时候保护VPBDIV值<br /><br />//IO配置<br />static&nbsp;&nbsp;void&nbsp;&nbsp;BSP_IO_Init&nbsp;(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//用P0.09和P0.20内部或门高电平触发INT3,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;=&nbsp;0xA00C1555;&nbsp;//1010&nbsp;0000&nbsp;0000&nbsp;1100&nbsp;0001&nbsp;0101&nbsp;0101&nbsp;0101<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PINSEL0的19:18(P0.09)&nbsp;为11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL1&nbsp;=&nbsp;0x00000301;&nbsp;//0000&nbsp;0000&nbsp;0000&nbsp;0000&nbsp;0000&nbsp;0011&nbsp;0000&nbsp;0001<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PINSEL1的9:8(P0.20)&nbsp;为11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;^^<br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL2&nbsp;=&nbsp;0x0D800914;&nbsp;//0000&nbsp;1101&nbsp;1000&nbsp;0000&nbsp;0000&nbsp;1001&nbsp;0001&nbsp;0100<br />}<br /><br />//外中断3初始化,这个初始化我保证在其他初始化之后,也就是说不会再对VPBDIV,EXTMODE,EXTPOLAR&nbsp;等寄存器做任何操作<br /><br />static&nbsp;void&nbsp;ExInt_Init(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntSelect&nbsp;&=&nbsp;(~(1&nbsp;&lt&lt&nbsp;VIC_EINT3));&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;VICSoftIntClr&nbsp;=&nbsp;0xFFFFFFFF;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;EXTINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0x0F;&nbsp;&nbsp;&nbsp;&nbsp;//清除中断标志<br />&nbsp;&nbsp;&nbsp;&nbsp;EXTWAKE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;//不使用中断唤醒功能<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;VPBDIV_BAK&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;VPBDIV&nbsp;;//备份VPBDIV<br />&nbsp;&nbsp;&nbsp;&nbsp;VPBDIV_BAK&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;VPBDIV&nbsp;;//连续两个读指令保证获取正确的VPBDIV<br /><br />/*Philips&nbsp;Semiconductors&nbsp;LPC2214&nbsp;Erratasheet&nbsp;&nbsp;page6<br /><br />VPBDIV.1&nbsp;Incorrect&nbsp;read&nbsp;of&nbsp;VPBDIV<br />Introduction:&nbsp;The&nbsp;Peripheral&nbsp;Bus&nbsp;Divider&nbsp;(VPBDIV)&nbsp;divides&nbsp;the&nbsp;processor&nbsp;clock&nbsp;(CCLK)&nbsp;by&nbsp;one,&nbsp;two,&nbsp;or&nbsp;four.&nbsp;This<br />is&nbsp;the&nbsp;clock&nbsp;that&nbsp;is&nbsp;provided&nbsp;to&nbsp;the&nbsp;peripheral&nbsp;bus.<br />Problem:&nbsp;Reading&nbsp;the&nbsp;VPBDIV&nbsp;register&nbsp;may&nbsp;return&nbsp;an&nbsp;incorrect&nbsp;value.<br />Work-around:&nbsp;Performing&nbsp;two&nbsp;consecutive&nbsp;reads&nbsp;of&nbsp;the&nbsp;VPBDIV&nbsp;assures&nbsp;that&nbsp;the&nbsp;correct&nbsp;value&nbsp;is&nbsp;returned.<br />*/<br />&nbsp;&nbsp;&nbsp;&nbsp;VPBDIV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0&nbsp;;//<br />&nbsp;&nbsp;&nbsp;&nbsp;EXTMODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0x07;//外中断3电平触发<br />&nbsp;&nbsp;&nbsp;&nbsp;VPBDIV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0x07&nbsp;;//lpc2214_err.pdf要求<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;VPBDIV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0&nbsp;;//<br />&nbsp;&nbsp;&nbsp;&nbsp;EXTPOLAR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0x08&nbsp;;//外中断3高电平触发&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;VPBDIV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0x08&nbsp;;&nbsp;//lpc2214_err.pdf要求<br />&nbsp;&nbsp;&nbsp;&nbsp;VPBDIV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;VPBDIV_BAK&nbsp;;//恢复VPBDIV值<br />/*这个操作按照PDF要求,详见后面说明*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr4&nbsp;&nbsp;=&nbsp;(CPU_INT32U)EXINT3_ISR_Handler;&nbsp;&nbsp;&nbsp;&nbsp;//设置中断服务程序地址<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl4&nbsp;&nbsp;=&nbsp;0x20&nbsp;|&nbsp;VIC_EINT3;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;&nbsp;=&nbsp;(1&nbsp;&lt&lt&nbsp;VIC_EINT3);//使能中断触发&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXTINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0x0F;<br />}<br /><br />中断程序如下:从来没进过,所以先可以不看。<br />void&nbsp;&nbsp;&nbsp;__irq&nbsp;EXINT3_ISR_Handler(void)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;&nbsp;i;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;IO0SET;&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;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;(i&BEEPCON)==0&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0SET&nbsp;=&nbsp;BEEPCON;<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR&nbsp;=&nbsp;BEEPCON;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;(EXTINT&1&lt&lt3)!=0&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXTINT&nbsp;=&nbsp;1&lt&lt3;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />/*Philips&nbsp;Semiconductors&nbsp;LPC2214&nbsp;Erratasheet&nbsp;&nbsp;page5-6<br /><br />EXTINT.1&nbsp;Corruption&nbsp;of&nbsp;VPBDIV&nbsp;via&nbsp;EXTPOLAR&nbsp;or&nbsp;EXTMODE<br /><br />Introduction:&nbsp;The&nbsp;VPBDIV&nbsp;register&nbsp;controls&nbsp;the&nbsp;rate&nbsp;of&nbsp;the&nbsp;VPB&nbsp;clock&nbsp;in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;relation&nbsp;to&nbsp;the&nbsp;processor&nbsp;clock.EXTPOLAR&nbsp;and&nbsp;EXTMODE&nbsp;determine&nbsp;the&nbsp;operating&nbsp;parameters&nbsp;of&nbsp;the&nbsp;external&nbsp;interrupts.<br /><br />Problem:&nbsp;A&nbsp;write&nbsp;to&nbsp;either&nbsp;the&nbsp;external&nbsp;interrupt&nbsp;polarity&nbsp;register&nbsp;(EXTPOLAR)&nbsp;or&nbsp;the&nbsp;external&nbsp;interrupt&nbsp;mode&nbsp;register&nbsp;(EXTMODE)&nbsp;will&nbsp;corrupt&nbsp;the&nbsp;VPBDIV&nbsp;register.&nbsp;A&nbsp;read&nbsp;of&nbsp;either&nbsp;EXTPOLAR&nbsp;or&nbsp;EXTMODE&nbsp;will&nbsp;be&nbsp;corrupted&nbsp;BY&nbsp;the&nbsp;VPBDIV&nbsp;register.&nbsp;If&nbsp;VPBDIV&nbsp;is&nbsp;“1”&nbsp;or&nbsp;“2”&nbsp;prior&nbsp;to&nbsp;any&nbsp;write&nbsp;to&nbsp;EXTPOLAR&nbsp;or&nbsp;EXTMODE,&nbsp;the&nbsp;CPU&nbsp;will&nbsp;hang&nbsp;up&nbsp;on&nbsp;the&nbsp;write&nbsp;to&nbsp;EXTPOLAR&nbsp;or&nbsp;EXTMODE.<br /><br />Work-around:&nbsp;If&nbsp;VPBDIV&nbsp;is&nbsp;non-zero,&nbsp;write&nbsp;all&nbsp;zeroes&nbsp;to&nbsp;VPBDIV&nbsp;before&nbsp;reading&nbsp;or&nbsp;writing&nbsp;EXTMODE&nbsp;or&nbsp;EXTPOLAR,&nbsp;then&nbsp;write&nbsp;the&nbsp;proper&nbsp;value&nbsp;back&nbsp;to&nbsp;VPBDIV.&nbsp;In&nbsp;most&nbsp;applications&nbsp;this&nbsp;is&nbsp;a&nbsp;known&nbsp;and&nbsp;fixed&nbsp;value,&nbsp;but&nbsp;if&nbsp;there&nbsp;is&nbsp;a&nbsp;possibility&nbsp;of&nbsp;dynamic&nbsp;changes&nbsp;in&nbsp;VPBDIV,&nbsp;software&nbsp;will&nbsp;need&nbsp;to&nbsp;read&nbsp;VPBDIV,&nbsp;write&nbsp;zero&nbsp;to&nbsp;VPBDIV,&nbsp;read&nbsp;or&nbsp;write&nbsp;EXTMODE&nbsp;and/or&nbsp;EXTPOLAR,&nbsp;and&nbsp;then&nbsp;rewrite&nbsp;the&nbsp;value&nbsp;previously&nbsp;read&nbsp;from&nbsp;VPBDIV.<br /><br />EXTINT.2&nbsp;Incorrect&nbsp;setting&nbsp;of&nbsp;EXTMODE&nbsp;and/or&nbsp;EXTPOLAR&nbsp;register&nbsp;while&nbsp;trying&nbsp;to&nbsp;set&nbsp;them&nbsp;to&nbsp;desired&nbsp;value<br /><br />Introduction:&nbsp;EXTPOLAR&nbsp;and&nbsp;EXTMODE&nbsp;determine&nbsp;the&nbsp;operating&nbsp;parameters&nbsp;of&nbsp;the&nbsp;external&nbsp;interrupts.<br /><br />Problem:&nbsp;As&nbsp;an&nbsp;illustration,&nbsp;trying&nbsp;to&nbsp;set&nbsp;EXTMODE&nbsp;to&nbsp;0x1&nbsp;or&nbsp;0xd&nbsp;would&nbsp;result&nbsp;in&nbsp;EXTMODE&nbsp;to&nbsp;be&nbsp;set&nbsp;to&nbsp;0x0&nbsp;instead.<br /><br />Work-around:&nbsp;This&nbsp;problem&nbsp;is&nbsp;related&nbsp;to&nbsp;EXTINT.1&nbsp;and&nbsp;hence&nbsp;the&nbsp;same&nbsp;workaround&nbsp;applies&nbsp;with&nbsp;an&nbsp;additional&nbsp;step.<br /><br />The&nbsp;steps&nbsp;involved&nbsp;in&nbsp;the&nbsp;configuration&nbsp;of&nbsp;the&nbsp;EXTMODE&nbsp;and/or&nbsp;EXTPOLAR&nbsp;would&nbsp;be&nbsp;as&nbsp;follow:-<br />1.&nbsp;Write&nbsp;0x0&nbsp;to&nbsp;VPBDIV<br />2.&nbsp;Write&nbsp;the&nbsp;desired&nbsp;value&nbsp;to&nbsp;EXTMODE&nbsp;or&nbsp;EXTPOLAR&nbsp;register<br />3.&nbsp;Write&nbsp;the&nbsp;same&nbsp;value&nbsp;to&nbsp;VPBDIV&nbsp;(additional&nbsp;step)<br />4.&nbsp;Restore&nbsp;the&nbsp;VPBDIV&nbsp;to&nbsp;the&nbsp;previously&nbsp;saved&nbsp;value&nbsp;or&nbsp;simply&nbsp;write&nbsp;to&nbsp;<br /><br />the&nbsp;register&nbsp;again&nbsp;with&nbsp;the&nbsp;desired&nbsp;value.<br />Code&nbsp;sample&nbsp;for&nbsp;setting&nbsp;EXTMODE&nbsp;and&nbsp;EXTPOLAR&nbsp;to&nbsp;0x1:<br />VPBDIV&nbsp;=&nbsp;0x0;&nbsp;/*&nbsp;EXTMODE&nbsp;*/<br />EXTMODE&nbsp;=&nbsp;0x1;<br />VPBDIV&nbsp;=&nbsp;0x1;<br />VPBDIV&nbsp;=&nbsp;0x0;&nbsp;/*&nbsp;EXTPOLAR&nbsp;*/<br />EXTPOLAR&nbsp;=&nbsp;0x1;<br />VPBDIV&nbsp;=&nbsp;0x1;<br />VPBDIV&nbsp;=&nbsp;0x0;&nbsp;/*&nbsp;Setting&nbsp;VPBDIV&nbsp;*/<br />Note:&nbsp;While&nbsp;testing&nbsp;this&nbsp;in&nbsp;a&nbsp;debugger&nbsp;environment,&nbsp;please&nbsp;don’t&nbsp;single-step&nbsp;through&nbsp;these&nbsp;steps.&nbsp;A&nbsp;breakpoint&nbsp;could&nbsp;be&nbsp;placed&nbsp;after&nbsp;Step&nbsp;4&nbsp;andyou&nbsp;would&nbsp;see&nbsp;the&nbsp;EXTMODE&nbsp;and&nbsp;EXTPOLAR&nbsp;registers&nbsp;reflecting&nbsp;the&nbsp;correct&nbsp;values.<br />*/<br /><br />真不知道我哪里搞错了?谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

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