本篇记录在 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)生成后的工程目录可以看到:MakefileDriversSrcInc等文件,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

Logo

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

更多推荐