我使用的是STM32F746ZG
和five 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()
,但它不起作用。
发布于 2019-11-21 16:19:17
您的问题应该是:如何使用膨胀软件HAL更改波特率?
我不知道。
但它可以在3行简单的代码中归档。
USART6 -> CR1 &= ~(USART_CR1_UE);
USART6 -> BRR = NEWVALUE;
USART6 -> CR1 |= USART_CR1_UE;
发布于 2020-07-14 19:51:25
要更改波特率,您不需要重置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-03-15 06:09:39
最初我真的对P_J__的简单答案感到兴奋,但事实证明你不能简单地将所需的波特率放入BRR -它必须是过采样和时钟频率的函数。
我使用了大致相同的方法,但使用了"LL_USART_SetBaudRate“来填充寄存器
https://stackoverflow.com/questions/57283327
复制相似问题