你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
usart3:没有开启DMA模式,开启此功能必须使能timer1,而且中断发送数据时,总是产生idle故障标志。且总是接收到自己发出的数据。请问,1.怎样可以让idle故障标志不再产生?2.怎么可以让usart3串口可以自动接收自己发出的数据(即可全双工工作)?
usart4:目前仅可以正常接收数据,发送数据总是不完整。开启timer15仍无效果。
希望大家帮助解决一下,在此先行谢过!
举报
我们先一个一个的来解决。
1、如何不自发自收,只要外部不短接到一块是不会发生自发自收的。如果方便最好还是上传一下工程。
2、发送不完整,发送的过程时什么样的?尽量不要在中断中进行数据发送。
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)
/ 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 /
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); }
如果想自发自收,在外部将串口的RX和TX短接即可。HAL库一般是接收完指定长度后退出中断,进入回调函数。发送数据不完整的情况,先用查询方式发送,确认正常,切换到中断。我怀疑是中断处理的问题。我看你的中断时串口3和串口4一块处理,是系统生成的,还是自己改的?
废鱼 发表于 2022-3-22 17:22 如果想自发自收,在外部将串口的RX和TX短接即可。HAL库一般是接收完指定长度后退出中断,进入回调函数 ...
[md]1。程序大部分自动生成的。
2。我就是不想发生自发自收的情况,才请教大佬的。
目前,就是不知道是什么原因导致的。
谢谢您。如果发现什么不对地方,还请不吝赐教。再次感谢!!
那个idle标志是硬件检测后产生的,你可以选择不理它,比方不开启idle中断。这样它对你没有影响。
想使用UART的自发自收的话,硬件上TXRX短接即可,不过你就不能收发都使用查询方式,这样实现不了。你可以发送使用DMA,接收采用轮训方式 或者都使用DMA方式。
至于UART4的发送问题,估计你哪里误判了,你现在是非DMA方式,发送无非发完一个发送下一个,直到发送完毕为止。你说接收,倒还有接收不及时产生溢出方面的问题。你再检查下代码。
黑猫 发表于 2022-3-23 09:54 1。程序大部分自动生成的。</p> <p>2。我就是不想发生自发自收的情况,才请教大佬的。
[md]感谢您的支持!
问题已经解决,初始化部分程序的问题。
已经修改。
xmshao 发表于 2022-3-24 11:26 那个idle标志是硬件检测后产生的,你可以选择不理它,比方不开启idle中断。这样它对你没有影响。</p> <p>
问题已经解决,初始化的问题!
第三季度啦,兄弟们
STM32G070RBT6TR ADC采集定点电压误差较大,有没有优化方向
电脑主机一亮一灭启动不了
LIS2MDL X轴数据读取问题
无法完全整片擦除 STM32H Nucleo
周末卡点打卡
使用touchgfx控件modalWindow,显示会有条纹
stm32cubemx和数据手册对不上
STM32G0b1 USB device cdc显示设备描述符请求失败
我们先一个一个的来解决。
1、如何不自发自收,只要外部不短接到一块是不会发生自发自收的。如果方便最好还是上传一下工程。
2、发送不完整,发送的过程时什么样的?尽量不要在中断中进行数据发送。
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);
/ 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 /
/ USER CODE END USART4_Init 2 /
}
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)
{
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
}
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
// __HAL_UART_ENABLE_IT(&huart3, UART_IT_ERR);
}
如果想自发自收,在外部将串口的RX和TX短接即可。HAL库一般是接收完指定长度后退出中断,进入回调函数。发送数据不完整的情况,先用查询方式发送,确认正常,切换到中断。我怀疑是中断处理的问题。我看你的中断时串口3和串口4一块处理,是系统生成的,还是自己改的?
[md]1。程序大部分自动生成的。
2。我就是不想发生自发自收的情况,才请教大佬的。
目前,就是不知道是什么原因导致的。
谢谢您。如果发现什么不对地方,还请不吝赐教。再次感谢!!
那个idle标志是硬件检测后产生的,你可以选择不理它,比方不开启idle中断。这样它对你没有影响。
想使用UART的自发自收的话,硬件上TXRX短接即可,不过你就不能收发都使用查询方式,这样实现不了。你可以发送使用DMA,接收采用轮训方式 或者都使用DMA方式。
至于UART4的发送问题,估计你哪里误判了,你现在是非DMA方式,发送无非发完一个发送下一个,直到发送完毕为止。你说接收,倒还有接收不及时产生溢出方面的问题。你再检查下代码。
[md]感谢您的支持!
问题已经解决,初始化部分程序的问题。
已经修改。
[md]感谢您的支持!
问题已经解决,初始化的问题!