
我测试了Cube下STM32F030的DMA接收串口数据函数,如下 HAL_UART_Receive_DMA(&huart1, RxDatabuf, 32); 如果该函数被调用前,串口已经发生数据溢出,则调用该函数,DMA接收将不会正常启动,只接收1个字符,然后卡住这无法运行,无论是否重新调用该函数,都继续卡着,包括调用HAL_UART_DMAStop(&huart1) 也无济于事。 解决办法还没有仔细研究,但重新初始化串口之后可以继续运行。还没测试直接清除串口溢出位标志是否可行,但直接操作寄存器有违HAL的初衷。 如果可能的话,ST的cube能否修正一下呢?HAL用的人越来越多了,不知道其他型号是否也存在这个问题。 |
HAL越来越强大,跨芯片平台,统一了STM32F系列的所有芯片,代码迁移很容易,只是现在bug还较多
我发现如果在开启DMA接收前,已经使能了串口接收就有可能出现接收溢出。解决办法就是调用了HAL_UART_Receive_DMA函数后再使能串口接收。
方法一、数据发送时串口只配置为UART_MODE_TX,收据接收时串口配置为UART_MODE_RX或UART_MODE_TX_RX。
方法二、以#define __HAL_UART_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 |= USART_CR1_UE)为原型,建立串口接收和发送使能失效功能函数,随时可用。
#define __HAL_UART_TX_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 |= USART_CR1_TE)
#define __HAL_UART_TX_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 &= ~USART_CR1_TE)
但是对于不定长的数据,超时时间设置多长是个问题
您好,我这边用F030时串口也存在问题,我重新初始化串口,发现死机了?请问如何重新初始化串口,想借鉴初始化那部分程序