硬汉嵌入式论坛

 找回密码
 立即注册
查看: 395|回复: 15
收起左侧

[STM32CubeF4] 请教下, uart 波特率 动态重新配置需要注意哪些事项呀 ?

[复制链接]

723

主题

3797

回帖

5991

积分

论坛元老

自定义头衔

积分
5991
发表于 2026-1-21 16:29:16 | 显示全部楼层 |阅读模式



请教下, uart 波特率 动态重新配置需要注意哪些事项呀 ?


目前使用的是 stm32L4S5V 这个芯片,


void MX_UART5_Init(uint32_t BaudRate)
{
       
  UART5_Handle.Instance = UART5;
  HAL_UART_DeInit(&UART5_Handle);
       
  UART5_Handle.Init.BaudRate = BaudRate;
  UART5_Handle.Init.WordLength = UART_WORDLENGTH_8B;
  UART5_Handle.Init.StopBits = UART_STOPBITS_1;
  UART5_Handle.Init.Parity = UART_PARITY_NONE;
  UART5_Handle.Init.Mode = UART_MODE_TX_RX;
  UART5_Handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  UART5_Handle.Init.OverSampling = UART_OVERSAMPLING_16;
  UART5_Handle.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  UART5_Handle.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  UART5_Handle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&UART5_Handle) != HAL_OK)
  {
    Error_Handler(__FILE__, __LINE__);
  }
  if (HAL_UARTEx_SetTxFifoThreshold(&UART5_Handle, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler(__FILE__, __LINE__);
  }
  if (HAL_UARTEx_SetRxFifoThreshold(&UART5_Handle, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler(__FILE__, __LINE__);
  }
  if (HAL_UARTEx_DisableFifoMode(&UART5_Handle) != HAL_OK)
  {
    Error_Handler(__FILE__, __LINE__);
  }

        SET_BIT(UART5->ICR, USART_ICR_TCCF);
        SET_BIT(UART5->RQR, USART_RQR_RXFRQ);
//        SET_BIT(UART5->CR1, USART_CR1_RXNEIE);
}



// 波特率默认是 MX_UART5_Init(19200);

动态想修改为 MX_UART5_Init(115200);  // 目前动态设置为 115200 时会出现错误提示 ??







回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
发表于 2026-1-21 16:43:44 | 显示全部楼层
我一般是先去初始化之后,再重新按新的波特率配置串口
回复

使用道具 举报

27

主题

285

回帖

366

积分

高级会员

积分
366
QQ
发表于 2026-1-21 17:00:49 | 显示全部楼层
先 DeInit
回复

使用道具 举报

723

主题

3797

回帖

5991

积分

论坛元老

自定义头衔

积分
5991
 楼主| 发表于 2026-1-21 17:04:38 | 显示全部楼层
本帖最后由 hpdell 于 2026-1-21 17:06 编辑





uart5-re.png



HAL_UART_MspDeInit - 》:
uart5-re-2.png


重新配置前有 deinit

reinit 运行到 HAL_NVIC_DisableIRQ(UART5_IRQn)  这个函数就会出现错误了   ???



回复

使用道具 举报

30

主题

426

回帖

516

积分

金牌会员

积分
516
发表于 2026-1-21 17:13:23 | 显示全部楼层
试一下先把串口总的 EN 给 DISABLE
回复

使用道具 举报

723

主题

3797

回帖

5991

积分

论坛元老

自定义头衔

积分
5991
 楼主| 发表于 2026-1-21 17:27:37 | 显示全部楼层
tovinz 发表于 2026-1-21 17:13
试一下先把串口总的 EN 给 DISABLE

总的 en disable 是哪个函数呀 ?
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
121126
QQ
发表于 2026-1-22 01:04:57 | 显示全部楼层
下面这个函数前面加HAL_UART_DeInit

if (HAL_UART_Init(&UART5_Handle) != HAL_OK)
  {
    Error_Handler(__FILE__, __LINE__);
  }
回复

使用道具 举报

27

主题

285

回帖

366

积分

高级会员

积分
366
QQ
发表于 2026-1-22 08:56:58 | 显示全部楼层
hpdell 发表于 2026-1-21 17:04
HAL_UART_MspDeInit - 》:

MX_UART5_Init 和 HAL_UART_MspDeInit 保持自动生成的原样吗?贴的代码不全。

出错误是HardFault吗?试试用 SEGGER HardFault handler https://www.segger.com/downloads/application-notes/
或者手动看寄存器,到底是非法地址(另有寄存器记录这个非法地址)、还是栈溢出
回复

使用道具 举报

30

主题

426

回帖

516

积分

金牌会员

积分
516
发表于 2026-1-22 09:08:22 | 显示全部楼层
hpdell 发表于 2026-1-21 17:27
总的 en disable 是哪个函数呀 ?

抱歉啊,我用寄存器用习惯了,串口控制器更改通信参数配置的时候,要先把控制寄存器的串口使能先关掉,我以为是这个问题。
你这个应该是 HAL 软件的使用问题,注意操作流程。
回复

使用道具 举报

723

主题

3797

回帖

5991

积分

论坛元老

自定义头衔

积分
5991
 楼主| 发表于 2026-1-22 09:28:07 | 显示全部楼层
eric2013 发表于 2026-1-22 01:04
下面这个函数前面加HAL_UART_DeInit

if (HAL_UART_Init(&UART5_Handle) != HAL_OK)

可能是我的 HAL_UART_DeInit 这个位置放的不对, 我这个函数放在最上面了 只配置了一下 uart 编号就进行置位配置了
回复

使用道具 举报

723

主题

3797

回帖

5991

积分

论坛元老

自定义头衔

积分
5991
 楼主| 发表于 2026-1-22 09:28:50 | 显示全部楼层
tovinz 发表于 2026-1-22 09:08
抱歉啊,我用寄存器用习惯了,串口控制器更改通信参数配置的时候,要先把控制寄存器的串口使能先关掉,我 ...

好的, 我再捣鼓看看, 我记得之前 使用 f4 系列的重新配置 波特率 貌似是没有出现问题的,
回复

使用道具 举报

723

主题

3797

回帖

5991

积分

论坛元老

自定义头衔

积分
5991
 楼主| 发表于 2026-1-22 09:29:21 | 显示全部楼层
yono 发表于 2026-1-22 08:56
MX_UART5_Init 和 HAL_UART_MspDeInit 保持自动生成的原样吗?贴的代码不全。

出错误是HardFault吗? ...

基本都是原样的
回复

使用道具 举报

27

主题

285

回帖

366

积分

高级会员

积分
366
QQ
发表于 2026-1-22 09:47:16 | 显示全部楼层
hpdell 发表于 2026-1-22 09:29
基本都是原样的

那你可以试试我这样的方法,另外写一个修改波特率的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;
}
回复

使用道具 举报

723

主题

3797

回帖

5991

积分

论坛元老

自定义头衔

积分
5991
 楼主| 发表于 2026-1-22 09:52:10 | 显示全部楼层
yono 发表于 2026-1-22 09:47
那你可以试试我这样的方法,另外写一个修改波特率的api,只在初始化时用 MX_XX,改波特率用 hal api.
这 ...

好的,感谢感谢啊
回复

使用道具 举报

38

主题

235

回帖

349

积分

高级会员

积分
349
发表于 2026-1-22 10:54:02 | 显示全部楼层
最简单的方式就是动态调整了保存波特率,重启生效
回复

使用道具 举报

6

主题

691

回帖

709

积分

金牌会员

积分
709
QQ
发表于 2026-1-22 23:47:13 | 显示全部楼层
LinY 发表于 2026-1-22 10:54
最简单的方式就是动态调整了保存波特率,重启生效

芯片软复位?很多情况下压根不可能允许你复位
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-2-24 13:45 , Processed in 0.058896 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表