一、使用 VSCode 开发 STM32C542RC 的开发过程
使用VScode 开发STM32C542RC开发板,分享开发过程。
二、串口2(USART2)的基本内容
2.1 什么是 USART
USART 是通用同步/异步收发器(Universal Synchronous/Asynchronous Receiver/Transmitter)的缩写,是 STM32 中最常用的通信外设之一,支持异步全双工串行通信,也就是常说的串口。USART 与 UART 的区别在于,USART 在异步模式基础上还支持同步时钟输出,可用于类似 SPI 的同步通信,但日常使用中两者习惯上都统称为串口。
2.2 USART2 的硬件资源与引脚
STM32C542 属于 STM32C5 系列,该系列最多提供 3 路 USART、2 路 UART 和 1 路 LPUART,具体型号的串口数量以数据手册为准。其中 USART2 是常用的调试串口,在 NUCLEO-C542RC 开发板上,USART2 的发送引脚为 PA2(USART2_TX),接收引脚为 PA3(USART2_RX)。需要特别说明的是,这块开发板的板载 STLINK-V3EC 调试器的虚拟串口(VCP)正是通过电阻 R52、R53 和焊桥 SB26、SB12 连接到 PA2、PA3 的。也就是说,只要用 USB 线把开发板连接到电脑,USART2 的收发数据就可以直接通过 ST-Link 的虚拟串口在电脑上收发,无需额外外接 USB 转 TTL 模块。
2.3 USART2 的主要特性
USART2 具备完整的串口特性。支持全双工异步通信。支持可编程波特率发生器,波特率可以精确到小数,最高速率与串口时钟频率有关。支持 8 位或 9 位数据长度、可选奇偶校验、1 位或 2 位停止位。支持中断与 DMA 传输,收发大量数据时可以减轻 CPU 负担。此外还支持多机通信、LIN、智能卡、红外(IrDA)以及硬件流控(RTS/CTS)等扩展功能。对于入门调试来说,最常用的就是异步模式、8 位数据、无校验、1 位停止位的组合。
2.4 串口通信的关键参数
串口异步通信双方必须约定完全一致的参数才能正常通信,主要包括四个参数。波特率,即每秒传输的码元个数,常用值为 9600、115200 等。数据位,通常为 8 位。停止位,通常为 1 位。校验位,通常为无校验。习惯上写成 115200-8-N-1 这样的格式。本文后续示例统一使用 115200、8 位数据、无校验、1 位停止位。
三、STM32CubeMX2 配置过程
3.1 新建工程并选择器件
打开 STM32CubeMX2 软件,在主界面选择从开发板新建工程(Board Selector)或从芯片新建工程(MCU Selector)。如果使用开发板入口,在搜索框中输入 NUCLEO-C542RC 并选中,软件会自动载入对应的板级配置;如果使用芯片入口,在器件搜索框中输入 STM32C542RC,选中后点击 Start Project 即可。两种方式都会生成一个初始工程。
3.2 配置系统时钟
进入工程后,首先在 Clock Configuration(时钟配置)页面配置时钟树。NUCLEO-C542RC 板载晶振,可以在 RCC 配置中选择 HSE 外部高速时钟作为时钟源;如果外部晶振不可用,也可以选择内部高速时钟 HSI 或内部多速时钟 MSI。然后在时钟树页面把系统时钟 SYSCLK 配置到最高 144 MHz,并确认 USART2 所在的 APB 外设总线时钟满足要求,因为波特率的生成精度与串口时钟直接相关。
3.3 配置 USART2 外设
在左侧外设列表中找到 Connectivity(连接)分组下的 USART2,点击进入配置界面。在 Mode(模式)下拉框中选择 Asynchronous(异步模式),此时软件会自动在右侧引脚图中把 PA2、PA3 分配为 USART2 的发送和接收引脚。接着在 Configuration 的 Parameter Settings(参数设置)中配置以下参数。波特率 Baud Rate 填写 115200。数据位 Word Length 选择 8 Bits。校验位 Parity 选择 None。停止位 Stop Bits 选择 1。以上参数需要与电脑端串口助手的设置保持一致。
3.4 配置中断与 DMA
如果只是实现简单的串口发送,可以不配置中断和 DMA。如果需要接收数据,建议在 NVIC Settings 中勾选 USART2 global interrupt 使能串口中断;如果收发数据量大,可以在 DMA Settings 中为 USART2 的发送和接收分别添加 DMA 通道。对于本文介绍的串口输出功能,使用轮询方式已经足够。
3.5 工程设置与代码生成
配置完成后,进入 Project Manager(项目管理)页面。在 Project Settings 中填写工程名称,例如 USART2_Demo;设置工程保存路径;最关键的是在 Toolchain/IDE(工具链)一栏中选择 CMake,这样生成的工程才能直接导入 VSCode 编译,也可以选择 Open-CMSIS 等格式配合 IAR 或 Keil 使用。确认无误后点击右上角的 Generate Code(生成代码)按钮,STM32CubeMX2 会生成包含 HAL 库、启动文件和初始化代码的完整工程。
3.6 生成代码的结构
生成的工程目录中,Core/Src 目录存放 main.c、usart.c、gpio.c 等用户代码和初始化代码;Core/Inc 目录存放对应的头文件;Drivers 目录存放 HAL 库与 CMSIS 文件;工程根目录有 CMakeLists.txt 构建脚本。USART2 的初始化函数为 MX_USART2_UART_Init(),在 main.c 中被调用,后续编写串口输出代码就围绕它展开。
四、串口2实现串口输出功能与软件编写步骤
4.1 实现思路
实现串口输出的核心思路是:先用 HAL 库函数把要发送的数据通过 USART2 发送出去,再把标准库的 printf 函数重定向到 USART2,这样在代码中调用 printf 就可以方便地打印格式化的调试信息。发送数据使用 HAL_UART_Transmit() 函数,它以轮询方式等待发送完成。
4.2 printf 重定向的实现
第一步,在 main.c 顶部添加头文件包含语句 #include "stdio.h"。第二步,重写底层输出函数。在使用 GCC 工具链时,newlib 库的 printf 最终调用 _write() 函数,因此实现 int _write(int file, char *ptr, int len) 函数即可完成重定向,函数体内调用 HAL_UART_Transmit(&huart2, (uint8_t *)ptr, len, HAL_MAX_DELAY),并返回 len。这样 printf 的所有输出都会从 USART2 的 PA2 引脚发出。第三步,在工程的编译选项中启用 newlib-nano 与 nosys 规范,CMake 工程的链接选项中通常加入 --specs=nano.specs 和 --specs=nosys.specs,STM32CubeMX2 生成的工程默认已经包含。
4.3 主程序编写步骤
在主函数 main 中按如下步骤编写。首先确认 MX_USART2_UART_Init() 已经被调用,串口初始化完成。然后在 while 主循环中调用 printf 打印固定字符串,例如 printf("Hello STM32C542rn");也可以打印带格式参数的变量,例如 printf("value = %drn", value)。为了让输出节奏清晰,在每次打印后调用 HAL_Delay(1000) 延时 1 秒。代码保存后,在 VSCode 中执行构建,生成固件。
4.4 编译、下载与验证
编译通过后,把固件下载到开发板。下载完成后,在电脑的设备管理器中找到 ST-Link 虚拟串口对应的 COM 端口号。打开任意串口调试助手或串口终端软件,选择该 COM 口,设置波特率 115200、数据位 8、停止位 1、无校验,点击打开串口。给开发板复位或重新上电后,可以看到串口终端每隔 1 秒打印一次 Hello STM32C542,说明串口输出功能实现成功。如果没有输出,按下文第五章的注意事项逐项排查。
我要赚赏金
