一般情况下,STM32串口使用固定的波特率等参数进行通信,为了灵活适配各种应用场景,增加在线485方式修改串口参数功能,且串口的相关参数保存在EEPROM中,保证下次断电重启时修改的参数有效。芯片型号:STM32L431CCT6;使用HAL库开发。
串口原有固定波特率配置如下:
UART1_Handler.Instance=USART1;
UART1_Handler.Init.BaudRate=9600;
UART1_Handler.Init.WordLength=UART_WORDLENGTH_9B;
UART1_Handler.Init.StopBits=UART_STOPBITS_1;
UART1_Handler.Init.Parity=UART_PARITY_EVEN;
UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;
UART1_Handler.Init.Mode=UART_MODE_TX_RX;
if (HAL_UART_Init(&UART1_Handler) != HAL_OK)
{
Error_Handler(__FILE__, __LINE__);
}
CLEAR_BIT(USART1->ISR, USART_ISR_TC); /* 清除TC发送完成标志 */
CLEAR_BIT(USART1->ISR, USART_ISR_RXNE); /* 清除RXNE接收标志 */
SET_BIT(USART1->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE); /* 使能PEIE, RX接受中断 */
在线修改串口参数时使用以下配置(在串口接收协议中处理),需要注意的地方主要是先失能串口__HAL_UART_DISABLE(&UART1_Handler);,初始化之后再使能__HAL_UART_ENABLE(&UART1_Handler);
__HAL_UART_DISABLE(&UART1_Handler);
UART1_Handler.Instance=USART1;
UART1_Handler.Init.BaudRate=baud_rate;
UART1_Handler.Init.WordLength=pdata_len;
UART1_Handler.Init.StopBits=stopbit_len;
UART1_Handler.Init.Parity=aParity;
UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;
UART1_Handler.Init.Mode=UART_MODE_TX_RX;
if (HAL_UART_Init(&UART1_Handler) != HAL_OK)
{
Error_Handler(__FILE__, __LINE__);
}
__HAL_UART_ENABLE(&UART1_Handler);
CLEAR_BIT(USART1->ISR, USART_ISR_TC); /* 清除TC发送完成标志 */
CLEAR_BIT(USART1->ISR, USART_ISR_RXNE); /* 清除RXNE接收标志 */
SET_BIT(USART1->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE); /* 使能PEIE, RX接受中断 */