需求:<br />因为需要用到低功耗方式,把4*4键盘的列线分别接入到P0.7 , P0.14 , P0.20 , P0.30上,正常工作时初始化GPIO,若系统没有任务时初始化为对应的外部中断EINT1 , EINT2 , EINT3,同时进入空闲状态,以降低系统功耗。<br /><br />问题:<br />系统还没有进入到空闲状态时(已注释),仅仅执行了GPIO2EInt函数后,可以唤醒2148且键盘初始化为GPIO能正常工作,但此时U0串口发送不出数据,接受有时也不正常。<br /><br />关键函数:<br /><br />main()<br />{ <br /> do<br /> { <br /> Msg = GetMessage(EventPool);<br /> if(Msg.hProc > (CALLBACK)0x000001EC)<br /> {<br /> SysParam.Status &= (~SYS_STATUS_WAKE_UP) ;<br /> Msg.hProc(Msg.Data); <br /> SysParam.TimeOut = 0 ;<br /> }<br /> else<br /> {<br /> if(SysParam.TimeOut++ >= SYSTEM_IDLE_TIME / 40)<br /> {<br /> SysParam.Status |= SYS_STATUS_WAKE_UP ; <br /> Sleep();<br /> }<br /> }<br /> }while(1); <br />}<br /><br />=====================================================================<br /><br />void Sleep()<br />{<br /> GPIO2EInt();<br /> while(1) <br /> { <br /> if((SysParam.Status & SYS_STATUS_WAKE_UP) == SYS_STATUS_WAKE_UP)<br /> {<br /> KeyLightOff() ;<br /> LCDLightOff() ; <br /> // POWER->P_CON = 0x01 ; //idle status <br /> }<br /> else<br /> {<br /> SysParam.TimeOut = 0 ;<br /> KeyLightOn() ;<br /> LCDLightOn() ;<br /> //Menu.Status = MENU_STATUS_STAND_BY ;<br /> //ShowRdyStatu(NULL);<br /> break ;<br /> }<br /> } <br />}<br /><br />==================================================================<br /><br />void WakeUp() <br />{<br />// POWER->P_CON = 0x00 ;<br /> PINSEL->PIN_SEL0 |= (P0_0_TXD0 << P0_0_PINSEL) | (P0_1_RXD0 << P0_1_PINSEL); //设置I/O连接到UART0<br /> SYSCON->EXT_INT = 0x08 ;<br /> SYSCON->EXT_INT = 0x04 ;<br /> SYSCON->EXT_INT = 0x02 ;<br /><br /> PINSEL->PIN_SEL1 &= (P0_30_GPIO << P0_30_PINSEL);<br /> PINSEL->PIN_SEL1 &= (P0_20_GPIO << P0_20_PINSEL);<br /> PINSEL->PIN_SEL0 &= (P0_7_GPIO << P0_7_PINSEL) ;<br /> PINSEL->PIN_SEL0 &= (P0_14_GPIO << P0_14_PINSEL);<br /><br /> VIC->IntEnClr |= ( 1 << VICIntSel_EINT1 ) ;<br /> VIC->IntEnClr |= ( 1 << VICIntSel_EINT2 ) ; <br /> VIC->IntEnClr |= ( 1 << VICIntSel_EINT3 ) ;<br /> <br /> PLL->PLL_CON = 1 ;<br /> PLL->PLL_CFG = 0x25 ; // M = 6 P = 2<br /> PLL->PLL_FEED = 0xAA ;<br /> PLL->PLL_FEED = 0x55 ;<br /> while(PLL->PLL_STAT & (1 << 10) == 0);<br /> PLL->PLL_CON = 3 ;<br /> PLL->PLL_FEED = 0xaa ;<br /> PLL->PLL_FEED = 0x55 ;<br /> KeyBoardInit();<br /> SysParam.Status &= (~SYS_STATUS_WAKE_UP) ; <br /> VIC->IntEnable |= (1 << VICIntSel_PWM0) ; <br /> SysParam.TimeOut = 0 ;<br />}<br /><br />//-----------------------------------------------------------------------------------<br /><br />void WakeUpFromEInt1() __irq<br />{<br /> while((SYSCON->EXT_INT &0x02) != 0) <br /> {<br /> SYSCON->EXT_INT = ( 1 << EINT1 ) ;<br /> }<br /> WakeUp();<br /> VIC->VectAddr = 0x00 ;<br />}<br /><br />//-----------------------------------------------------------------------------------<br /> <br />void WakeUpFromEInt2() __irq<br />{<br /> while((SYSCON->EXT_INT &0x04) != 0) <br /> {<br /> SYSCON->EXT_INT = ( 1 << EINT2 ) ;<br /> }<br /> WakeUp();<br /> VIC->VectAddr = 0x00 ;<br />}<br /><br />//-----------------------------------------------------------------------------------<br /><br />void WakeUpFromEInt3() __irq<br />{<br /> while((SYSCON->EXT_INT &0x08) != 0) <br /> {<br /> SYSCON->EXT_INT = ( 1 << EINT3 ) ;<br /> }<br /> WakeUp();<br /> VIC->VectAddr = 0x00 ;<br />}<br /> <br />//------------------------------------------------------------------------------------<br /><br />void GPIO2EInt(void)<br />{<br /> DisableIRQ();<br /> PINSEL->PIN_SEL1 |= (P0_30_EINT3 << P0_30_PINSEL);<br /> PINSEL->PIN_SEL1 |= (P0_20_EINT3 << P0_20_PINSEL);<br /> PINSEL->PIN_SEL0 |= (P0_7_EINT2 << P0_7_PINSEL);<br /> PINSEL->PIN_SEL0 |= (P0_14_EINT1 << P0_14_PINSEL);<br /> <br /> VIC->IntEnClr |= ( 1 << VICIntSel_PWM0 ); <br /> P0->IODIR |= ( KEY_COL1 ) | ( KEY_COL2 ) | ( KEY_COL3 ) | ( KEY_COL4 ) ;<br /> P0->IOCLR |= ( KEY_COL1 ) | ( KEY_COL2 ) | ( KEY_COL3 ) | ( KEY_COL4 ) ; <br /> SYSCON->EXT_MODE = 0x00; //interrupt is low volate triggle<br /> SYSCON->EXT_POLAR = 0x00 ;<br /> SYSCON->INT_WAKE = ( 1 << EXTWAKE1 ) | ( 1 << EXTWAKE2 ) | ( 1 << EXTWAKE3 ) ;<br /> SYSCON->EXT_INT = ( 1 << EINT1 ) | ( 1 << EINT2) | ( 1 << EINT3 ) ;<br /> <br /> VIC->VectCntls[5] = VICIntSel_Enable | VICIntSel_EINT1 ; <br /> VIC->VectAddrs[5] = (unsigned int)WakeUpFromEInt1; //<br /><br /> VIC->VectCntls[6] = VICIntSel_Enable | VICIntSel_EINT2 ;<br /> VIC->VectAddrs[6] = (unsigned int)WakeUpFromEInt2 ; //<br /><br /> VIC->VectCntls[7] = VICIntSel_Enable | VICIntSel_EINT3 ;<br /> VIC->VectAddrs[7] = (unsigned int)WakeUpFromEInt3 ; //<br /><br /> VIC->IntEnable |= ( 1 << VICIntSel_EINT1 ) | ( 1 << VICIntSel_EINT2 ) | ( 1 << VICIntSel_EINT3 );<br /> EnableIRQ();<br />}<br /><br /><br /> |
|