FreeMaster 使用

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 中,可以轻松完成以下操作:

  1. 在新建项目时直接勾选 FreeMASTER Middleware
  2. 在已有工程中,通过“Manage SDK Components”添加;
  3. 使用 freemaster_cfg.h 对通信接口、变量访问等行为进行配置;
  4. 借助 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切换为例:

  1. 导入evkbmimxrt1170_iled_blinky_cm7工程;
  2. 通过PinConfigTool配置GPIO_AD_25,使它用作GPIO输出引脚;
  1. 修改代码主文件:

    请注意,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
    62
    volatile 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工程连接

  1. 工程配置

    打开FreeMaster会自动新建工程,打开Project–Options..

2.因为我们的板载调试器使用的JLink OB,则这里选择对应的Plug-In即可:

  1. 配置MCU的Connect string:

  2. 加载MCUXpressoIDE编译的axf镜像文件:

  3. 在ProjectTree中右键项目,打开Properties,把需要监控的变量都导入右边:

  4. 在监控变量上右键,创建示波器,通过图形化界面观察变量的变化:

    可以看到,当g_systickCounter减到0后,g_led_index发生变化,此时切换LED颜色。由于我们事先配置好了demo_online这个变量,我们通过把它置为0,可以阻止g_led_index的变化。然后,配置g_led_index,观察LED颜色和代码逻辑一致性。


EOF

作者

Gavin

发布于

2025-06-16

更新于

2025-06-16

许可协议

CC BY-NC-SA 4.0

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×