首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在STM32板上运行后如何改变串口的波特率?

在STM32板上运行后如何改变串口的波特率?
EN

Stack Overflow用户
提问于 2019-07-31 12:44:02
回答 4查看 5.7K关注 0票数 6

我使用的是STM32F746ZG和five UARTsAll UARTs运行得很好。有人能告诉我在USART初始化后更改波特率的步骤吗?我使用USART6并使用9600波特率进行初始化。启动后,没有任何通过USART的通信。我想更改9600 to 57600 or 115200的波特率。为了进行这种更改,我调用了HAL_UART_DeInit()MX_USART6_UART_Init_57600(),但它不起作用。如果我没有改变波特率,它工作得很好。但是如果我改变了波特率,我不能通过USART.接收数据,如果有人知道解决方案,请让我知道。

下面是我的代码。

代码语言:javascript
运行
复制
int main(void)
{
  HAL_Init();

  SystemClock_Config();


  MX_UART7_Init();
  MX_UART8_Init();
  MX_USART2_UART_Init();
  MX_USART3_UART_Init();
  MX_USART6_UART_Init();

}

void MX_USART6_UART_Init(void)
{
  huart6.Instance = USART6;
  huart6.Init.BaudRate = 9600;
  huart6.Init.WordLength = UART_WORDLENGTH_8B;
  huart6.Init.StopBits = UART_STOPBITS_1;
  huart6.Init.Parity = UART_PARITY_NONE;
  huart6.Init.Mode = UART_MODE_TX_RX;
  huart6.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart6.Init.OverSampling = UART_OVERSAMPLING_16;
  huart6.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart6.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart6) != HAL_OK)
  {
    Error_Handler();
  }
}

void MX_USART6_UART_Init_57600(void)
{
  huart6.Instance = USART6;
  huart6.Init.BaudRate = 57600; // change from 9600 to 57600
  huart6.Init.WordLength = UART_WORDLENGTH_8B;
  huart6.Init.StopBits = UART_STOPBITS_1;
  huart6.Init.Parity = UART_PARITY_NONE;
  huart6.Init.Mode = UART_MODE_TX_RX;
  huart6.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart6.Init.OverSampling = UART_OVERSAMPLING_16;
  huart6.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart6.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart6) != HAL_OK)
  {
    Error_Handler();
  }
}

int Change_UART(void)
{
  HAL_UART_DeInit(&huart6);
  MX_USART6_UART_Init_57600();

}

我调用了Change_UART(),但它不起作用。

EN

回答 4

Stack Overflow用户

发布于 2019-11-21 16:19:17

您的问题应该是:如何使用膨胀软件HAL更改波特率?

我不知道。

但它可以在3行简单的代码中归档。

代码语言:javascript
运行
复制
USART6 -> CR1 &= ~(USART_CR1_UE);
USART6 -> BRR = NEWVALUE;
USART6 -> CR1 |= USART_CR1_UE;
票数 6
EN

Stack Overflow用户

发布于 2020-07-14 19:51:25

要更改波特率,您不需要重置UART外设,只需停止任何活动的传输(轮询/IT/DMA)。我混合使用这两种方法:

代码语言:javascript
运行
复制
huart.Instance->BRR = UART_BRR_SAMPLING8(HAL_RCC_GetPCLK2Freq(), new_baudrate);

其中UART_BRR_SAMPLING8()是来自stm32f4xx_hal_uart.h的宏,HAL_RCC_GetPCLK2Freq()函数来自_hal_rcc.c。

这样,我不必手动计算BRR值,也不必执行整个初始化过程,这实际上会切换GPIO状态,从而在串行线上为位于其另一端的任何东西产生噪声。

票数 2
EN

Stack Overflow用户

发布于 2020-03-15 06:09:39

最初我真的对P_J__的简单答案感到兴奋,但事实证明你不能简单地将所需的波特率放入BRR -它必须是过采样和时钟频率的函数。

我使用了大致相同的方法,但使用了"LL_USART_SetBaudRate“来填充寄存器

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57283327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档