请选择 进入手机版 | 继续访问电脑版
查看: 1494|回复: 0

[原创] 在 i.MX RT10xx 中使用 SWO TRACE 功能

[复制链接]
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3297

    主题

    6542

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    31909
    最后登录
    2024-3-29
    发表于 2022-8-3 16:38:45 | 显示全部楼层 |阅读模式


    1 简介
    i.MX RT10xx 系列是 NXP 采用先进 Cortex-M7 内核的跨界处理器,能够提供优秀的 CPU 性能和实时响应。Cortex-M7 内核的优势之一是它在 CoreSight 架构中包含了指令跟踪宏单元(ITM)。ITM 是一种全新的单片机调试跟踪方法,
    支持串行线输出跟踪(SWO trace)功能。
    本文介绍了 SWO trace 的原理及优点,并且提供了在 i.MX RT10xx 系列 MCU上使用 SWO trace 功能的详细指导,包括五款开发板上不同的硬件和软件配置。此外,本文还介绍了在不同的 IDE 开发环境下,使用 SWO trace 基本功能(ITM 调试输出)的具体步骤。
    2 SWO trace 概述
    2.1 CoreSight 组
    11.png
    2.2 串行线输出(SWO)
    串行线输出(Serial Wire Output, SWO)是一个单引脚跟踪接口,它作为 Cortex-M 内核中 CoreSight 架构的一部分,充当片上跟踪数据与跟踪端口分析器(TPA)之间的桥梁。
    SWO trace 支持对正在运行的 MCU 的内存的访问,而不需要暂停 CPU 的运行。一些采用 Cortex-M3/M4/M7 等架构的 MCU 内核支持 SWO Trace 功能,SWO trace 利用串行线调试(SWD)接口中的 SWO 引脚输出调试时产生的跟踪信息。SWD 调试接口是 ARM 公司提出的一种调试接口,相对于传统的 JTAG 接口,使用更少的信号引脚。图 2 是 SWO 的模型框图,除标准的SWD 连接外,SWO trace 只需要一个额外的引脚。
    12.png
    SWO trace 接口与 TPIU(Trace Port Interface Unit, 跟踪端口接口单元)类似,但它仅支持 TPIU 接口的部分功能。
    SWO trace 主要调试功能列举如下:
    • 以字符串的形式发送调试消息
    • 监控中断进入/退出
    • 监控函数进入/退出
    • PC(程序计数器)周期性抽样
    • 事件通知
    • 变量值随时间的变化
    其中,SWO trace 最基本和常用的功能是输出调试信息。本文 IAR 中使用 SWO 功能和 Keil 中使用 SWO 功能将详细介绍该功能

    的使用方法。
    13.png
    注意
    如图 3 所示,SWO 引脚与 JTAG_TDO 引脚复用。因此串行线调试(SWD)模式和 JTAG 模式不能同时使用,本文讨论的 SWO trace 功能都基于串行线调试模式

    2.3 指令跟踪宏单元(ITM)
    指令跟踪宏单元(Instrumentation Trace Macrocell, ITM)以包的形式生成跟踪信息,并且它提供了一种通过 SWO 端口将数据从
    终端发送到调试器的机制。ITM 的跟踪数据首先被传输到 SWO 接口,然后 SWO 将数据流传输到跟踪端口分析器。
    ITM 包含 32 个激励端口,且允许不同的软件把数据输出到不同的端口,从而调试主机可以将各路数据分开。ITM 的一个主要用
    途,就是支持调试信息的输出(例如 printf 格式输出)。在 32 个激励端口中,端口 0 默认用于输出调试信息。不同于基于 UART
    的数据输出,使用 ITM 输出不会对程序执行造成很大的延迟,因为在 ITM 内部有一个 FIFO,使得写入的输出数据得到缓冲。
    ITM 主要用于:
    • 支持 printf 风格的调试
    • 跟踪操作系统和应用程序事件
    • 发送系统诊断信息
    2.4 调试器
    i.MX RT10xx 系列 MCU 支持多种调试器,例如 CMSIS DAP, J-Link, PE micro,但是并不是每个调试器都支持 SWO trace 功能。
    本节将介绍两个常见的支持 SWO trace 功能的调试器。
    • LinkServer LPC-Link2



    LPC-Link2 是一款可扩展、独立运行的硬件调试器,可使用各种可下载的固件映像来支持各种开发工具和 IDE。LPC-Link2
    支持部分 LPCXpresso 和 MIMXRT10xx 开发板的调试。
    LinkServer 调试支持在 MCU 保持运行的过程中,启动或停止 SWO trace 功能。这意味着当使用 LPC-Link2 调试器进行 SWO
    trace 时,MCU 的性能不受影响。SWO trace 的丰富功能已经在 MCUXpresso IDE 和 LPC-Link2 固件上进行了充分的测试。
    如需详细使用教程,请参考 MCUXpresso IDE SWO Trace Guide。
    • SEGGER J-Link
    J-Link 是一款支持多种 MCU 内核的调试器,当使用 J-Link 实现 SWO trace 功能时,如果需要启动或停止 SWO trace,CPU
    必须暂时停止运行。
    为了正确计算内部采样率,必须对目标时钟速度进行正确采样。IAR 中使用 SWO 功能和 Keil 中使用 SWO 功能将详细介绍
    在不同 IDE 开发环境下,如何正确使用 J-Link 调试器实现 SWO trace 功能。
    3 项目和硬件配置
    SDK 中的官方项目示例以及部分型号的 EVK 开发板默认没有开启 SWO trace 功能。因此为了使能 SWO trace,需要对部分硬件
    电路和项目源文件进行修改。本章介绍了使能 SWO trace 功能所需的软硬件配置,包括以下五个型号的开发板:
    • MIMXRT1010-EVK
    • MIMXRT1020-EVK
    • MIMXRT1050-EVK
    • MIMXRT1060-EVK
    • MIMXRT1060-EVKB
    注意
    源代码的修改示例基于最新的 SDK(版本 2.9.1)。
    3.1 MIMXRT1010-EVK
    1. 配置 pin_mux.c 文件

    在项目文件夹中,选择 board 子文件夹,打开 pin_mux.c 文件,在函数 BOARD_InitPins 中添加以下内容:
    1. IOMUXC_SetPinMux( /* 添加以下代码*/
    2. IOMUXC_GPIO_AD_09_ARM_TRACE_SWO,
    3. 0U);
    4. IOMUXC_SetPinConfig(
    5. IOMUXC_GPIO_AD_09_ARM_TRACE_SWO,
    6. 0x00F9U);
    复制代码
    2. 配置 clock_config.c 文件
    在项目文件夹中,选择 board 子文件夹,打开 clock_config.c 文件,修改函数 BOARD_BootClockRUN 的部分内容,如下
    所示:
    1. /* Disable TRACE clock gate. */ /* 定位到此处*/
    2. CLOCK_DisableClock(kCLOCK_Trace);
    3. /* Set TRACE_PODF. */
    4. CLOCK_SetDiv(kCLOCK_TraceDiv, 3);
    5. /* Set Trace clock source. */
    6. CLOCK_SetMux(kCLOCK_TraceMux, 0);

    7. CLOCK_EnableClock(kCLOCK_Trace); /* 代码修改如下*/
    8. /* Set TRACE_PODF. */
    复制代码
    3.2 MIMXRT1020-EVK
    1. 连接 SWO 引脚和 JTAG-TDO 引脚。
    连接 SWO(J19-3 号引脚)和 JTAG-TDO(J16-13 号引脚)。
    2. 移除 R116
    如图 4 所示,JTAG-TDO 引脚与 ENET-RESET 信号复用,其中电容(C137)对信号产生影响,因此移除 R116。

    14.png

    3. 配置 pin_mux.c 文件
    在项目文件夹中,选择 board 子文件夹,打开 pin_mux.c 文件,在函数 BOARD_InitPins 中添加以下内容:
    1. IOMUXC_SetPinMux( /* 添加以下代码*/
    2. IOMUXC_GPIO_AD_B0_11_ARM_CM7_TRACE_SWO,
    3. 0U);
    4. IOMUXC_SetPinConfig( /* 添加以下代码*/
    5. IOMUXC_GPIO_AD_B0_11_ARM_CM7_TRACE_SWO,
    6. 0x00F9U);
    复制代码

    4. 配置 clock_config.c 文件
    与 MIMXRT1010-EVK 的时钟配置相同,详见 MIMXRT1010-EVK。
    3.3 MIMXRT1050-EVK
    1. 连接 R256 与 J21 的 13 号引脚。



    2. 配置 pin_mux.c 文件。
    在项目文件夹中,选择 board 子文件夹,打开 pin_mux.c 文件,在函数 BOARD_InitPins 中添加以下内容:

    1. IOMUXC_SetPinMux( /* 添加以下代码*/
    2. IOMUXC_GPIO_B0_13_ARM_CM7_TRACE_SWO,
    3. 0U);
    4. IOMUXC_SetPinConfig( /* 添加以下代码*/
    5. IOMUXC_GPIO_B0_13_ARM_CM7_TRACE_SWO,
    6. 0x00F9U);
    复制代码
    3. 配置 clock_config.c 文件。
    在项目文件夹中,选择 board 子文件夹,打开 clock_config.c 文件,修改函数 BOARD_BootClockRUN 的部分内容,如下
    所示:
    1. /* Disable TRACE clock gate. */ /* 定位到此处*/
    2. CLOCK_DisableClock(kCLOCK_Trace);
    3. /* Set TRACE_PODF. */
    4. CLOCK_SetDiv(kCLOCK_TraceDiv, 3);
    5. /* Set Trace clock source. */
    6. CLOCK_SetMux(kCLOCK_TraceMux, 0);

    7. CLOCK_EnableClock(kCLOCK_Trace); /* 代码修改如下*/
    8. /* Set TRACE_PODF. */
    9. CLOCK_SetDiv(kCLOCK_TraceDiv, 0); /* 代码修改如下*/
    10. /* Set Trace clock source. */
    11. CLOCK_SetMux(kCLOCK_TraceMux, 3); /* 代码修改如下*/
    复制代码
    3.4 MIMXRT1060-EVK
    1. 配置 pin_mux.c 文件。
    在项目文件夹中,选择 board 子文件夹,打开 pin_mux.c 文件,在函数 BOARD_InitPins 中添加以下内容:

    1. IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_10_ARM_TRACE_SWO, 0U);
    2. IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_10_ARM_TRACE_SWO,0x00F9U);
    复制代码
    2. 配置 clock_config.c 文件。
    与 MIMXRT1050-EVK 的时钟配置相同,详见 MIMXRT1050-EVK。
    3.5 MIMXRT1060-EVKB
    1. 移除 R173。
    2. 配置 pin_mux.c 文件。
    与 MIMXRT1060-EVK 的引脚复用配置相同,详见 MIMXRT1060-EVK。
    3. 配置 clock_config.c 文件。
    与 MIMXRT1060-EVK 的时钟配置相同,详见 MIMXRT1060-EVK。

    注意:TRACE_ROOT_CLK 的频率应该与 CORE_CLK 的频率接近,请特别注意不同 MCU 之间的时钟配置差异。
    4 IAR 中使用 SWO 功能
    完成项目和硬件配置中列举的硬件和项目源文件的配置后,SWO trace 功能理论上已经可以使用。然而在不同的开发环境(IDE)
    中,为了支持 SWO trace 功能,仍需要进行相应的配置。本章主要介绍如何在 IAR 中使用 J-Link 调试器测试 SWO trace 的基本
    功能(ITM 输出调试信息)。配置步骤如下:
    1. 准备工作:
    • 软件:MIMXRT1060-EVK SDK release (version: 2.9.1)
    • 硬件:MIMXRT1060-EVK 开发板
    • 调试器:J-Link Plus
    • IDE: IAR Embedded Workbench for Arm 8.50.9
    • ITM 输出调试信息的代码:

    1. while (1)
    2. {
    3. ITM_SendChar('A'); /* ITM 向指定端口发送字母 A */
    4. ITM_SendChar('B');
    5. ITM_SendChar('C');
    6. }
    复制代码
    ITM 输出信息的默认端口是端口 0,关于更多 ITM 输出功能的相关信息,请参考 core_cm7.h 文件中的 ITM_SendChar()函数。
    2. 点击 Project -> Options -> General Options -> Library Configuration, 将 library 设置为 Full,并在 stdout/stderr 中选择
    Via SWO, 如图 5 所示。

    15.png

    未更新完



    详细文档请查看,请点击>>
    [url=https://www.nxpic.org.cn/document/id-17980][/url]

    签到签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-3-29 14:33 , Processed in 0.125003 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表