FreeMaster 使用
使用 FreeMASTER 实现 NXP RT1170 的运行时可视化与调试
软硬件环境:
- 硬件:RT1170-EVKB
- SDK:24.12.00
- demo:
- FreeMaster:Version_
参考:https://blog.csdn.net/bjxdbz/article/details/120799718
https://community.nxp.com/t5/FreeMASTER-Knowledge-Base/Connecting-to-the-Board/ta-p/1122819
在嵌入式系统开发过程中,我们常常需要在系统运行时动态观察变量、修改参数或调试算法。NXP 提供的 FreeMASTER 工具,正是专为此类需求设计的运行时调试与监控平台,它对于RT系列MCU同样适用,本文即用RT1170为例进行介绍和实验。
FreeMaster初探
什么是 FreeMASTER
FreeMASTER 是一款由 NXP 开发的运行时可视化和调试工具。它最初用于电机控制,变量监控,后来逐步发展为一个功能丰富、连接灵活的调试平台,支持:
- 实时变量读取与图形可视化;
- 参数调整与算法调试;
- 命令发送与用户交互界面控制;
FreeMASTER 能够通过多种通信方式与目标设备建立连接,包括:
- UART 串口(常见于调试口);
- CAN 总线;
- JTAG/SWD 调试通道;
- USB-CDC;
- CMSIS-DAP、J-Link 等探针方式进行直接内存访问。
为什么选择 FreeMASTER
FreeMASTER 的核心优势在于它提供了开发过程中非常宝贵的“运行时窗口”:
- 在线调试与参数优化:你可以在系统运行时,不停机地修改控制参数。
- 系统动态可视化:包括变量变化曲线、波形图、录波、命令响应等。
- 快速 UI 原型设计:基于 HTML5 的 UI 页面,可以构建自定义按钮、滑条、仪表盘等。
- 无侵入式调试方式:尤其是借助 TSA 表(Target-side Addressing)技术时,甚至无需加载 ELF 文件即可访问变量。
在 NXP 的官方 Motor Control、Touch Sensing、Wireless Charging 等应用中,FreeMASTER 都是核心可视化工具。此外,它同样适用于任何自定义应用。
FreeMASTER 是 NXP MCUXpresso 软件生态的一部分,与 MCUXpresso IDE、SDK、配置工具、Secure Provisioning Tool 等配合使用。在 MCUXpresso 中,可以轻松完成以下操作:
- 在新建项目时直接勾选 FreeMASTER Middleware;
- 在已有工程中,通过“Manage SDK Components”添加;
- 使用
freemaster_cfg.h对通信接口、变量访问等行为进行配置; - 借助 SDK 提供的 FreeMASTER 示例快速上手。
NXP 提供了多个 FreeMASTER 示例工程,例如通过 UART 或 CAN 与 RT1170 通信,实时显示变量变化,并支持命令控制、变量刺激、图表绘制等高级功能。
FreeMASTER 核心功能
| 功能分类 | 描述 |
|---|---|
| 连接方式 | UART、CAN、JTAG/SWD、CMSIS-DAP、J-Link、USB |
| 数据监控 | 实时读取变量,绘图、列表显示 |
| 参数调节 | 写入变量,在线调整算法 |
| 命令交互 | 用户自定义命令通信 |
| 图形界面 | 内嵌 HTML/JS 页面,实现 UI 控制面板 |
| 与第三方协作 | 支持 ActiveX 与 Excel、Matlab 等通信 |
| TSA 技术 | 定义可访问变量,提高安全性与兼容性 |
FreeMaster的Plug-In方式调试RT1170工程
这里我们基于RT1170-EVKB板子设计一个实验,通过板载的MCU-Link硬件来和FreeMaster通信。SDK中的示例已经有了使用TSA的方法,它的好处在于直接通过FreeMaster的API将变量暴露给上位机,这样,通过USB或者其他FreeMater支持的接口,可以在不加载ELF文件时直接使用上位机进行可视化调试。缺点就是需要在工程中引入FreeMaster中间件,对开发要求高一些。
如果只是简单的无侵入监控和运行时调试,我们可以通过本文的Plug-In方式,加载image,再通过上位机调试,一般适用于有板载调试器的情况。
MCUXpressoIDE 工程准备
以RT1170-EVKB上附带的红色和绿色LED切换为例:
- 导入
evkbmimxrt1170_iled_blinky_cm7工程; - 通过PinConfigTool配置
GPIO_AD_25,使它用作GPIO输出引脚;
修改代码主文件:
请注意,FreeMaster只会获取全局变量,因此,待观测的变量一定要修改为全局变量!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62volatile uint32_t g_systickCounter;
/* The PIN status */
volatile uint8_t g_led_index = 0;
volatile bool demo_online = 1;
void SysTick_Handler(void)
{
if (g_systickCounter != 0U)
{
g_systickCounter--;
}
}
void SysTick_DelayTicks(uint32_t n)
{
g_systickCounter = n;
while (g_systickCounter != 0U)
{
}
}
/*!
* @brief Main function
*/
int main(void)
{
/* Board pin init */
BOARD_InitHardware();
/* Set systick reload value to generate 1ms interrupt */
if (SysTick_Config(SystemCoreClock / 1000U))
{
while (1)
{
}
}
//Gavin Turn off all LEDs initially. LOGIC_LED_OFF is 1U.
GPIO_PinWrite(EXAMPLE_LED_GREEN_GPIO, EXAMPLE_LED_GREEN_GPIO_PIN, 0U);
GPIO_PinWrite(EXAMPLE_LED_RED_GPIO, EXAMPLE_LED_RED_GPIO_PIN, 0U);
while (1)
{
/* Delay 1000 ms */
SysTick_DelayTicks(1000U);
//Gavin logic to switch between green and red leds
if (g_led_index == 0) /* g_led_index == 0 绿灯亮*/
{
GPIO_PinWrite(EXAMPLE_LED_GREEN_GPIO, EXAMPLE_LED_GREEN_GPIO_PIN, 1U);
GPIO_PinWrite(EXAMPLE_LED_RED_GPIO, EXAMPLE_LED_RED_GPIO_PIN, 0U);
}
else /* g_led_index == 1 宏灯亮*/
{
GPIO_PinWrite(EXAMPLE_LED_GREEN_GPIO, EXAMPLE_LED_GREEN_GPIO_PIN, 0U);
GPIO_PinWrite(EXAMPLE_LED_RED_GPIO, EXAMPLE_LED_RED_GPIO_PIN, 1U);
}
if(demo_online)
{
g_led_index = (g_led_index + 1) % 2;
}
}
}设计两个全局变量的原因:
变量
g_led_index会通过持续的取余来达到Red/Green两色LED切换的效果。但是,FreeMaster是个运行时的调试工具,如果我们不给工程增加
demo_online这个volatile变量,即使在FreeMaster中修改g_led_index的值,它仍然不停变化,无法详细的观测。- 因此,先调整
demo_online为0,则g_led_index不再自动更改; - 再手动修改
g_led_index为奇数偶数,就可以观察板子对应的LED的变化了。
- 因此,先调整
FreeMaster工程连接
工程配置
打开FreeMaster会自动新建工程,打开Project–Options..

2.因为我们的板载调试器使用的JLink OB,则这里选择对应的Plug-In即可:
配置MCU的
Connect string:
加载MCUXpressoIDE编译的axf镜像文件:
在ProjectTree中右键项目,打开Properties,把需要监控的变量都导入右边:
在监控变量上右键,创建示波器,通过图形化界面观察变量的变化:
可以看到,当
g_systickCounter减到0后,g_led_index发生变化,此时切换LED颜色。由于我们事先配置好了demo_online这个变量,我们通过把它置为0,可以阻止g_led_index的变化。然后,配置g_led_index,观察LED颜色和代码逻辑一致性。
EOF
