买的是tiny6410的板子,系统是wince6.0
为了较精准的us延时,想用定时器来实现。
定时器有 timer0~timer4,我在流驱动中,用的是timer2
然后在使用的过程中,就出现了怪事,不解。现象是:只要一用到DelayUS函数,wince就死机。但是通过观察发现,流驱动中的流程其实都跑完了。也就是XXX_Open,XXX_Close都执行完了,然后Wince死机了…………………………
不明所以,一头雾水………………贴出代码,谁能帮我看看,分析?
static void DelayUS(int time) //定时器2 1us准确定时,单位是 0.92us
{
LEDSet(0,1);
static unsigned long val = 8 -1;//(PCLK>>3)/1000000-1;
g_pPWMReg->TCFG0 &= ~(0xff<<8);
g_pPWMReg->TCFG0 |= 0<<8; //prescaler = 0+1
g_pPWMReg->TCFG1 &= ~(0xf<<8);
g_pPWMReg->TCFG1 |= 0<<8; //mux2 = 1/1
g_pPWMReg->TCNTB2 = val;
g_pPWMReg->TCON &= ~(0xf<<12);
g_pPWMReg->TCON |= 0xb<<12;//interval, inv-off, update TCNTB2&TCMPB2, start timer 2
g_pPWMReg->TCON &= ~(2<<12); //clear manual update bit
while(time--) {
while(g_pPWMReg->TCNTO2!=(g_pPWMReg->TCNTB2-1));
}
g_pPWMReg->TCON &= ~(1<<12); //stop timer2
LEDSet(0,0);
return;
}
DWORD GIO_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
RETAILMSG(1,(TEXT("USERGPIO: GPIO_Open\r\n")));
/*保存原先设置*/
m_6410_GPNCON = g_pGPIOReg->GPNCON;
m_6410_GPNPUD = g_pGPIOReg->GPNPUD;
m_6410_TINT_CSTAT = g_pPWMReg->TINT_CSTAT;
m_6410_EINT0MASK = g_pGPIOReg->EINT0MASK;
m_6410_EINT0PEND = g_pGPIOReg->EINT0PEND;
/*上拉使能,设置为输出*/
g_pGPIOReg->GPNPUD = (g_pGPIOReg->GPNPUD | EINT8_RESERVE_PULL);
g_pGPIOReg->GPNPUD = (g_pGPIOReg->GPNPUD & ~(0x01<<16));
g_pGPIOReg->GPNCON = (g_pGPIOReg->GPNCON & ~(0x01<<17));
g_pGPIOReg->GPNCON = (g_pGPIOReg->GPNCON | (0x01<<16));
/*关闭timer2中断,关闭EINT8中断*/
g_pPWMReg->TINT_CSTAT &= ~(0x01<<2); //timer2
g_pGPIOReg->EINT0MASK |= (1<<8); //EINT8 屏蔽中断
g_pGPIOReg->EINT0PEND &= ~(0x01<<8); //EINT8 不发生中断
/*输出一个高电平*/
g_pGPIOReg->GPNDAT |= EINT8_HIGH; //总线闲置时为高电平
LEDSet(2,1);
return TRUE;
}
OOL GIO_Close(DWORD hOpenContext)
{
RETAILMSG(1,(TEXT("USERGPIO: GPIO_Close\r\n")));
/*还原GPN寄存器*/
g_pGPIOReg->GPNCON = m_6410_GPNCON;
g_pGPIOReg->GPNPUD = m_6410_GPNPUD;
//g_pGPIOReg->EINT0PEND = m_6410_EINT0PEND;
g_pPWMReg->TINT_CSTAT = m_6410_TINT_CSTAT;
g_pGPIOReg->EINT0MASK = m_6410_EINT0MASK;
LEDSet(2,0);
return TRUE;
}