STM32
直播中

CDCNKA

8年用户 1174经验值
擅长:385288
私信 关注
[问答]

STM32G030F6P6输入数据后并未触发RTOF中断,等到触发缓冲区满中断后紧接着触发一次RTOF中断,为什么?

做了一个STM32G030F6P6实验板,测试UART时发现一个关于接收超时的问题,直接在cubeMX 生成代码中增加receive timeout设置(在STM32G431中就是如此使用,很正常),代码如下:


void MX_USART2_UART_Init(void)
{

/* USER CODE BEGIN USART2_Init 0 */

/* USER CODE END USART2_Init 0 */

/* USER CODE BEGIN USART2_Init 1 */

/* USER CODE END USART2_Init 1 */
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart2.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_DMADISABLEONERROR_INIT;
huart2.AdvancedInit.DMADisableonRxError = UART_ADVFEATURE_DMA_DISABLEONRXERROR;
if (HAL_UART_Init( huart2) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART2_Init 2 */
HAL_UART_EnableReceiverTimeout( huart2);
HAL_UART_ReceiverTimeout_Config( huart2, 5);
HAL_UART_Receive_IT( huart2, uart_rxBuffer, UART_RXBUFFER_SIZE);
/* USER CODE END USART2_Init 2 */
}

添加接收回调(为了更清楚显示效果添加了一些输出代码):


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
g_uart_received_completed = true;
g_uart_received_counter = huart->RxXferSize - huart->RxXferCount;

printf("CP_Callback Counter : %d  RxXferSize : %d  RxXferCount : %drn", g_uart_received_counter, huart->RxXferSize, huart->RxXferCount);

memcpy(g_uart_rxBuffer, uart_rxBuffer, g_uart_received_counter);
printf("CP_Data : %srn", g_uart_rxBuffer);
memset(g_uart_rxBuffer, 0, UART_RXBUFFER_SIZE);
HAL_UART_Receive_IT( huart2, uart_rxBuffer, UART_RXBUFFER_SIZE);
}

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
g_uart_received_completed = true;
g_uart_received_counter = huart->RxXferSize - huart->RxXferCount;
printf("ER_Callback Counter : %d  RxXferSize : %d  RxXferCount : %drn", g_uart_received_counter, huart->RxXferSize, huart->RxXferCount);
memcpy(g_uart_rxBuffer, uart_rxBuffer, g_uart_received_counter);
printf("ER_Data : %srn", g_uart_rxBuffer);
memset(g_uart_rxBuffer, 0, UART_RXBUFFER_SIZE);
HAL_UART_Receive_IT( huart2, uart_rxBuffer, UART_RXBUFFER_SIZE);
}



下载到MCU后执行UART输入(输入内容是“123456789abcdefrn”),显示数据如下:

CP_Callback Counter : 128  RxXferSize : 128  RxXferCount : 0
CP_Data : 123456789abcdef
123456789abcdef
123456789abcdef
123456789abcdef
123456789abcdef
123456789abcdef
123456789abcdef
123456789
ER_Callback Counter : 1  RxXferSize : 128  RxXferCount : 127
ER_Data : a
CP_Callback Counter : 128  RxXferSize : 128  RxXferCount : 0
CP_Data : 123456789abcdef
123456789abcdef
123456789abcdef
123456789abcdef
123456789abcdef
123456789abcdef
123456789abcdef
123456789
ER_Callback Counter : 1  RxXferSize : 128  RxXferCount : 127
ER_Data : a

每次输入数据后(123456789abcdefrn)mcu并未触发RTOF中断,而是等到触发缓冲区满中断后紧接着触发一次RTOF中断,看了一下标准库代码,还未发现什么问题,感觉是MCU本身问题造成,G030其他封装形式的还未测试。

回帖(1)

李梓

2024-3-18 16:08:44
从参考手册上看,G030系列的UART2 应该不支持TIMEOUT的功能,只有基本basic 功能。UART1才具有这个功能。楼主再仔细核对一下看。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分