|
/************定时器代码****************/
void Timer2Stop(void)
{
rTCON &= ~(0x1<<12);
}
void Timer2_Exception(void)
{
OSIntEnter();
rI_ISPC = BIT_TIMER2;
ComT15EndHandle();
Timer2Stop();
OSIntExit();
}
void Timer2Int(void)
{
// 定时器的记数单位为1微秒
rTCFG0 &= ~(0xff<<8); //定时器23的预分频位置0
rTCFG0 |= Timer2Pre<<8; //设置预分频值
rTCFG1 &= ~(0xf<<8); // TIMER2再取1/2分频,取得100KHz
pISR_TIMER2=(unsigned)Timer2_Exception;
rTCNTB2 = MCLK/(Timer2Freq*Timer2Pre*2); //0xd6d8//定时器4的重装值,公式rTCNBn=MCLK/(1/T)/pre/mux, n为定时器序号, T为定时时间(s), *rTCNBn<=0xffff
rTCMPB2 = 0x0; // 定时器4比较缓冲区寄存器的值
rTCON &= ~(0x1<<15); // 非重载模式
rINTMSK &=~BIT_TIMER2;
}
void OpenTimer2(void)
{
Timer2Stop();
rTCON |= 0x1<<13; // 更新TCNTB2, TCMPB2
rTCON &= ~(0x1<<13); // 停止更新TCNTB2, TCMPB2
rTCON |= 0x1<<12; // 启动定时器2
}
/*************串口接收部分代码**************/
volatile ADU_CONTROL ADUData;
OS_EVENT *ComHandleSem;
U8 ADU_BUFFER[ADU_BUFFER_SIZE];
void Uart0Exception(void)
{
OSIntEnter();
rI_ISPC = BIT_URXD0;
if(!(rUTRSTAT0 & 0x1)){
return;
}
//Receive data
ComReceChar(RdURXH0());
OSIntExit();
}
void ComT15EndHandle(void)
{
OSSemPost(ComHandleSem);
}
void ComReceChar(U8 ReceChar)
{
ADUData.FrameOK = FALSE;
OpenTimer2(); // 起动T1.5计时
if(ADUData.ADULength < ADU_BUFFER_SIZE){
*(ADUData.ADUBuffPtr + ADUData.ADULength) = ReceChar;
ADUData.ADULength++;
}
}
U8 ComIdle(void)
{
U8 err;
U16 RedundancyCheck;
// 检验有效帧
OSSemPend(ComHandleSem, 10, &err);
if((*ADUData.ADUBuffPtr == ComHeader) &&
(*(ADUData.ADUBuffPtr + 1) == ComHeader) &&
(*(ADUData.ADUBuffPtr + 2) == ComHeader)){
*ADUData.ADUBuffPtr = 0;
if(((*(ADUData.ADUBuffPtr + 3) == WORD_HI(ComBroadcastAddr))&& // 验证地址是否有效
(*(ADUData.ADUBuffPtr + 4) == WORD_LO(ComBroadcastAddr))) ||
((*(ADUData.ADUBuffPtr + 3) == WORD_HI(ADUData.Address)) &&
(*(ADUData.ADUBuffPtr + 4) == WORD_LO(ADUData.Address)))
){
RedundancyCheck = (*(ADUData.ADUBuffPtr+ADUData.ADULength-2)<<8)|
*(ADUData.ADUBuffPtr+ADUData.ADULength-1);
if(RedundancyCheck == CheckCRC16(ADUData.ADUBuffPtr + 3, ADUData.ADULength-5)) // CRC校验
{
ADUData.FrameOK = TRUE;
if(CmdExecutive((*(ADUData.ADUBuffPtr + 5)<<8) | *(ADUData.ADUBuffPtr + 6), ADUData.ADUBuffPtr+7) < 0)
ComReply(*(ADUData.ADUBuffPtr+7), Ack_InvalidData);
}
}
}
ADUData.FrameOK = FALSE;
// 准备收到下一帧
ADUData.ADULength = 0;
ADUData.EndT15 = FALSE;
return COMRECE_SUCC;
}
/***************************************************************/
搞不明白为什么会死机,有时候是出现Undefined中断然后死机,有时候是直接重启,不知道是不是堆栈溢出还是死锁,实在郁闷了,上来问问。
CPU是三星的44B0。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|