完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
做了一个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其他封装形式的还未测试。 |
|
相关推荐
1个回答
|
|
从参考手册上看,G030系列的UART2 应该不支持TIMEOUT的功能,只有基本basic 功能。UART1才具有这个功能。
|
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2648 浏览 1 评论
3213 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1787 浏览 1 评论
3616 浏览 6 评论
5996 浏览 21 评论
944浏览 4评论
1318浏览 4评论
在Linux上安装Atollic TRUEStudio的步骤有哪些呢?
588浏览 3评论
使用DMA激活某些外设会以导致外设无法工作的方式生成代码是怎么回事
1307浏览 3评论
1367浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 15:12 , Processed in 1.057633 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号