那你可以试试我这样的方法,另外写一个修改波特率的api,只在初始化时用 MX_XX,改波特率用 hal api.
这将不涉及中断启停的操作。我一直用着都没问题
[C] 纯文本查看 复制代码 /* 配置DMA功能的枚举 */
typedef enum
{
UART_DMA_EN,
UART_DMA_UN
} UART_DMA_ENUM;
/* 配置定义*/
typedef struct
{
UART_HandleTypeDef *Uart; // hal结构体
UART_DMA_ENUM UartReceiverDma; // 接收DMA配置
UART_DMA_ENUM UartTransmitDma; // 发送DMA配置
} _UART_STDIO_CONFIG;
typedef struct
{
_UART_STDIO_CONFIG UartConfig; // Uart配置
_UART_STDIO_EXIST UartExist; // Uart存储空间
/* 使用DMA必须绑定的内容 */
uint8_t *DMATxBuffer; // DMA发送buffer(为了在不使用DMA时节省空间,这部分存储空间另外绑定)
uint8_t *DMARxBuffer; // DMA接收buffer(为了在不使用DMA时节省空间,这部分存储空间另外绑定)
} _UART_STDIO_HANDLE;
/**
* @brief 单独配置某个UART的波特率
* @param pd Uart通道结构体
* @param Baud 期望配置成的波特率
* @return
*/
uint32_t UartBaudRateSet(_UART_STDIO_HANDLE *pd, uint32_t Baud)
{
HAL_UART_DeInit(pd->UartConfig.Uart);
pd->UartConfig.Uart->Init.BaudRate = Baud;
if(HAL_UART_Init(pd->UartConfig.Uart) != HAL_OK)
return RETURN_ERROR; // 配置失败
SET_BIT(pd->UartConfig.Uart->Instance->ICR, USART_ICR_TCCF); /* 清除TC发送完成标志 */
SET_BIT(pd->UartConfig.Uart->Instance->RQR, USART_RQR_RXFRQ); /* 清除RXNE接收标志 */
SET_BIT(pd->UartConfig.Uart->Instance->CR1, USART_CR1_RXNEIE); /* 使能接收中断 */
if(pd->UartConfig.UartReceiverDma == UART_DMA_EN)
{
HAL_UARTEx_ReceiveToIdle_DMA(pd->UartConfig.Uart, pd->DMARxBuffer, UART_RX_BUFFER_SIZE);
}
return RETURN_DEFAULT;
}
|