Linux 搭建 STM32 开发环境,Makefile 实现串口打印 hello qn
本篇记录在 Ubuntu22.04 虚拟机下,使用 STM32CubeMX 生成 Makefile 工程,搭配 ARM 交叉编译器、OpenOCD 完成编译、烧录,最终实现串口打印 hello qn
前置条件
(1)已经完成 Ubuntu 虚拟机配置 Samba 共享 + SSH 远程连接,Windows 可以访问 Ubuntu 的共享文件夹,使用 WindTerm 远程登录 Ubuntu 终端;
配置教程链接:Ubuntu 配置 Samba 共享 + SSH 远程连接(Windows 访问 Linux 文件与终端)-CSDN博客
(2)会基础使用 STM32CubeMX;
(3)硬件:STM32F103C8T6 开发板、ST‑Link 调试器;如果是 ST‑Link2.0 需要额外 CH340 串口模块;ST‑Link2.1 自带虚拟串口无需额外串口。
1. Ubuntu 安装开发所需工具链
我们需要:ARM 交叉编译器(编译 STM32 裸机程序)、gdb 调试工具、OpenOCD(通过 ST‑Link 烧写调试芯片)、make 构建工具、screen 串口工具。
(1) 打开 WindTerm 通过 SSH 连接 Ubuntu,执行下面命令:
# 更新软件源列表,升级系统软件包
sudo apt update && sudo apt upgrade -y
# ARM交叉编译器 + gdb多架构调试工具
sudo apt install gcc-arm-none-eabi gdb-multiarch -y
# OpenOCD:开源片上调试工具,用来驱动ST‑Link下载程序到单片机
sudo apt install openocd -y
# make编译工具
sudo apt install make cmake -y
# screen,ubuntu下的串口终端工具
sudo apt install screen
(2)解决 ST‑Link USB 权限问题(udev 规则)
默认普通用户没有访问 ST‑Link USB 设备权限,直接 OpenOCD 会报权限错误。配置 udev 规则放开 USB 设备权限。
# 创建udev规则文件
sudo nano /etc/udev/rules.d/99-stlink.rules
粘贴下面内容:
SUBSYSTEM=="usb",ATTRS{idVendor}=="0483",ATTRS{idProduct}=="3748",MODE="0666" SUBSYSTEM=="usb",ATTRS{idVendor}=="0483",ATTRS{idProduct}=="374b",MODE="0666"
说明:0483 是 ST 公司的 USB 厂商 ID,3748/374b 是不同版本 ST‑Link 的设备 ID,MODE="0666"代表所有用户可读可写该 USB 设备。
Ctrl+O 回车保存,Ctrl+X退出 nano 编辑器。
配置完如图(cat命令为查看文件内容):

重载 udev 规则使其生效:
sudo udevadm control --reload-rules
sudo udevadm trigger
2. Windows 端 STM32CubeMX 生成 Makefile 工程
(1)新建工程,选择芯片STM32F103C8T6,配置 RCC 时钟、配置 USART1 串口,完成芯片基础外设配置;
进入Project Manager工程管理页面:

Project Location:工程路径选择 Samba 映射出来的 Ubuntu 共享盘路径;
Toolchain / IDE:选择 Makefile,不要选 MDK‑ARM;
点击GENERATE CODE生成代码。
(2)生成后的工程目录可以看到:Makefile、Drivers、Src、Inc等文件,Makefile就是 Ubuntu make 编译的入口文件。

(3)修改 main.c,添加 printf 串口重定向,在while(1)主循环里面添加打印代码。
注意:fputc做 printf 重定向,在 Makefile 工程中该方式无效,这里改用_write函数重定向。
用vscode或者其他编辑器打开工程,在main.c中加入如下内容:

#include "stdio.h"

int _write(int file, char *ptr, int len)
{
HAL_UART_Transmit(&huart1, (uint8_t *)ptr, len, 0xFFFF);
return len;
}
printf("hello qn\r\n");
HAL_Delay(1000);
Ubuntu 下 Make 编译工程
WindTerm SSH 终端 cd 进入工程目录,也就是存在 Makefile 的文件夹。

直接执行 make 编译:
make
编译成功后,会自动生成build目录,里面有.elf、.bin等固件文件。
xxx.elf:带调试信息固件,OpenOCD 烧录优先使用 elf;

3. OpenOCD 通过 ST‑Link 烧录程序到开发板
方案一:使用ST‑Link2.0 + CH340
ST‑Link 调试器:连接到虚拟机,OpenOCD 需要虚拟机识别 ST‑Link 硬件;

CH340 串口选择连接到 Windows 主机

然后在windterm中执行
sudo openocd -f interface/stlink.cfg -f target/stm32f1x.cfg -c "program build/001test.elf verify reset exit"
-f interface/stlink.cfg:选择调试器驱动为 ST‑Link;
-f target/stm32f1x.cfg:目标芯片配置文件,F1 系列芯片;
program build/001test.elf:烧录 elf 固件;
verify:烧录完成校验 flash 数据;
reset exit:复位单片机运行程序,完成后退出 openocd。

看到Verified OK代表烧录成功。
然后可以在windterm中打开串口或使用其他串口工具查看打印结果,Windterm串口设置如下,在协议中设置波特率:


方案二:使用 ST‑Link2.1(自带虚拟串口)
ST‑Link 只需要连接到虚拟机,串口会在 Ubuntu 下识别为/dev/ttyACM0,使用 screen 看串口输出。
执行烧录命令:
sudo openocd -f interface/stlink.cfg -f target/stm32f1x.cfg -c "program build/001test.elf verify reset exit"
然后在windterm中再开一个SSH窗口,执行
sudo screen /dev/ttyACM0 115200
看串口打印:

关闭串口命令,去执行烧录命令的窗口执行:
sudo killall screen
更多推荐




所有评论(0)