电机驱动开发学习10. FreeMaster的简单使用

电机驱动开发学习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 改参后自动清积分)
  • [五、上位机 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 仅需安装上位机

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:下位机准备

  1. 用 Keil 打开 Project/Fire-F407.uvprojxRebuild 编译
  2. Download 烧录到板子,确认程序在跑(LED 等)
  3. 在 Keil 点 Stop 停止调试,关闭 Debug 会话(必须释放 SWD,否则 FreeMASTER 连不上)
  4. 板子 USB 保持连接(调试器 + 供电)

步骤 1:新建工程

  1. 打开 FreeMASTER(窗口标题类似 Project - FreeMASTER
  2. 若左侧 Project Tree 已有 New Project,可直接用;否则 File → New Project
  3. 建议 File → Save Project As... 保存到本章目录,例如 freemaster_pid.pmp

步骤 2:配置通信(CMSIS-DAP / SWD)

  1. 菜单 Project → Options... (或选中 New Project 右键 Properties

  2. 打开 Comm(Communication)选项卡

  3. 先选连接方式(很重要,很多人漏这一步):

    • Plug-in Module Interface(插件模块接口)单选按钮
    • 不要选 Native RS232 Link / Direct Serial 等
  4. 此时 Plug-in module 下拉框才应出现内容,选:

    • FreeMASTER CMSIS-DAP Communication Plug-in(野火板优先)
    • FreeMASTER BDM Communication Plug-in → Configure 里选 CMSIS-DAP
  5. 点 **Configure ** 选调试器、SWD、设备

  6. OK 保存

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

步骤 3:加载符号文件(.axf)

FreeMASTER 需要 .axf 才能按变量名解析地址。

  1. 仍在 Project → Options... 中,找到 Map file

  2. 浏览并选择:

    复制代码
    lesson10. FreeMaster的简单使用/Output/YH-F407.axf
  1. File format 选择 Binary ELF with DWARF debugging format.

  2. View 按钮,点开后应能搜到 g_fm_setpointg_fm_pid

  1. 确定

步骤 4:添加监视变量

  1. 菜单 Project → Variables...(或工具栏变量图标)
  2. 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
  1. 每个变量保存后,在 Project → Variables 列表中应能看到

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

步骤 5:添加示波器(Scope)

  1. Project Tree 中右键 New ProjectCreate OscilloScope

  2. 将新 Scope 命名为 PID(可选)

  3. 打开 属性- Variables

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

  5. 采样周期建议 50ms~100ms(SWD 带宽有限,不必过快)

步骤 6:连接并查看数据

  1. 点击工具栏绿色 GO! 按钮(或 Ctrl+G
  2. Variable Watch 窗口应刷新数值:
    • SPg_fm_setpoint)初值约 50
    • ACT 应随 PID 运算变化
  3. 切换到 Scope 视图,应看到曲线滚动
  4. 停止监视点红色 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.dllmcbpgi.dll 32-bit C:\Windows\SysWOW64\regsvr32.exe
plugins\bdm\bdmpgi.dllBDM/CMSIS-DAP 插件 32-bit 同上
mcbobjps64.dllmmaster64.dll 64-bit C:\Windows\System32\regsvr32.exe

用错位数就会全部显示 Error registering xxx.dll,Plug-in 列表为空。

pcmaster.exe /RegServermcbsvr.exe /RegServer 没报错是正常的;失败的是后面的 regsvr32 步骤。

办法 1:用修正版注册脚本

复制代码
lesson10. FreeMaster的简单使用/tools/register_freemaster_win64.bat
  1. 确认 FM=D:\NXP\FreeMASTER 3.2\FreeMASTER 路径正确
  2. 右键 → 以管理员身份运行 (建议用 SysWOW64\cmd.exe,不要用 PowerShell)
  3. 脚本末尾会 自动检查 Enum ;若报 [FAIL] Enum key missing 则注册未真正成功
  4. 完全关闭 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.dllregsvr32 也会 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
  1. 确认 bat 顶部 FM= 路径正确
  2. 右键 → 以管理员身份运行 (建议 SysWOW64\cmd.exe
  3. 脚本会注册 bdmpgi / mcbpgi / focpgi / jtagpgi 共 15 个插件,并打印 Enum 验证结果
  4. 完全退出 FreeMASTER → 重开 → Comm 选 Plug-in Module Interface

本章 STM32 实验选:FreeMASTER CMSIS-DAP Communication Plug-in(或 P&E Micro 里 Build 选 CMSIS-DAP)。

办法 3:若仍失败 ------ 装 VC++ 运行库

插件依赖 Visual C++ 运行库,请安装:

装完后再跑 办法 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-DAPST-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.cfm_reset_on_param_change() 检测 g_fm_setpointg_fm_pid.kp/ki/kd 变化后自动 pid_reset(),等价于 lesson9 串口改参行为。


五、上位机 FreeMASTER 工程配置总结

5.1 建立连接

3.4 步骤 0~6 相同,此处为速查:

  1. Keil 编译烧录 → Stop 退出 Debug
  2. Project → Options → Comm 选 CMSIS-DAP/ST-Link
  3. 加载 Output/YH-F407.axf
  4. Project → Variables 添加 g_fm_* 变量
  5. 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_setpointg_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 运行流程

  1. 初始化:时钟、LED、PID、被控对象
  2. 主循环 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 连通性验证

  1. Keil 编译烧录 lesson10 工程,确认程序运行
  2. Stop Keil 调试,关闭 Debug 会话
  3. FreeMASTER 选 CMSIS-DAP/SWD,加载 Output/YH-F407.axf
  4. Watch 添加 g_fm_setpoint,应显示初值 50
  5. 若读不到:确认 axf 路径正确、变量名与 Keil Watch 一致、程序在运行

7.2 监视 PID 波形

  1. Scope 添加 g_fm_setpointg_fm_actualg_fm_pid.output
  2. 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()

源码位置:

https://gitee.com/xundh/learn-motor-stm32