STM32串口通信实验
配置STM32CubeMX
在 Pinout&Configuration 栏目的 System Core 下,先点击 SYS,再勾选 Serial Wire 框,配置好 SWD 下载引脚设置。

配置外部时钟源


配置 PB6,PB7 为 USART1 收发引脚。

完成后生成代码
编辑代码
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t Transmit_data[] = {"World_Skills_Competition\r\n"}; // 定义需要发送的字符串
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init(); // HAL 库初始化
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config(); // 时钟初始化
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init(); // GPIO 初始化
MX_USART1_UART_Init(); // 串口初始化
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_UART_Transmit(&huart1, Transmit_data, sizeof(Transmit_data)+1, 1000); // 发送字符串
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
编译下载后,使用TTL转USB模块连上电脑后用串口助手就可以查看发送的信息。
printf()重定向实验
对于 STM32 来说,串口是一种常用的调试手段,在程序中加入串口调试语句,可以降低程序调试的难度。
通过使用串口作为printf()函数的输出对象,使得在程序中可以用printf()来发送串口数据,就像在 PC 上用 C 语言控制台编程一样。
首先在usart.h中加入以下代码:
/* USER CODE BEGIN Includes */
#ifndef UART_PRINTF_H
#define UART_PRINTF_H
#include <stdio.h>
void UART_Printf_Init(UART_HandleTypeDef *huart);
#endif /* UART_PRINTF_H */
/* USER CODE END Includes */
然后在usart.c中添加以下代码:
/* USER CODE BEGIN 0 */
static UART_HandleTypeDef *debug_uart; // Store UART handle
// Initialize UART for printf redirection
void UART_Printf_Init(UART_HandleTypeDef *huart)
{
debug_uart = huart; // Assign the UART handle
}
// Redirect printf() output to UART
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(debug_uart, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
// Redirect scanf() input from UART (optional)
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(debug_uart, &ch, 1, HAL_MAX_DELAY);
return ch;
}
/* USER CODE END 0 */
修改main函数
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
UART_Printf_Init(&huart1); // 初始化printf重定向
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
printf("Hello STM32\r\n");
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
点击Keil5中的这个图标


修改完成后编译下载,运行程序即可在串口助手中看到信息。