前段时间在用RS485进行modbus通信时(中断接收和发送),客户反应控制器会不定期死机,后来在现场跟踪程序后发现,程序会忽然进入RS485的中断处理例程,查看USART的寄存器,发现是在便能了接收中断,但没有接收中断标识位的情况下进入的(因为进入中断,但没有相应的中断标识位,所以程序会一直在中断例程中,最后表现为控制器死机),在这种情况下,如果打一个断点,然后再运行程序,又能正常运行~
RS485中断例程代码如下:
static u32 RS485_ErrCounter = 0;//非正常进入RS485中断例程的次数
void RS485A_InterruptHook(void)
{
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET){//判断是否是接收中断
GVL_isRS485Err = FALSE;
/* Read one byte from the receive data register */
RS485A_DelRead();
USART_ClearITPendingBit(USART3, USART_IT_RXNE);//清除接收中断标识位(其实不清除也不影响)
}else if(USART_GetITStatus(USART3, USART_IT_TXE) != RESET)//判断是否是发送中断
{
if(RS485A_Send!=RS485A_WCnt){//判断是否发送完成所有字节
USART_SendData(USART3, (u16)RS485A_WBuf[RS485A_Send++]);//发送数据
if(RS485A_Send>=RS485A_W_LEN)//循环队列
RS485A_Send=0;
}else{
if(RS485A_Over){
USART_ITConfig(USART3, USART_IT_TXE, DISABLE);//关闭发送中断
RS485A_485_RX; //切换为接收
RS485A_Over = 0;
}else{
delay(0xFFFF);//延时一下,以保证最后一个字节正常发出
RS485A_Over = 1;
}
}
}else{//非正常进入中断例程(触发了中断,但不是接收也不是发送,也不是错误~)
RS485_ErrCounter++;
}
}
之前这个RS485中断例程一直在用,也没听说有问题,但最近的控制器程序比较复杂,负荷较重,才出现这种情况,但找不出原因~麻烦大家帮忙看看
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
嗯,加了清除发送中断,还好像没有改观,后来把发送改为DMA方式,接收还是中断方式,还是会在使能接收中断,但没有接收中断标识位的情况下进入中断例程,感觉应该是在发送完成后,切换为接收时出了问题~
---------------------------------
嗯嗯,中断里只做最简单的事,485中断里只是把接收到的数据放到了接收buf里,没干别的
---------------------------------
还没解决,后来是改了DMA发,DMA收,暂时解决现场问题,但没根本解决问题~
一周热门 更多>