完善资料让更多小伙伴认识你,还能领取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 : %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个回答
|
|
从参考手册上看,G030系列的UART2 应该不支持TIMEOUT的功能,只有基本basic 功能。UART1才具有这个功能。楼主再仔细核对一下看。
|
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1621 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1546 浏览 1 评论
980 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
686 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1599 浏览 2 评论
1867浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
650浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
518浏览 3评论
534浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
506浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 19:52 , Processed in 0.677574 second(s), Total 50, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号