STM32F030 485通讯遇到的问题

STM32 485通讯遇到的问题

在做项目的时候要求用485进行主机与从机进行通讯,在485发送和接收的时候要对驱动器进行控制,在刚开始调发送和接收的时候总是失败,原因有一下几个

  1. 使能驱动器后立刻发送数据,导致第一个数据有时候错误。
  1. 串口中断后马上控制驱动器为发送模式,然后发送数据,导致出错,有时直接卡死。

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).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值