STM32是一系列由STMicroelectronics开发的微控制器,它内置了串口通信功能,可以用于实现与其他设备或模块的通信。本文将详细介绍如何使用STM32实现简单的串口通信。
-
硬件准备 首先,我们需要准备一块STM32开发板,例如STM32F103C8T6,以及一台计算机和一根USB数据线。将STM32开发板与计算机连接,确保驱动程序正确安装。
-
工程创建 使用CubeMX软件创建一个新的工程。选择对应的STM32型号,然后通过可视化界面配置GPIO和串口参数。在GPIO配置中,将一个GPIO引脚设置为“USART”功能,并将其设置为“Tx”(发送)模式;将另一个GPIO引脚设置为“USART”功能,并将其设置为“Rx”(接收)模式。在串口配置中,选择波特率、数据位、停止位和奇偶校验等参数。点击“生成代码”按钮生成工程代码。
-
初始化串口 打开生成的工程代码,找到
main.c
文件。在文件开头包含必要的头文件:
#include "main.h"
#include "usart.h"
在main()
函数中,添加以下代码来初始化串口:
/* Initialize USART */
MX_USART1_UART_Init();
这将调用自动生成的MX_USART1_UART_Init()
函数,该函数通过调用HAL_UART_Init()
函数来初始化USART1串口。
- 发送数据 要发送数据,可以使用
HAL_UART_Transmit()
函数。在main()
函数中添加以下代码:
/* Send data */
char sendData[10] = "Hello\r\n";
HAL_UART_Transmit(&huart1, (uint8_t*)sendData, strlen(sendData), HAL_MAX_DELAY);
该代码将字符串“Hello\r\n”发送到USART1。HAL_UART_Transmit()
函数接受四个参数:UART句柄、发送缓冲区、数据长度和超时时间。
- 接收数据 要接收数据,可以使用
HAL_UART_Receive()
函数。在main()
函数中添加以下代码:
/* Receive data */
char recvData[10];
HAL_UART_Receive(&huart1, (uint8_t*)recvData, sizeof(recvData), HAL_MAX_DELAY);
该代码从USART1接收数据并将其存储在recvData
缓冲区中。HAL_UART_Receive()
函数接受四个参数:UART句柄、接收缓冲区、数据长度和超时时间。
- 中断接收数据 除了使用
HAL_UART_Receive()
函数以轮询方式接收数据外,还可以使用中断方式。首先,需要启用串口的接收中断功能。在main.c
文件中找到MX_USART1_UART_Init()
函数,将以下代码添加到函数开头:
/* Enable USART1 RX interrupt */
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
然后,在main.c
文件中找到以下函数:
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
将接收数据的代码添加到USART1_IRQHandler()
函数中:
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
char recvData[10];
HAL_UART_Receive_IT(&huart1, (uint8_t*)recvData, sizeof(recvData));
/* USER CODE END USART1_IRQn 1 */
}
现在,当USART1接收到数据时,将触发USART1的中断,USART1_IRQHandler()
函数将被调用,并调用HAL_UART_Receive_IT()
函数以中断方式接收数据。
- 中断接收数据的处理 在上一步中,我们已经设置了中断接收数据的功能。要处理接收到的数据,需要在
main.c
文件中找到以下函数并添加处理代码:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* USER CODE BEGIN HAL_UART_RxCpltCallback 0 */
/* USER CODE END HAL_UART_RxCpltCallback 0 */
if (huart->Instance == USART1)
{
/* Process received data */
/* ... */
}
/* USER CODE BEGIN HAL_UART_RxCpltCallback 1 */
/* USER CODE END HAL_UART_RxCpltCallback 1 */
}
在上面的代码中,可以添加处理接收数据的代码,例如将接收到的数据打印到终端。
至此,我们已经完成了STM32实现简单串口通信的代码编写。可以通过CubeMX生成的代码来构建工程,并通过调试器将程序烧录到STM32开发板上进行测试。