STM32 485通讯遇到的问题
在做项目的时候要求用485进行主机与从机进行通讯,在485发送和接收的时候要对驱动器进行控制,在刚开始调发送和接收的时候总是失败,原因有一下几个
- 使能驱动器后立刻发送数据,导致第一个数据有时候错误。
- 串口中断后马上控制驱动器为发送模式,然后发送数据,导致出错,有时直接卡死。
3.在发送指令后马上接收有时候串口溢出标志位会置位,原因不明,通过在错误中断清除标志位来处理。
4.在进入错误中断后读取串口的ISR寄存器后要延时一段时间才能清除标志位,不然无法清除。
5.STM32F0为M0的内核,中断分组和M3,M4的不同,只有抢占,怎么区分优先级现在还不明。
在错误中断中清除标志位的方法
/**
* Description:串口错误回调函数
* Parameter :USARTX_Handler 串口句柄
* Return :None
* Others :串口接收出错进入此函数
* :
*/
void HAL_UART_ErrorCallback(UART_HandleTypeDef *USARTX_Handler)
{
uint8_t c;
c = USARTX_Handler->Instance->ISR;
for(int i;i<10000;i++);//读取SR寄存器后要延时一段时间,否则无法进入下面的判断
//printf("GG");
if((__HAL_UART_GET_FLAG(USARTX_Handler, UART_FLAG_PE))!=RESET)
{
READ_REG(USARTX_Handler->Instance->RDR);//PE清标志,第二步读DR
READ_REG(USARTX_Handler->Instance->TDR);//PE清标志,第二步读DR
__HAL_UART_CLEAR_FLAG(USARTX_Handler, UART_FLAG_PE);//清标志
}
if((__HAL_UART_GET_FLAG(USARTX_Handler, UART_FLAG_FE))!=RESET)
{
READ_REG(USARTX_Handler->Instance->RDR);//FE清标志,第二步读DR
READ_REG(USARTX_Handler->Instance->TDR);//PE清标志,第二步读DR
__HAL_UART_CLEAR_FLAG(USARTX_Handler, UART_FLAG_FE);
}
if((__HAL_UART_GET_FLAG(USARTX_Handler, UART_FLAG_NE))!=RESET)
{
READ_REG(USARTX_Handler->Instance->RDR);//NE清标志,第二步读DR
READ_REG(USARTX_Handler->Instance->TDR);//PE清标志,第二步读DR
__HAL_UART_CLEAR_FLAG(USARTX_Handler, UART_FLAG_NE);
}
if((__HAL_UART_GET_FLAG(USARTX_Handler, UART_FLAG_ORE))!=RESET)
{
READ_REG(USARTX_Handler->Instance->CR1);//ORE清标志,第二步读CR
READ_REG(USARTX_Handler->Instance->TDR);//PE清标志,第二步读DR
__HAL_UART_CLEAR_FLAG(USARTX_Handler, UART_FLAG_ORE);
__HAL_UART_CLEAR_OREFLAG(USARTX_Handler);
if(USARTX_Handler->Instance == USART1)
{
HAL_UART_Receive_IT(USARTX_Handler,&USART1_RxBuffer,1);
}
else if(USARTX_Handler->Instance == USART3)
{
HAL_UART_Receive_IT(USARTX_Handler,&USART3_RxBuffer,1);
}
else if(USARTX_Handler->Instance == USART5)
{
HAL_UART_Receive_IT(USARTX_Handler,&USART5_RxBuffer,1);
}
}
}
参考:串口溢出中断(ORE).