6

我正在使用STM32F746ZG和使用五个UARTs. All UARTs工作正常。USART有人可以告诉我在初始化后更改波特率的程序吗?我正在使用波特率USART6并对其进行初始化。9600启动后,没有任何通过USART. 我想将波特率从9600 to 57600 or 115200. 对于这种变化,我打电话给HAL_UART_DeInit()MX_USART6_UART_Init_57600()它不起作用。如果我没有改变波特率,它工作正常。但是如果我改变波特率,我就无法接收数据USART. 如果有人知道解决方案,请告诉我。

以下是我的代码。

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(),但它不起作用。

4

4 回答 4

6

您的问题应该是:如何使用英国媒体报道 HAL 更改 bautrate?

我不知道。

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

USART6 -> CR1 &= ~(USART_CR1_UE);
USART6 -> BRR = NEWVALUE;
USART6 -> CR1 |= USART_CR1_UE;
于 2019-11-21T08:19:17.333 回答
3

要更改波特率,您无需重置 UART 外围设备,只需停止任何活动传输(轮询/IT/DMA)。我混合使用两者:

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 状态,从而在串行线路的另一端产生噪声。

于 2020-07-14T11:51:24.763 回答
0

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

我使用或多或少相同的方法,但使用“LL_USART_SetBaudRate”来填充寄存器

于 2020-03-14T22:09:39.210 回答
0

您必须中止所有正在运行的HAL_UART功能,然后取消初始化 uart,更改波特率初始化值并再次初始化:

  1. HAL_UART_Abort_IT(&huart1);
    
  2. HAL_UART_DeInit(&huart1);
    
  3. huart1.Init.BaudRate = 57600;
    
  4. if (HAL_UART_Init(&huart1) != HAL_OK) {
        Error_Handler();
    }
    
  5. if (HAL_UART_Receive_IT(&huart1, BUFFER, YOUR_BUFFER_SIZE) != HAL_OK) {
        Error_Handler();
    }
    
于 2021-03-30T15:04:55.197 回答