前言
在嵌入式系统中,串口通讯一直扮演着至关重要的角色。STM32微控制器系列内置了���个串口(USART)模块,能够支持多种串口通讯协议,如UART、SPI和I2C等。本文将深入探讨STM32串口通讯的基本概念,带你揭开串口通讯的神秘面纱,并通过代码示例展示其灵活性和实用性。
串口通讯的基本原理
串口通讯是通过串行数据传输来进行信息交换的一种通讯方式。它使用单条数据线(TX发送、RX接收)进行双向通讯,适用于各种嵌入式设备之间的通讯。STM32芯片内置了多个USART模块,可以轻松实现串口通讯功能。
初始化USART模块
配置GPIO引脚
在使用USART之前,首先需要初始化相关的GPIO引脚,以便连接到外部设备。
// 配置USART引脚
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10; // USART TX (PA9) and RX (PA10)
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
初始化USART
接下来,需要对USART模块进行初始化配置,包括波特率、数据位、停止位等。
// 初始化USART
UART_HandleTypeDef huart;
huart.Instance = USART1;
huart.Init.BaudRate = 9600;
huart.Init.WordLength = UART_WORDLENGTH_8B;
huart.Init.StopBits = UART_STOPBITS_1;
huart.Init.Parity = UART_PARITY_NONE;
huart.Init.Mode = UART_MODE_TX_RX;
huart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&huart);
发送和接收数据
发送数据
使用USART向外部设备发送数据非常简单,只需调用相应的发送函数即可。
uint8_t data_to_send[] = "Hello, STM32!";
HAL_UART_Transmit(&huart, data_to_send, strlen(data_to_send), HAL_MAX_DELAY);
接收数据
接收外部设备发送的数据同样便捷,只需调用接收函数即可。
uint8_t received_data[20];
HAL_UART_Receive(&huart, received_data, 20, HAL_MAX_DELAY);
示例:使用USART进行串口通讯
以下是一个简单的示例,演示如何在STM32上使用USART进行串口通讯。假设我们需要向外部设备发送数据并接收响应。
int main()
{// ... (其他初始化代码)// 配置GPIO引脚GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10; // USART TX (PA9) and RX (PA10)GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// 初始化USARTUART_HandleTypeDef huart;huart.Instance = USART1;huart.Init.BaudRate = 9600;huart.Init.WordLength = UART_WORDLENGTH_8B;huart.Init.StopBits = UART_STOPBITS_1;huart.Init.Parity = UART_PARITY_NONE;huart.Init.Mode = UART_MODE_TX_RX;huart.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart.Init.OverSampling = UART_OVERSAMPLING_16;HAL_UART_Init(&huart);// 发送数据uint8_t data_to_send[] = "Hello, STM32