新手上路
- 积分
- 38
- 金钱
- 38
- 注册时间
- 2015-2-7
- 在线时间
- 4 小时
|
1金钱
本帖最后由 xw19185 于 2020-12-2 10:31 编辑
stm32f466串口使用空闲中断+DMA方式,平时都能正常接收数据,但当一个外设临时重启时,可能会发一些乱码,就会引起MCU的串口接收卡死,如何处理为好?自己尝试重置串口,但没成功,只有复位整个MCU才能恢复正常。重置串口代码如下:void ResetUart2(void)
{
HAL_UART_Init(&huart2);
if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_ORE) !=RESET)
__HAL_UART_CLEAR_OREFLAG(&huart2);
if((__HAL_UART_GET_FLAG(&huart2, UART_FLAG_RXNE) != RESET)) //接收中断
Rx2.Buffer[0] = (uint8_t)(huart2.Instance->DR & 0x00FF);
HAL_UART_AbortReceive(&huart2);
__HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_TC);//清空闲中断
__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);//开空闲中断
__HAL_DMA_CLEAR_FLAG(&hdma_usart2_rx, DMA_FLAG_TCIF1_5);
HAL_UART_Receive_DMA(&huart2,rx2BufDMA,RXBUF_DMALEN); //开uart2串口DMA通信}
}
串口空闭中断代码如下:
void rx2InterruptFunction(void)
{
BaseType_t xHigherPriorityTaskWoken;
if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_ORE) !=RESET)
__HAL_UART_CLEAR_OREFLAG(&huart2);
if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE) != RESET)
{
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
HAL_UART_DMAStop(&huart2); //关DMA串口通信
Rx2.length =RXBUF_DMALEN - __HAL_DMA_GET_COUNTER(&hdma_usart2_rx);// 总的buf长度减去剩余buf长度,得到接收到数据的长度
__HAL_DMA_CLEAR_FLAG(&hdma_usart2_rx, DMA_FLAG_TCIF1_5);//清传输完成标志
__HAL_DMA_CLEAR_FLAG(&hdma_usart2_rx, DMA_FLAG_TEIF1_5);//清传输错误标志
memcpy(RxBuffer,rx2BufDMA,Rx2.length);
RxBuffer[Rx2.length]='\0';
RxBuffer[Rx2.length+1]='\0';
HAL_UART_Receive_DMA(&huart2,rx2BufDMA,RXBUF_DMALEN);//开DMA串口通信
xSemaphoreGiveFromISR(Rx2SemHandle,&xHigherPriorityTaskWoken); //释放设置模式二值信号量
Rx2.pointer=0;
}
}
|
|