打印
[其他ST产品]

stm32g070 芯片的usart3和usart4问题?

[复制链接]
915|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
duo点|  楼主 | 2022-3-23 15:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
usart3:没有开启DMA模式,开启此功能必须使能timer1,而且中断发送数据时,总是产生idle故障标志。且总是接收到自己发出的数据。请问,1.怎样可以让idle故障标志不再产生?2.怎么可以让usart3串口可以自动接收自己发出的数据(即可全双工工作)?
usart4:目前仅可以正常接收数据,发送数据总是不完整。开启timer15仍无效果。
希望大家帮助解决一下,在此先行谢过!

使用特权

评论回复
沙发
duo点|  楼主 | 2022-3-23 15:27 | 只看该作者
static void MX_USART3_UART_Init(void)
{
/ USER CODE BEGIN USART3_Init 0 /
/ USER CODE END USART3_Init 0 /
/ USER CODE BEGIN USART3_Init 1 /
/ USER CODE END USART3_Init 1 /
huart3.Instance = USART3;
huart3.Init.BaudRate = 115200;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;
huart3.Init.Mode = UART_MODE_TX_RX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart3.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart3) != HAL_OK)
{
Error_Handler(); }
/ USER CODE BEGIN USART3_Init 2 /
// __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_FE);
// __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_ORE);
__HAL_UART_ENABLE_IT(&huart3, UART_IT_ERR);__HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE);__HAL_UART_ENABLE(&huart3);HAL_UART_Receive_IT(&huart3, &U3_RxDat_Tmp, 1);
/ USER CODE END USART3_Init 2 /
}
static void MX_USART4_UART_Init(void)
{
/ USER CODE BEGIN USART4_Init 0 /
/ USER CODE END USART4_Init 0 /
/ USER CODE BEGIN USART4_Init 1 /
/ USER CODE END USART4_Init 1 /
huart4.Instance = USART4;
huart4.Init.BaudRate = 9600;
huart4.Init.WordLength = UART_WORDLENGTH_8B;
huart4.Init.StopBits = UART_STOPBITS_1;
huart4.Init.Parity = UART_PARITY_NONE;
huart4.Init.Mode = UART_MODE_TX_RX;
huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart4.Init.OverSampling = UART_OVERSAMPLING_16;
huart4.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart4.Init.ClockPrescaler = UART_PRESCALER_DIV4;
huart4.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart4) != HAL_OK)
{
Error_Handler(); }
/ USER CODE BEGIN USART4_Init 2 /
__HAL_UART_ENABLE_IT(&huart4, UART_IT_ERR);__HAL_UART_ENABLE_IT(&huart4, UART_IT_RXNE);__HAL_UART_ENABLE(&huart4);U4_Rx_Enable();      HAL_UART_Receive_IT(&huart4, &U4_RxDat_Tmp, 1);
/ USER CODE END USART4_Init 2 /
}

使用特权

评论回复
板凳
duo点|  楼主 | 2022-3-23 15:28 | 只看该作者
void USART3_4_IRQHandler(void)
{
/ USER CODE BEGIN USART3_4_IRQn 0 /
/ USER CODE END USART3_4_IRQn 0 /
HAL_UART_IRQHandler(&huart3);
HAL_UART_IRQHandler(&huart4);
/ USER CODE BEGIN USART3_4_IRQn 1 /
/ USER CODE END USART3_4_IRQn 1 /
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART3){        HAL_UART_Receive_IT(&huart3, &U3_RxDat_Tmp, 1);        if(__HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE) == SET)        {                __HAL_UART_CLEAR_IDLEFLAG(&huart3);        }        if(U3_Rx_Index >= U3_RXBUFFER_SIZE)                U3_Rx_Index = U3_RXBUFFER_SIZE - 1;        U3_RxBuf[U3_Rx_Index] = U3_RxDat_Tmp;        U3_Rx_Index++;        U3_Rx_Delay = 5;}else if(huart->Instance == USART4)//RS485{        HAL_UART_Receive_IT(&huart4, &U4_RxDat_Tmp, 1);        if(U4_Rx_Index >= U4_RXBUFFER_SIZE)                U4_Rx_Index = U4_RXBUFFER_SIZE - 1;        U4_RxBuf[U4_Rx_Index] = U4_RxDat_Tmp;        U4_Rx_Index++;        U4_Rx_Delay = 5;}
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART3){        __HAL_UART_CLEAR_IT(&huart3, UART_CLEAR_TCF);        __HAL_UART_DISABLE_IT(&huart3,  UART_IT_TC);}else if(huart->Instance == USART4){        __HAL_UART_CLEAR_IT(&huart4, UART_CLEAR_TCF);        __HAL_UART_DISABLE_IT(&huart4,  UART_IT_TC);        U4_Rx_Enable();        HAL_UART_Receive_IT(&huart4, &U4_RxDat_Tmp, 1);}
}
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART3){        HAL_UART_Receive_IT(&huart3, &U3_RxDat_Tmp, 1);        __HAL_UART_CLEAR_IDLEFLAG(&huart3);
// __HAL_UART_ENABLE_IT(&huart3, UART_IT_ERR);
        __HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE);}else if(huart->Instance == USART4){        __HAL_UART_CLEAR_IT(&huart4, UART_CLEAR_NEF);        __HAL_UART_CLEAR_IT(&huart4, UART_CLEAR_FEF);        __HAL_UART_CLEAR_IT(&huart4, UART_CLEAR_OREF);        __HAL_UART_CLEAR_IT(&huart4, UART_CLEAR_TCF);        __HAL_UART_DISABLE_IT(&huart4,  UART_IT_TC);        U4_Rx_Enable();        HAL_UART_Receive_IT(&huart4, &U4_RxDat_Tmp, 1);}
}

使用特权

评论回复
地板
laocuo1142| | 2022-3-24 15:00 | 只看该作者
我觉得可能是中断处理的问题

使用特权

评论回复
5
香水城| | 2022-3-25 11:07 | 只看该作者
usart3:没有开启DMA模式,开启此功能必须使能timer1,而且中断发送数据时,总是产生idle故障标志。且总是接收到自己发出的数据。
==>UART3工作按理跟TIM1没有关系,这个要查看你代码怎么回事。

请问,1.怎样可以让idle故障标志不再产生?
==》IDLE是硬件检测到的,其产生由硬件状况决定的。你可以不用理它,不开启IDLE中断使能是不会对我们代码运行有影响的。

2.怎么可以让usart3串口可以自动接收自己发出的数据(即可全双工工作)?
===》TX/RX脚短接即可。不过此时收发不能都基于查询模式。可以发送用DMA,接收查询。或者都用DMA实现。

usart4:目前仅可以正常接收数据,发送数据总是不完整。开启timer15仍无效果。
===》你的发送不完整是根据什么判断的? 对你所说 开启timer15仍无效果 还理解不了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

428

主题

1603

帖子

1

粉丝