你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G030F6P6,UART,发现一个问题,在勘误手册中未发现说明

[复制链接]
中山无雪@ 提问时间:2023-5-8 19:10 / 已解决
做了一个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 : %d\r\n", g_uart_received_counter, huart->RxXferSize, huart->RxXferCount);

memcpy(g_uart_rxBuffer, uart_rxBuffer, g_uart_received_counter);
printf("CP_Data : %s\r\n", 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 : %d\r\n", g_uart_received_counter, huart->RxXferSize, huart->RxXferCount);
memcpy(g_uart_rxBuffer, uart_rxBuffer, g_uart_received_counter);
printf("ER_Data : %s\r\n", g_uart_rxBuffer);
memset(g_uart_rxBuffer, 0, UART_RXBUFFER_SIZE);
HAL_UART_Receive_IT(&huart2, uart_rxBuffer, UART_RXBUFFER_SIZE);
}



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

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

每次输入数据后(123456789abcdef\r\n)mcu并未触发RTOF中断,而是等到触发缓冲区满中断后紧接着触发一次RTOF中断,看了一下标准库代码,还未发现什么问题,感觉是MCU本身问题造成,G030其他封装形式的还未测试。
收藏 评论4 发布时间:2023-5-8 19:10

举报

4个回答
butterflyspring 最优答案 回答时间:2023-5-9 11:39:52
从参考手册上看,G030系列的UART2 应该不支持TIMEOUT的功能,只有基本basic 功能。UART1才具有这个功能。楼主再仔细核对一下看。
stm32g030 uart timeout 1.png stm32g030 uart timeout 2.png

xmshao 回答时间:2023-5-9 10:21:13
问题描述得比较详细,看着都舒服。先赞再聊!


你说 每次输入数据后(123456789abcdef\r\n)mcu并未触发RTOF中断,而是等到触发缓冲区满中断后紧接着触发一次RTOF中断。


RTO中断不是要等到收到1个字符后空闲超过RTO设置值后才可能触发吗?你现在输入数据时是连续的还是间隔的,如果间隔的,


间隔是否满足触发RTO中断?
中山无雪@ 回答时间:2023-5-11 11:04:40
今天又测试了一下STM32G030C8T6,RTOF是能使用的,本来开始的时候不能使用,测试了即便问题一样,后来通过cubwMX更新了一下代码库再编译好了。
在测试STM32G030C8T6时我使用的UART是UART1,前边确实没注意UART2是没有RTOF功能的,今天再测试一下.
中山无雪@ 回答时间:2023-5-11 11:49:39

butterflyspring 发表于 2023-5-9 11:39
从参考手册上看,G030系列的UART2 应该不支持TIMEOUT的功能,只有基本basic 功能。UART1才具有这个功能。楼 ...

确实没注意到UART2不支持RTOF,刚才测试了一下,没问题,谢谢!!!

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版