STM32F407使用RS485中断方式通信问题

2019-07-21 01:55发布

    前段时间在用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中断例程一直在用,也没听说有问题,但最近的控制器程序比较复杂,负荷较重,才出现这种情况,但找不出原因~麻烦大家帮忙看看
   
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
backroad
1楼-- · 2019-07-21 15:17
 精彩回答 2  元偷偷看……
有一天
2楼-- · 2019-07-21 16:53
回复【8楼】backroad:
---------------------------------
好的,谢谢,已经改了485中断的抢占优先级为最高,下周去现场试试
有一天
3楼-- · 2019-07-21 22:33
 精彩回答 2  元偷偷看……

一周热门 更多>