求助,关于S3C6410(或者2440)的定时器,搞了2天了,还是死机
买的是tiny6410的板子,系统是wince6.0
为了较精准的us延时,想用定时器来实现。
定时器有 timer0~timer4,我在流驱动中,用的是timer2
然后在使用的过程中,就出现了怪事,不解。现象是:只要一用到DelayUS函数,wince就死机。但是通过观察发现,流驱动中的流程其实都跑完了。也就是XXX_Open,XXX_Close都执行完了,然后Wince死机了…………………………
不明所以,一头雾水………………贴出代码,谁能帮我看看,分析?
{
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;
}
{
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;
}
{
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;
}
为了较精准的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;
}
...全文
相关推荐
S3C2440与S3C6410中文数据手册
想学嵌入式的可以参考下,两个常用芯片的中文数据手册,许多开发板都是采用这两款芯片做主芯片
arm-linux-gcc-4.4.3 嵌入式交叉编译工具链安装、配置与避坑实战
交叉编译是嵌入式Linux开发中的基础技能,其核心工具链选择直接影响开发效率与程序运行稳定性。理解交叉编译原理,即在一套架构上生成另一套架构可执行代码的过程,是掌握嵌入式开发的起点。合理的工具链配置,包括环境变量、库路径与主机适配,能够避免大量低效的排错环节。本文以经典工具链arm-linux-gcc-4.4.3为例,系统讲解其在老式ARM教学板、工业设备及BSP维护中的应用场景,从安装准备到Makefile编写,再到内核与驱动模块编译实践,并梳理常见报错与排查方案,帮助开发者在新旧工具链之间做出务实选择。
S3C6410裸机外部中断+定时器中断
完全裸机操作,采用定时器0和外部中断控制LED闪烁,开发板采用OK6410
s3c6410 定时器
s3c6410芯片适用的定时器代码,包括定时器中断,比飞凌的代码简洁,容易阅读
S3C6410+2440的封装、原理库
S3C6410+2440的封装、原理库,适用于硬件开发


