电机驱动开发学习10. FreeMaster的简单使用
- [一、FreeMASTER 简介](#一、FreeMASTER 简介)
-
- [1.1 什么是 FreeMASTER](#1.1 什么是 FreeMASTER)
- [1.2 为何在电机控制里用它](#1.2 为何在电机控制里用它)
- [1.3 与 VOFA+ / FireWater 的对比](#1.3 与 VOFA+ / FireWater 的对比)
- [1.4 本章范围(「简单使用」)](#1.4 本章范围(「简单使用」))
- 二、实验简介
-
- [2.1 本章目标](#2.1 本章目标)
- [2.2 与前后章节的关系](#2.2 与前后章节的关系)
- [2.3 硬件与工程说明](#2.3 硬件与工程说明)
- 三、软件准备
-
- [3.1 仅需安装上位机](#3.1 仅需安装上位机)
- [3.2 下位机工程要求](#3.2 下位机工程要求)
- [3.3 可选:串口驱动方案(本章不采用)](#3.3 可选:串口驱动方案(本章不采用))
- [3.4 FreeMASTER 上位机操作步骤(SWD 直连)](#3.4 FreeMASTER 上位机操作步骤(SWD 直连))
-
- [步骤 0:下位机准备](#步骤 0:下位机准备)
- [步骤 1:新建工程](#步骤 1:新建工程)
- [步骤 2:配置通信(CMSIS-DAP / SWD)](#步骤 2:配置通信(CMSIS-DAP / SWD))
- [步骤 3:加载符号文件(.axf)](#步骤 3:加载符号文件(.axf))
- [步骤 4:添加监视变量](#步骤 4:添加监视变量)
- [步骤 5:添加示波器(Scope)](#步骤 5:添加示波器(Scope))
- [步骤 6:连接并查看数据](#步骤 6:连接并查看数据)
- [步骤 7:在线改参(替代 lesson9 串口命令)](#步骤 7:在线改参(替代 lesson9 串口命令))
- [步骤 8:保存工程](#步骤 8:保存工程)
- 常见问题(上位机)
- [3.5 Plug-in module 列表为空 / register.bat 全失败怎么办](#3.5 Plug-in module 列表为空 / register.bat 全失败怎么办)
-
- [原因:64 位 Windows 上 register.bat 有坑](#原因:64 位 Windows 上 register.bat 有坑)
- [办法 1:用修正版注册脚本](#办法 1:用修正版注册脚本)
- [办法 1b:批处理显示全 OK,但列表仍为空(假成功)](#办法 1b:批处理显示全 OK,但列表仍为空(假成功))
- [办法 1c:`regsvr32` 全部 exit=5(拒绝访问)](#办法 1c:
regsvr32全部 exit=5(拒绝访问)) - [办法 2:手动写注册表(`regsvr32` 被禁时,推荐)](#办法 2:手动写注册表(
regsvr32被禁时,推荐)) - [办法 3:若仍失败 ------ 装 VC++ 运行库](#办法 3:若仍失败 —— 装 VC++ 运行库)
- [办法 4:确认插件文件存在](#办法 4:确认插件文件存在)
- [办法 5:列表恢复后选哪个插件](#办法 5:列表恢复后选哪个插件)
- 排查清单
- 四、下位机:全局监视变量
-
- [4.1 `g_fm_*` 变量一览](#4.1
g_fm_*变量一览) - [4.2 使用全局 + volatile](#4.2 使用全局 + volatile)
- [4.3 改参后自动清积分](#4.3 改参后自动清积分)
- [4.1 `g_fm_*` 变量一览](#4.1
- [五、上位机 FreeMASTER 工程配置总结](#五、上位机 FreeMASTER 工程配置总结)
-
- [5.1 建立连接](#5.1 建立连接)
- [5.2 变量监视(Watch)](#5.2 变量监视(Watch))
- [5.3 示波器(Scope)](#5.3 示波器(Scope))
- [5.4 在线改参](#5.4 在线改参)
- [5.5 工程文件保存](#5.5 工程文件保存)
- 六、程序设计
-
- [6.1 目录](#6.1 目录)
- [6.2 运行流程](#6.2 运行流程)
- [6.3 FreeMASTER 侧流程](#6.3 FreeMASTER 侧流程)
- 七、实验步骤
-
- [7.1 连通性验证](#7.1 连通性验证)
- [7.2 监视 PID 波形](#7.2 监视 PID 波形)
- [7.3 在线整定](#7.3 在线整定)

一、FreeMASTER 简介
1.1 什么是 FreeMASTER
- NXP 提供的免费实时调试与数据可视化工具
- 支持变量监视 、波形示波 、在线改参 、数据记录(Recorder)
- 通信方式多样:串口、CAN、USB,以及 SWD/JTAG 调试口直连(本章采用)
1.2 为何在电机控制里用它
- PID 整定、速度环调试需要实时看变量 、改 Kp/Ki/Kd,不必反复烧录
- 可同时监视多路 float(SP、反馈、PWM、三相电流、霍尔 RPM 等)
- 工业与汽车领域广泛使用,与 NXP 电机库生态配套
1.3 与 VOFA+ / FireWater 的对比
| 对比项 | VOFA+ FireWater(上一章) | FreeMASTER SWD 直连(本章) |
|---|---|---|
| 通信 | USART 主动 printf CSV |
调试口 SWD 直接读/写 RAM |
| 改参 | 串口命令 kp / t |
PC 端 Watch 窗口写变量 |
| 下位机移植 | FireWater 发送代码 | 零移植,无需 FreeMASTER 驱动 |
| 占串口 | 占用 USART1 | 不占串口 |
| 本章定位 | 快速看波形 | 掌握非侵入式专业调试 |
1.4 本章范围(「简单使用」)
- CMSIS-DAP / SWD 调试口直连(野火板载调试器)
- 变量监视(Watch) + 示波器曲线(Scope)
- 在线修改 PID 目标值与 Kp/Ki/Kd
- 暂不展开:串口 SCI 驱动移植、CAN、Recorder 高级触发、HTML 仪表盘
注意: 与 Keil 不能同时占用同一条 SWD:先退出 Keil Debug,再开 FreeMASTER
二、实验简介
2.1 本章目标
- 了解 FreeMASTER SWD 直连的工作方式(上位机读/写 RAM)
- 在 PC 端加载 Keil 编译的
.axf,建立 FreeMASTER 工程 - 实时监视 PID 相关变量(SP、ACT、OUT、P/I/D)
- 在 PC 端在线修改目标值与 Kp/Ki/Kd,观察阶跃响应
- 与上一章 FireWater 实验对照,理解两种调试路径的差异
2.2 与前后章节的关系
| 章节 | 内容 |
|---|---|
| lesson9(PID) | 位置式 PID + FireWater + 串口改参 |
| 本章 | 去掉 FireWater,全局变量 + FreeMASTER SWD 监视与改参 |
| lesson10(预告) | 无刷速度环:霍尔反馈 + PID,FreeMASTER 监视 RPM / PWM |
2.3 硬件与工程说明
- 实验平台:野火骄阳 F407 + 无刷驱动板
- 通信:SWD 调试口(板载 CMSIS-DAP / ST-Link,USB 接 PC)
- 工程基础:lesson9 工程改版 ------移除 VOFA+/FireWater,暴露
g_fm_*全局变量 - USART 本章未使用(改参走 FreeMASTER Watch)
- 注意:Keil 处于 Debug 会话时,FreeMASTER 无法连接 SWD,需先 Stop/Debug Out
三、软件准备
3.1 仅需安装上位机
- FreeMASTER 桌面端(建议 3.x)
- 不需要下载或移植嵌入式通信驱动
3.2 下位机工程要求
- 使用 本章 lesson10 工程 ,Keil 编译时保留 Debug 信息 (默认
-g,生成.axf) - 确认 Output 目录有
YH-F407.axf(路径示例:lesson10. FreeMaster的简单使用/Output/YH-F407.axf) - 监视变量已在代码中定义为全局
g_fm_*(见 4.1 节)
3.3 可选:串口驱动方案(本章不采用)
若将来需要 Recorder、脱离调试器现场调试,可再集成 NXP 串口 SCI 驱动。
3.4 FreeMASTER 上位机操作步骤(SWD 直连)
以下以 FreeMASTER 3.x 为例,界面与截图中的 New Project 一致。
步骤 0:下位机准备
- 用 Keil 打开
Project/Fire-F407.uvprojx,Rebuild 编译 - Download 烧录到板子,确认程序在跑(LED 等)
- 在 Keil 点 Stop 停止调试,关闭 Debug 会话(必须释放 SWD,否则 FreeMASTER 连不上)
- 板子 USB 保持连接(调试器 + 供电)
步骤 1:新建工程
- 打开 FreeMASTER(窗口标题类似
Project - FreeMASTER) - 若左侧 Project Tree 已有
New Project,可直接用;否则 File → New Project - 建议 File → Save Project As... 保存到本章目录,例如
freemaster_pid.pmp
步骤 2:配置通信(CMSIS-DAP / SWD)
-
菜单 Project → Options... (或选中
New Project右键 Properties) -
打开 Comm(Communication)选项卡
-
先选连接方式(很重要,很多人漏这一步):
- 选 Plug-in Module Interface(插件模块接口)单选按钮
- 不要选 Native RS232 Link / Direct Serial 等
-
此时 Plug-in module 下拉框才应出现内容,选:
- FreeMASTER CMSIS-DAP Communication Plug-in(野火板优先)
- 或 FreeMASTER BDM Communication Plug-in → Configure 里选 CMSIS-DAP
-
点 **Configure ** 选调试器、SWD、设备

-
点 OK 保存
若第 3 步选了 Plug-in Module Interface,但下拉框仍为空 → 见 3.6 节(COM 插件未进注册表)。

步骤 3:加载符号文件(.axf)
FreeMASTER 需要 .axf 才能按变量名解析地址。
-
仍在 Project → Options... 中,找到 Map file 页
-
浏览并选择:
lesson10. FreeMaster的简单使用/Output/YH-F407.axf

-
File format 选择 Binary ELF with DWARF debugging format.
-
点 View 按钮,点开后应能搜到
g_fm_setpoint、g_fm_pid等

- 点 确定
步骤 4:添加监视变量
- 菜单 Project → Variables...(或工具栏变量图标)
- 点 New 新建变量,从符号列表选择,或手动填写:
| 变量名(Name) | 符号 / 地址来源 | 类型 | 可写 |
|---|---|---|---|
| SP | g_fm_setpoint |
float | 是 |
| ACT | g_fm_actual |
float | 否 |
| ERR | g_fm_error |
float | 否 |
| OUT | g_fm_pid.output |
float | 否 |
| P | g_fm_pid.p_term |
float | 否 |
| I | g_fm_pid.i_term |
float | 否 |
| D | g_fm_pid.d_term |
float | 否 |
| Kp | g_fm_pid.kp |
float | 是 |
| Ki | g_fm_pid.ki |
float | 是 |
| Kd | g_fm_pid.kd |
float | 是 |

-
每个变量保存后,在 Project → Variables 列表中应能看到

-
选中 Project Tree 里的 New Project ,在属性 Watch 页把上述变量加入 Watched variables (或 Add 到 Watch 列表)

步骤 5:添加示波器(Scope)
-
在 Project Tree 中右键 New Project → Create OscilloScope
-
将新 Scope 命名为
PID(可选) -
打开 属性- Variables 页

-
把 SP、ACT、OUT (或 ERR、P、I、D)加入曲线通道 Graph Block

-
采样周期建议 50ms~100ms(SWD 带宽有限,不必过快)
步骤 6:连接并查看数据
- 点击工具栏绿色 GO! 按钮(或 Ctrl+G)
- Variable Watch 窗口应刷新数值:
SP(g_fm_setpoint)初值约 50ACT应随 PID 运算变化
- 切换到 Scope 视图,应看到曲线滚动
- 停止监视点红色 STOP

步骤 7:在线改参(替代 lesson9 串口命令)
在 Variable Watch 中双击可写变量修改数值:
| 目的 | FreeMASTER 操作 | 对应 lesson9 串口 |
|---|---|---|
| 改目标 | 写 SP = 30 或 70 |
t 30 / t 70 |
| 改 Kp | 写 Kp = 1.5 |
kp 1.5 |
| 纯 P | Ki=0, Kd=0,调 Kp |
ki 0 kd 0 |
| 清积分 | 一般自动处理 | r |
改 SP / Kp / Ki / Kd 后,下位机 fm_reset_on_param_change() 会自动 pid_reset()。

目标改为90,看变化:

步骤 8:保存工程
File → Save Project ,下次打开 .pmp 即可,无需重新配变量。
常见问题(上位机)
| 现象 | 处理 |
|---|---|
| Plug-in module 列表为空 | 见 3.5 / 3.6 节(COM 未注册或 regsvr32 被拦) |
| GO! 后无数据 / 连接失败 | Keil 是否已 Stop;USB 调试线是否插对接口 |
找不到 g_fm_* 符号 |
重新选最新 .axf;确认编译的是 lesson10 工程 |
| 数值不变 | 程序是否在跑;变量名是否拼错 |
| Watch 可写但板子无反应 | 确认写的是 RAM 变量且程序主循环在运行 |
更细的变量说明见第四节;实验对照见第七节。
3.5 Plug-in module 列表为空 / register.bat 全失败怎么办
FreeMASTER 的通信插件是 Windows COM 组件,必须注册进系统后才会出现在下拉列表。
原因:64 位 Windows 上 register.bat 有坑
官方 D:\NXP\FreeMASTER 3.2\FreeMASTER\register.bat 对所有 DLL 都调用 regsvr32 ,在 64 位管理员 CMD 里默认走的是 64 位 System32\regsvr32.exe。
但多数插件 DLL 是 32 位的,例如:
| DLL | 位数 | 应使用的 regsvr32 |
|---|---|---|
mcbobjps.dll、mcbpgi.dll |
32-bit | C:\Windows\SysWOW64\regsvr32.exe |
plugins\bdm\bdmpgi.dll(BDM/CMSIS-DAP 插件) |
32-bit | 同上 |
mcbobjps64.dll、mmaster64.dll |
64-bit | C:\Windows\System32\regsvr32.exe |
用错位数就会全部显示 Error registering xxx.dll,Plug-in 列表为空。
pcmaster.exe /RegServer和mcbsvr.exe /RegServer没报错是正常的;失败的是后面的regsvr32步骤。
办法 1:用修正版注册脚本
lesson10. FreeMaster的简单使用/tools/register_freemaster_win64.bat
- 确认
FM=D:\NXP\FreeMASTER 3.2\FreeMASTER路径正确 - 右键 → 以管理员身份运行 (建议用
SysWOW64\cmd.exe,不要用 PowerShell) - 脚本末尾会 自动检查 Enum ;若报
[FAIL] Enum key missing则注册未真正成功 - 完全关闭 FreeMASTER 后重开 → Comm 里选 Plug-in Module Interface
若
regsvr32全部 exit=5,见 3.6 节(公司域策略 / 手动注册)。
办法 1b:批处理显示全 OK,但列表仍为空(假成功)
旧版脚本曾用 rundll32 DllRegisterServer 作兜底:exit=0 也可能不写注册表 ,于是打印 [ OK -32],列表仍空。
真实判定标准 ------必须用 32 位 reg.exe(FreeMASTER 是 32 位程序):
bat
C:\Windows\SysWOW64\reg.exe query "HKCR\Component Categories\{48A185C0-FFDB-11d3-80E3-00C04F176153}\Enum"
用 64 位
reg query查同一项可能误报「找不到」,不代表真的没注册。
- Enum 不存在 → 插件未注册,列表必空
- Enum 下有若干
{GUID}→ 重启 FreeMASTER 后下拉框应有插件名
办法 1c:regsvr32 全部 exit=5(拒绝访问)
通常是 公司域策略 / 杀毒 拦截 regsvr32,与是否管理员无关。
实测:即使用计划任务 HIGHEST 权限,jscript.dll 的 regsvr32 也会 exit=5。
手动单颗注册(不要加 /s,会弹窗):
bat
cd /d "D:\NXP\FreeMASTER 3.2\FreeMASTER"
set PATH=D:\NXP\FreeMASTER 3.2\FreeMASTER;D:\NXP\FreeMASTER 3.2\FreeMASTER\plugins\bdm;%PATH%
C:\Windows\SysWOW64\regsvr32.exe plugins\bdm\bdmpgi.dll
弹窗 Access denied 时,按 3.6 节 走 手动写注册表;个人电脑可试关 Defender / 加排除项后重试。
办法 2:手动写注册表(regsvr32 被禁时,推荐)
当 regsvr32 被策略拦截时,用 SysWOW64\reg.exe 直接写入 32 位 COM 注册表(绕过 regsvr32):
lesson10. FreeMaster的简单使用/tools/register_freemaster_manual.bat
- 确认 bat 顶部
FM=路径正确 - 右键 → 以管理员身份运行 (建议
SysWOW64\cmd.exe) - 脚本会注册 bdmpgi / mcbpgi / focpgi / jtagpgi 共 15 个插件,并打印 Enum 验证结果
- 完全退出 FreeMASTER → 重开 → Comm 选 Plug-in Module Interface
本章 STM32 实验选:FreeMASTER CMSIS-DAP Communication Plug-in(或 P&E Micro 里 Build 选 CMSIS-DAP)。
办法 3:若仍失败 ------ 装 VC++ 运行库
插件依赖 Visual C++ 运行库,请安装:
- Microsoft Visual C++ 2015-2022 Redistributable x86
- Microsoft Visual C++ 2015-2022 Redistributable x64
装完后再跑 办法 1 的脚本。
办法 4:确认插件文件存在
FreeMASTER 3.2 的通信插件在(注意是小写 plugins):
D:\NXP\FreeMASTER 3.2\FreeMASTER\plugins\bdm\bdmpgi.dll
D:\NXP\FreeMASTER 3.2\FreeMASTER\plugins\bdm\CMSIS_DAP.dll
这些文件存在只说明安装完整 ;列表仍要注册 bdmpgi.dll 后才出现。
办法 5:列表恢复后选哪个插件
| Plug-in 名称 | 说明 |
|---|---|
| FreeMASTER CMSIS-DAP Communication Plug-in | 本章推荐;Build 里选 CMSIS-DAP |
| FreeMASTER P&E Micro Communication Plug-in | 备选;Build 里选 CMSIS-DAP 或 ST-Link |
排查清单
□ Comm 页选了 Plug-in Module Interface(不是 RS232)
□ 用 SysWOW64\reg.exe 查 Enum 是否有插件(见 3.6)
□ regsvr32 失败时改跑 tools/register_freemaster_manual.bat
□ 已装 VC++ 2015-2022 x86 + x64
□ 完全退出后重启 FreeMASTER
四、下位机:全局监视变量
4.1 g_fm_* 变量一览
本章在 User/freemaster/bsp_fm_vars.h 声明、在 bsp_pid_app.c 定义全局变量 (带 volatile),供 FreeMASTER 加载 .axf 后直接 Watch:
| FreeMASTER 符号名 | 含义 |
|---|---|
g_fm_setpoint |
目标值 SP(可写) |
g_fm_actual |
被控对象输出 ACT |
g_fm_error |
误差 ERR = SP − ACT |
g_fm_pid.kp / ki / kd |
PID 参数(可写) |
g_fm_pid.output |
PID 输出 OUT |
g_fm_pid.p_term / i_term / d_term |
P/I/D 分项 |
g_fm_plant.y |
与 g_fm_actual 相同,对象内部状态 |
4.2 使用全局 + volatile
- 全局(extern):符号名清晰,FreeMASTER / Keil Watch 易查找
- volatile:防止编译器把变量优化进寄存器,保证 SWD 读到 RAM 最新值
4.3 改参后自动清积分
bsp_pid_app.c 中 fm_reset_on_param_change() 检测 g_fm_setpoint 或 g_fm_pid.kp/ki/kd 变化后自动 pid_reset(),等价于 lesson9 串口改参行为。
五、上位机 FreeMASTER 工程配置总结
5.1 建立连接
与 3.4 步骤 0~6 相同,此处为速查:
- Keil 编译烧录 → Stop 退出 Debug
- Project → Options → Comm 选 CMSIS-DAP/ST-Link
- 加载
Output/YH-F407.axf - Project → Variables 添加
g_fm_*变量 - 点 GO! 开始监视
5.2 变量监视(Watch)
在 Watch 窗口添加符号(从 axf 自动解析或手动输入):
| 符号 | 类型 | 含义 |
|---|---|---|
g_fm_setpoint |
float | 目标值 SP |
g_fm_actual |
float | 被控对象输出 ACT |
g_fm_error |
float | 误差 ERR |
g_fm_pid.kp / ki / kd |
float | PID 参数 |
g_fm_pid.output |
float | PID 输出 OUT |
g_fm_pid.p_term / i_term / d_term |
float | P/I/D 分项 |
5.3 示波器(Scope)
- 将 SP、ACT、OUT 等拖入 Scope 通道
- 设置采样间隔(如 50ms,与 FireWater 刷新节奏对照)
- 在 Watch 中把
g_fm_setpoint从 30 改为 70,观察 ACT 阶跃响应
5.4 在线改参
- 在 Watch 窗口双击修改
g_fm_setpoint、g_fm_pid.kp等 - 程序检测到变化后会自动
pid_reset()(见 4.3)
5.5 工程文件保存
- 保存 FreeMASTER 工程(
.ppm等),便于 lesson10 速度环复用
六、程序设计
6.1 目录
User/
├── freemaster/
│ └── bsp_fm_vars.h # g_fm_* 声明与 Watch 说明
├── pid/
│ └── bsp_pid_app.c # g_fm_* 定义 + PID 任务
├── plant/
└── main.c
6.2 运行流程
- 初始化:时钟、LED、PID、被控对象
- 主循环 10ms:
fm_reset_on_param_change()→ PID 运算 → 更新g_fm_actual/g_fm_error
6.3 FreeMASTER 侧流程
烧录 → 退出 Keil Debug → FreeMASTER 连接 SWD
→ 加载 .axf → Watch/Scope 添加变量 → 在线改参
七、实验步骤
7.1 连通性验证
- Keil 编译烧录 lesson10 工程,确认程序运行
- Stop Keil 调试,关闭 Debug 会话
- FreeMASTER 选 CMSIS-DAP/SWD,加载
Output/YH-F407.axf - Watch 添加
g_fm_setpoint,应显示初值 50 - 若读不到:确认 axf 路径正确、变量名与 Keil Watch 一致、程序在运行
7.2 监视 PID 波形
- Scope 添加
g_fm_setpoint、g_fm_actual、g_fm_pid.output - Watch 中把
g_fm_setpoint改为 30 再改 70,观察 ACT 跟踪
7.3 在线整定
| 步骤 | FreeMASTER 操作 | 预期 |
|---|---|---|
| 纯 P | g_fm_pid.ki=0, g_fm_pid.kd=0,增大 g_fm_pid.kp |
响应变快,可能有稳态误差 |
| 加 I | 固定 Kp,增大 g_fm_pid.ki |
稳态误差减小,可能超调 |
| 加 D | 在 PI 基础上增大 g_fm_pid.kd |
超调减小 |
改参后程序自动 pid_reset()。
源码位置: