This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP432P401R:如何在不使用 CCS 的情况下将跟踪输出到 SWO

Guru**** 2589300 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/628299/msp432p401r-how-to-output-trace-to-swo-without-ccs

器件型号:MSP432P401R

尊敬的 Champ:

我曾引用 SWO 跟踪() 来测试 CCS 中的 SWO 函数。 我希望在没有 CCS 的情况下具有 SWO 跟踪功能。 我将下面的内容添加到我的代码中。

/*
*初始化 SWO 跟踪端口以进行调试消息打印
*\param portNumber 要配置的端口位掩码
*\param cpuCoreFreqHz CPU 内核时钟频率、单位为 Hz
*\param swoSpeed SWO 输出位速率、单位为 Hz
*
void SwoInit (uint32_t portNumber、uint32_t cpuCoreFreqHz、uint32_t swoSpeed)

/*以 Hz 为单位的 SWOSpeed、请注意 cpuCoreFreqHz 应与 CPU 内核时钟相匹配*/
uint32_t swoPrescaler =(cpuCoreFreqHz/swoSpeed)- 1;

/*在内核调试中启用跟踪*/
CoreDebug->DEMCR = CoreDebug_DEMCR_TRCENA_MSK;
/* ITM 锁定访问寄存器,C5ACCE55使能对控制寄存器0xE00的更多写入访问:0xFFC */
ITM->LAR = 0xC5ACCE55;
/*"Selected PIN Protocol Register":选择要用于跟踪输出的协议(2:SWO NRZ、1:SWO 曼彻斯特编码)*/
TPI -> SPPR = 0x00000002;
/*"Async 时钟预分频器寄存器"。 缩放异步输出的波特率*/
TPI -> ACPR = swoPrescaler;
/* ITM 跟踪控制寄存器*/
iTM->TCR = ITM_TCR_TraceBusID_MSK | ITM_TCR_SWOENA_MSK | ITM_TCR_DWTINA_MSK | ITM_TCR_SYNCENA_MSK | ITM_TCR_ITMENA_MSK;
/* ITM 跟踪特权寄存器*/
iTM->TPR = ITM_TPR_PRIVMASK_MSK;
/* ITM 跟踪使能寄存器。 启用激励端口上的跟踪。 每个激励端口一位。 *
iTM->ter =(1ul << portNumber);
/* DWT_CTRL */
dwt->CTRL = 0x400003FE;
/*格式化板和刷新控制寄存器*/
TPI->FFCR = 0x00000100;


/*
*通过 SWO 通道发送字符。 另请参见 core_cm4.h 中的 ITM_SendChar()
*\param c 字符待发送
*\param portNo SWO channel number、value in the range of 0 to 31
*
void SwoPrintChar (char c、uint8_t portNo)

volatile int timeout;

/*如果启用了 ITM 跟踪,请检查跟踪控制寄存器*/
if (((ITM->TCR & ITM_TCR_ITMENA_MSK)=0)

/*未启用? *
返回;

/*如果请求的端口被启用、请检查跟踪使能寄存器*/
if (((ITM->ter &(1ul << portNo))=0)

/*请求的端口未启用? *
返回;

/*任意超时值*/
超时= 5000;
while (ITM->port[portNo].u32 =0)

/*等待 STIMx 准备就绪,然后发送数据*/
超时--;
如果(超时=0)

/*无法发送*/
返回;

/*发送数据*/
iTM->port[portNo].u8 = c;


/*
*通过 SWO 向主机发送字符串
*\param s 要发送的字符串
*\param portNumber 端口号、0-31、对正常调试字符串使用0
*
void SwoPrintString (const char * s、uint8_t portNumber)

while (* s!='\0')

SwoPrintChar (* s++、portNumber);

如果我在没有启用"Custom Core Trace"的情况下进入 CCS 调试模式、则日志可以从 SWO 正确输出。 如果我没有进入 CCS 调试模式、SWO 中没有输出。 您能告诉我 我 SwoInit 有什么不好的地方吗? 谢谢。

此致、

Jeffery

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jeffery、

    我可以帮助您了解一下这方面的内容。 您能否先通知我您在上面的代码中的参考位置?

    您能否帮助我了解为什么 CCS 不能在本例中使用?

    据我所知、我们在这种用例方面没有很多积极的支持、但我们在 CTool 中确实有这种受支持的 ITMLib。 ITMLib 为 TI M3/M4器件提供"C"字符串和二进制值记录 API、这些器件包括一个 ITM 模块并支持具有 SWO (串行线输出)跟踪的 SWD (串行线调试)。 除此之外、我不确定还需要提供什么。 如果您可以提供更多有关您引用代码的位置以及您打算执行的操作的信息、或许我们可以提供更多指导。

    processors.wiki.ti.com/.../CToolsLib

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Evan、

    我在互联网上找到了代码。

    让我更详细地解释一下。

    1.我在 CCS 调试模式下运行代码、启用"自定义内核跟踪"。 我可以使用我的代码 SwoPrintString 获取 SWO 输出。 我在 TeraTerm 中获取 SWO 输出。

    2.我在 CCS 调试模式下运行代码、但不启用"客户内核跟踪"。 我可以使用我的代码 SwoInit 和 SwoPrintString 获取 SWO 输出。  我在 TeraTerm 中获取 SWO 输出。

    我在没有进入 CCS 调试模式的情况下运行代码。 我无法使用我的代码 SwoInit 和 SwoPrintString 获取 SWO 输出。  TeraTerm 中没有任何内容。 我还使用示波器进行检查、SWO 中没有信号。 我认为 SwoInit 中仍然缺少一些设置、无法在进入 CCS 调试模式的情况下工作。

    客户认为他可以使用 SWO 代替物理 UART 来进行调试日志。 硬件工程师需要在不进入 CCS 调试模式的情况下进行调试日志。 请帮助我解决此问题。 谢谢。

    顺便说一下、我将学习 CToolsLib。

    此致、

    Jeffery

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Evan、

    CToolsLib 无法满足我的客户要求。 因为 CToolsLib 需要 CCS 进入调试模式和 XDS 工具。

    您能否获取在 CCS 中完成的用于配置 ITM 和 SWO 跟踪导出的代码以供参考? 谢谢。

    此致、

    Jeffery

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Jeffery、

    我希望在我们的工具团队周围询问这一点、并尽快让您知道是什么以及不是什么。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jeffery、

    这是我们官方不支持的内容、但我要求其中一位开发人员提供更多信息、她的评论如下:

    [报价用户="Dev tea"]

    用户可以使用 COM 端口实用程序来查看/捕获数据。 但是、SWO 协议还会输出写入 ITM 的数据的标头数据包。 因此、输出也将具有标头数据、这些数据可能在终端查看器中显示为奇数字符。

    如果将使用 printf 样式字符消息、则一种可能是仅使用 ITM 激励端口0来生成跟踪数据。 为写入到激励端口0而生成的标头字节通常不是可打印字符、即使它们被接收、也不会显示在标准 COM 端口实用程序中。

    [/报价]

    希望这对您有所帮助、

    拉斐尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    拉斐尔

    不,这就是我所知道的。 让我再次解释我的问题。

    第一步:我编写了用于向 SWO 发送日志的代码。 当我进入启用"自定义内核跟踪"的 CCS 调试模式并运行代码时、我可以从 UART 获取日志。 我认为 SWO 输出功能正确。

    第二步:我编写了用于启用 SWO 的代码。 当我进入 CCS 调试模式并禁用"自定义内核跟踪"并运行代码时、我可以从 UART 获取日志。 我认为我有正确的 SWO 启用代码。 因此、我不需要在 CCS 调试模式中启用"Custom COE Trace"。 因为我想当我在 CCS 调试模式中启用"自定义内核跟踪"时、它将启用 SWO。

    第三步:我在没有 CCS 的情况下运行代码。 我无法从 UART 获取日志。 因此、我认为我错过了一些用于启用 SWO 的设置、应该在进入 CCS 调试模式时完成。 您能告诉我它的作用是什么吗? 我可以将其添加到我的代码中。 谢谢。

    此致、

    Jeffery

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jeffery

    Auxilary COM 端口设置为仅在启动调试会话时由 XDS110固件使用。 当调试会话未激活时、COM 端口将从 SWO 跟踪引脚(TDO)上断开、因此您不会看到任何数据。

    我们将在计划于今年11月发布的下一个仿真版本中解决此问题。 同时、您需要启动调试会话、以便能够在 COM 端口上获取 SWO 跟踪。

    希望这对您有所帮助。

    此致

    Ashwini

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Ashwini、

    我不能抓住你的观点。 当我连接 MSP432 Launchpad 时、我在 Windows 中获得2个 COM 端口。 一个是 JTAG 调试端口、另一个是虚拟 COM 端口。 我使用 TeraTerm 打开虚拟 COM 端口、并将 MSP432引脚的 SWO 连接到虚拟 COM 端口的 RX 引脚(通过移除跳转并按如下方式进行跳线)。 我还使用示波器测量 SWO 信号。 在没有 CCS 的情况下运行代码时、它始终保持高电平。 您能否帮助我查看启用 SWO 的代码并告诉我缺少什么? 谢谢。

    /*
    *初始化 SWO 跟踪端口以进行调试消息打印
    *\param portNumber 要配置的端口位掩码
    *\param cpuCoreFreqHz CPU 内核时钟频率、单位为 Hz
    *\param swoSpeed SWO 输出位速率、单位为 Hz
    *
    void SwoInit (uint32_t portNumber、uint32_t cpuCoreFreqHz、uint32_t swoSpeed)

    /*以 Hz 为单位的 SWOSpeed、请注意 cpuCoreFreqHz 应与 CPU 内核时钟相匹配*/
    uint32_t swoPrescaler =(cpuCoreFreqHz/swoSpeed)- 1;

    /*在内核调试中启用跟踪*/
    CoreDebug->DEMCR = CoreDebug_DEMCR_TRCENA_MSK;
    /* ITM 锁定访问寄存器,C5ACCE55使能对控制寄存器0xE00的更多写入访问:0xFFC */
    ITM->LAR = 0xC5ACCE55;
    /*"Selected PIN Protocol Register":选择要用于跟踪输出的协议(2:SWO NRZ、1:SWO 曼彻斯特编码)*/
    TPI -> SPPR = 0x00000002;
    /*"Async 时钟预分频器寄存器"。 缩放异步输出的波特率*/
    TPI -> ACPR = swoPrescaler;
    /* ITM 跟踪控制寄存器*/
    iTM->TCR = ITM_TCR_TraceBusID_MSK | ITM_TCR_SWOENA_MSK | ITM_TCR_DWTINA_MSK | ITM_TCR_SYNCENA_MSK | ITM_TCR_ITMENA_MSK;
    /* ITM 跟踪特权寄存器*/
    iTM->TPR = ITM_TPR_PRIVMASK_MSK;
    /* ITM 跟踪使能寄存器。 启用激励端口上的跟踪。 每个激励端口一位。 *
    iTM->ter =(1ul << portNumber);
    /* DWT_CTRL */
    dwt->CTRL = 0x400003FE;
    /*格式化板和刷新控制寄存器*/
    TPI->FFCR = 0x00000100;

    此致、

    Jeffery

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Jeffery

    这里有两件事:

    上图显示了从 TDI 到 XDS110 RX 引脚的连接。 它应该是 TDO 到 XDS110 RX 引脚。 (SWO 在 TDO 上输出)。
    2.根据 CCS 目标配置 CCXML、当一个调试器会话被连接时、目标上的调试协议硬件被调试堆栈明确地从4引脚 JTAG 切换到2引脚 SWD (通过切换 TCLK 和 TMS)、其中 TDO 引脚可用于 SWO 跟踪。 当调试器断开连接时、器件被切换回4引脚 JTAG。 这就是调试器断开连接时看不到 SWO 跟踪的原因。 这也将作为下一个仿真版本的一部分进行修复、在调试器断开连接时、调试协议中的 SWO 跟踪将保留为 SWD、从而在没有调试器的情况下提供 SWO 跟踪。

    谢谢
    Ashwini
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ashwini、

    1.是的,你是对的。 我在图片中犯错。 我将 TDO 连接到 EVM 中的 XDS110 RX 引脚。

    2.我想与您确认。 您谈论的是4引脚 JTAG 和2引脚 SWD? 是 MSP432还是 XDS110? 如果您讨论的是 XDS110、当调试器断开连接时、我会如何移除 EVM 中的所有 JTAG 跳转? 如果您讨论 MSP432、我是否可以通过任何方法将 MSP432本身从4引脚 JTAG 切换到2引脚 SWD?

    此致、

    Jeffery

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jeffery

    4引脚 JTAG 是 MSP432硬件在复位时采用的调试协议。 外部工具必须以特定的模式(XDS110所做的就是)切换 TCLK 和 TMS、以便将 MSP432硬件的调试协议切换为2引脚 SWD。 应用程序无法进行此更改、更改必须来自外部工具。

    现在、您需要通过调试器进行连接才能实现这一目的。

    谢谢

    Ashwini