一、引言

在嵌入式开发领域,串口通信是极为常用的功能,而Printf函数能便捷地将数据经串口输出,便于调试与信息交互。本文将围绕如何运用 STM32CubeMX 配置 STM32F4xx 的 USART,并在 Keil 编译器中编写Printf函数展开详细讲解,助力正在学习 STM32 开发的小伙伴。

二、开发环境准备

  1. 硬件准备:准备一块 STM32F4 系列开发板,确保开发板供电正常,且串口引脚已正确连接到电脑(通常需借助 USB 转串口模块)。
  1. 软件准备
    • 安装 STM32CubeMX 软件,安装 Keil MDK-ARM,
    • 安装相应的 STM32F4 系列器件支持包,在 STM32CubeMX 和 Keil 中都要确保已安装对应型号的器件支持包,以保证芯片资源能被正确识别。

三、STM32CubeMX 配置 USART

  1. 新建工程

打开 STM32CubeMX,点击 “File” -> “New Project”,在弹出的芯片选择窗口中,选择对应的 STM32F4xx 型号,例如STM32F407ZGT6,然后点击 “Start Project”。

第一步:

第二步:

第二步:

  1. 配置时钟树

依据开发板的晶振情况配置时钟树,一般开发板采用外部 8MHz 晶振,通过时钟树配置将系统时钟设为 168MHz。具体操作是在 “Clock Configuration” 界面中,设置 PLL 相关参数,使 HCLK 达到 168MHz,配置完成后查看时钟树连接情况,确保时钟配置无误。

  1. 配置 USART
    • 在 “Pinout & Configuration” 选项卡中,找到 “Connectivity” -> “USART1”(这里以 USART1 为例,也可选择其他 USART),点击选择 “Mode” 为 “异步通信 (Asynchronous)”。
    • 配置 USART1 的波特率,一般设为 115200bps,数据位 8 位,奇偶校验为无校验,流控制为无流控制,停止位 1 位,这些参数可按需调整。
    • 配置完成后,STM32CubeMX 会自动分配相应的 GPIO 引脚作为 USART 的 TX(发送)和 RX(接收)引脚,例如 USART1 的 TX 引脚为 PA9,RX 引脚为 PA10,确保这些引脚未被其他外设复用。
  1. 生成代码

在 “Project Manager” 选项卡中,设置工程名称、存储路径,选择 “Toolchain / IDE” 为 “MDK-ARM”。然后点击 “Code Generator” 选项卡,勾选 “Generate peripheral initialization as a pair of '.c/.h' files per peripheral”,这样生成的代码结构更清晰,便于管理和修改。最后点击 “Generate Code” 按钮,等待代码生成完毕。

四、Keil 中编写 Printf 函数

  1. 打开工程

在 Keil 中打开 STM32CubeMX 生成的工程文件(.uvprojx)。

  1. 重定向fputc函数

在工程中找到main.c文件,添加以下代码:

#include "stdio.h"
/* USER CODE BEGIN 0 */
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}
/* USER CODE END 0 */

上述代码重定向了fputc函数,HAL_UART_Transmit函数用于通过 USART 发送一个字节的数据,&huart1是在stm32f4xx_hal_msp.c中初始化好的 USART1 句柄,通过重定向fputc函数,Printf函数便可利用 USART 进行数据输出。

3. 使用Printf函数

在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 */
  printf("Hello, STM32F4!\r\n");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

上述代码中,printf("Hello, STM32F4!\r\n");语句会通过配置好的 USART1 将字符串发送出去。

五、编译与调试

  1. 编译工程

在 Keil 中点击 “Rebuild All” 按钮,对工程进行编译,若代码无语法错误,编译将顺利通过,生成可执行文件。
工程配置中勾选微型库 MicroLib

   2. 调试与验证

将开发板通过调试器(如 ST-Link)连接到电脑,在 Keil 中点击 “Debug” 按钮进入调试模式。在调试模式下,全速运行程序,使用串口调试助手(如 XCOM、SSCOM 等),选择对应的串口号(根据 USB 转串口模块的驱动分配的端口号),设置波特率为 115200bps,打开串口,此时应能在串口调试助手中看到输出 “Hello, STM32F4!” 字符串,表明Printf函数通过 USART 配置成功。

通过 STM32CubeMX 配置 USART 和在 Keil 中重定向fputc函数,成功实现了Printf函数经串口输出数据的功能。该方法在嵌入式开发调试过程中实用性强,能方便输出各类变量值与调试信息。

希望本教程能助大家更好掌握 STM32 的串口通信开发,若实践中遇到问题,欢迎在评论区留言交流。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐