求助,关于S3C6410(或者2440)的定时器,搞了2天了,还是死机

amen2100 2011-07-19 11:52:40
买的是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;
}
...全文
434 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
amen2100 2011-07-21
  • 打赏
  • 举报
回复
谢谢,问题解决,最后读出数了

这个贴里问的问题,主要是我用了系统的定时器,让系统停止响应了(可恶的厂家在手册上也不声明占用了哪些片上资源……),谢谢各位了,你们的建议我都试用了,感谢~
ele01 2011-07-19
  • 打赏
  • 举报
回复
不明白你的意思 是调用DelayUs的时候死机,还是这个函数退出了后死机? 死机 看你是不是改变了系统定时器,应该是timer4。

当我遇上-你 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 aaa_tnt 的回复:]
while(time--) {
while(g_pPWMReg->TCNTO2!=(g_pPWMReg->TCNTB2-1));
}
第二个while可能造成死循环吧?
[/Quote]
添加打印语句看看,什么效果
Ei 2011-07-19
  • 打赏
  • 举报
回复
while(time--) {
while(g_pPWMReg->TCNTO2!=(g_pPWMReg->TCNTB2-1));
}
第二个while可能造成死循环吧?

19,500

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧