什么是串口
串行通信接口:指按位发送和接收的接口,如RS232/422/485
RS232电平和COMS/TTL电平对比
RS232电平:逻辑1:-15V ~ -3V 逻辑0:+3V ~ +15V
CMOS电平: 逻辑1:3.3V 逻辑0:0V (STM32使用)
TTL电平:逻辑1:5V 逻辑0:0V (51单片机使用)
备注:因为电压不同,所以CMOS/TTL是不能是直接与RS232交换信息,需要电平转换芯片进行电压转换。 如3.3V可以使用MAX323/SP3232转换芯片, 如果是5V可以使用MAX232转换芯片
USART/UART异步通信配置步骤
一、配置串口工作参数、开启串口异步接收中断
使用HAL库接口HAL_UART_Init(); HAL_UART_Receive_IT();
#define RXBUFFERSIZE 1
UART_HandleTypeDef g_uart1_handle; /* UART句柄 */
uint8_t g_rx_buffer[RXBUFFERSIZE] = {0}; //接收缓冲区
void usart_init(uint32_t baudrate)
{g_uart1_handle.Instance = USART1;g_uart1_handle.Init.BaudRate = baudrate; //波特率g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; //字长为8位数据格式g_uart1_handle.Init.StopBits = UART_STOPBITS_1; //一个停止位g_uart1_handle.Init.Parity = UART_PARITY_NONE; //无奇偶校验位g_uart1_handle.Init.Mode = UART_MODE_TX_RX; //收发模式g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; //无硬件流控HAL_UART_Init(&g_uart1_handle); //HAL_UART_Init()会使能UART1/* 该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量 */HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);}
二、串口底层初始化
使用HAL库接口:HAL_UART_MspInit() 配置GPIO/NVIC/CLOCK等
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{GPIO_InitTypeDef gpio_init_struct;if (huart->Instance == USART1){
// __HAL_RCC_USART1_CLK_ENABLE(); //HAL_UART_Init()中已经使能了USART1的时钟__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA的时钟gpio_init_struct.Pin = GPIO_PIN_9; //PA9 Txgpio_init_struct.Mode = GPIO_MODE_AF_PP; //推挽复用输出gpio_init_struct.Pull = GPIO_PULLUP; //下拉,因为时钟空闲是低电平gpio_init_struct.Speed = GPIO_SPEED_FREQ_LOW; //低速gpio_init_struct.Alternate = USART_TX_GPIO_AF; //复用为USART1的TXHAL_GPIO_Init(GPIOA, &gpio_init_struct);gpio_init_struct.Pin = GPIO_PIN_10; //PA10 Rx
// gpio_init_struct.Mode = GPIO_MODE_INPUT; //输入
// gpio_init_struct.Pull = GPIO_PULLUP; //上拉gpio_init_struct.Speed = GPIO_SPEED_FREQ_LOW; //低速gpio_init_struct.Alternate = USART_RX_GPIO_AF; //复用为USART1的RXHAL_GPIO_Init(GPIOA, &gpio_init_struct);}}
三、设置优先级、使能中断
使用HAL接口:HAL_NVIC_SetPriority(); HAL_NVIC_EnableIRQ();
HAL_NVIC_SetPriority(USART1_IRQn, 2, 0); //设置优先级HAL_NVIC_EnableIRQ(USART1_IRQn); //使能中断
四、编写中断服务函数
使用接口:USARTx_IRQHandler(); UARTx_IRQHandler();
五、串口数据发送
USART DR(数据发送寄存器) 、HAL_UART_Transmit();