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.

[参考译文] MSPM0C1104:当 SWD 引脚上的调试启用 (&Q) 通过 CCS 20.1.1 禁用和编程时、MSPM0C1104SDDFR 器件永久模块

Guru**** 2374090 points
Other Parts Discussed in Thread: UNIFLASH, MSPM0-SDK, SYSCONFIG, LP-MSPM0C1104, MSPM0C1104
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1521437/mspm0c1104-mspm0c1104sddfr-device-permanent-brick-when-the-debug-enable-on-swd-pins-is-disabled-and-programmed-via-ccs-20-1-1

器件型号:MSPM0C1104
Thread 中讨论的其他器件:SYSCONFIGMSPM0-SDK、UNIFLASH

工具/软件:

我使用 8 引脚版本来限制空间、需要所有可用的 GPIO 引脚、包括 SWD 引脚。 因此、我删除了 SysConfig 中的“ SWD 引脚上的调试使能“检查。 当我  使用 PROGRAM 命令从 CCS 对 MCU 进行编程时、编程失败、芯片会永久停止。 我尝试使用恢复出厂设置、批量擦除功能、但无法连接到器件。 但是、当我将复位永久连接到 GND 时、它会报告不同的连接错误、但连接和闪烁不幸运。 有人有类似的经验吗? 是否有适合器件去毛刺的解决方案? 我已经有超过 10 个砖。 我不是在编写 NONMAIN 存储器、或者如果我误编写 NONMAIN 存储器、也不知道。

使用的环境:Win11、CCS 20.1.1、最新的 SysConfig 和 MSPM0-SDK 更新、更新了 用于编程的 LP-MSPM0C1104 LaunchPad。

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

    您好、Jan、
    由于您禁用了 SWD 引脚、因此无法执行很多操作来与器件进行通信。 我有一项测试、希望您运行该测试、以查看是否仍可访问内核。 您能否运行无工程调试会话并查看是否可以到达内核?

    此致、

    Diego Abad

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

    你好 Diego、当我打新砖时、我会进行测试。 在重新焊接过程中、我划伤了所有的划伤样品。

    顺便说一下、我认为即使禁用了“调试“、编程仍然可用、因为硬复位后引导加载程序重新激活、硬复位仍然是引脚上的 NRST 功能。 这是否正确?

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

    您好、Jan、
    对于 L 和 G 系列、可以调用 BSL。 但是、C 系列没有 BSL。 我必须与我的团队确认、但我 90%肯定您不能使用 NRST 引脚为此器件输入 BSL。
    此致、
    Diego Abad

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

    尊敬的 Diego:

    当我无法禁用调试功能时、如何将 PA19 和 PA20 用作 GPIO、PWM 输出等?  理想情况下、甚至 PA1/NRST 也可用于应用。 但是、如果我需要它来进行重新编程该怎么办? 可能是对于此引脚、它会更清晰一些、因为我可以改用软件复位。 但我需要让 SWD 正常工作。 我想 SWD 一直都能正常工作、甚至不能被独立于 Debug 函数(我现在不需要该函数)禁用。

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

    您好、Jan、
    解决方法是在项目进入应用程序之前有一段时间、您可以在该应用程序中访问 SWD 线路。 下面的伪代码:

    int main (void){

       在配置任何引脚之前等待 x 秒(如果需要,用于对器件进行编程的时间)

       SysConfig 调用

       器件现在无法使用 SWD

    }

    这样、在 SWD 引脚停止工作之前就会有一个很小的时间窗口。 您还可以使用一种软件机制、通过 PIN 激活和停用 SWD 线路(输入引脚 1 = SWD 开启/输入引脚 0 = SWD 关闭)。

    此致、

    Diego Abad

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

    尊敬的 Diego:

    我曾在 slau893b.pdf 文档中找到有关“调试“和 SWD 编程引脚相关性的更多信息、但这方面没有任何内容。 因此、我预计这两个功能相互分离且相互独立。 您提到的等待函数通常是在按照本文档中的说明在 NRST 复位后调用 BSL。 但闪存擦除似乎存在一些问题、因为“批量擦除“功能不起作用、当调用此擦除时、它会报告错误、表明该系列不支持此功能。 同样、根据该文档、它也受到支持。 批量擦除功能在一段时间前起作用。 Uniflash 工具需要出现一些问题。 我记得、当我开始使用演示板时、我上传了 bin 文件而不是输出格式、并且板的响应方式不同。 解决方法是先进行批量擦除、然后在之后恢复出厂设置。 每次都是这样。

    BTW、根据第 17.4 段、出于安全原因、调试禁用是强制性的、但缺少了此基本功能和调试禁用功能组合的一些代码示例。 请这么善良并提供一些样本集。

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

    您好、Jan、

    您使用的是哪个版本的 Uniflash? 我建议进行更新、以防旧版本出现问题。 此外、我同意批量擦除和出厂擦除应该适用于 MSPM0C1104。 您是否有机会完成我在第一次答复中提到的核心调查?

    我可以分享一些代码行、您可以使用这些代码来禁用 SWD 线路进行编程。  

        /* 设置         SYSCTL 的 SWDCFG 寄存器中的 DISABLE 位  以及 KEY */
        SysCtl->SOCLOCK.SWDCFG  = (SYSCTL_SWDCFG_KEY_VALUE  | SYSCTL_SWDCFG_DISABLE_TRUE);
    您也可以通过取消选中此复选框来禁用此 I SysConfig。
    此致、
    Diego Abad
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Diego、

    我使用 MSPM0C1103SDDFR、遇到了 Jan 的相同问题。 我尝试了你的脚本做的核心发现,它不起作用。 得到的响应与尝试刷写 MCU 时相同。

    有趣的是、这不是我第一次加载将调试引脚配置为 GPIO 的固件、而是第一次节省芯片。 问题是我不知道我做了什么来拯救它。 但它涉及 多次尝试恢复出厂设置、并将 NRST 引脚连接到 GND、然后断开连接。

    如果你想到我能尝试的任何东西,请告诉我。

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

    尊敬的 Jean 和 Jan:
    “拆分“该器件的最佳建议是、在开始在闪存中执行代码之前尝试到达 SW 引脚。 但是、这个时间窗口将非常小、并且需要多次尝试才能完成此操作。  我同意、当前的理想方法是 在复位后在器件上恢复出厂设置脚本。
    此致、
    Diego Abad

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

    尊敬的 Diego 和 Jean:

    正如我所理解的、闪存控制器是引导加载程序的一部分、因此需要 MCU 处于活动模式、而不是处于复位状态、因为其他一些器件将进入编程模式。 因此、无法将 NRST 永久连接到 GND 以禁用固件启动。 那么很难捕捉到正确的状态、因为在 加载 SYSCFG_DL_init () 之前只有很短的窗口、因此它是代码的第一行。

    为了简写故事、我会准确地解释我需要什么。 由于网络安全原因、我需要禁用所有未使用的引脚和调试功能。 未使用的引脚不是问题、因此我已经全部使用了。   作为紧急最后手段、我需要禁用相应的闪存和内存读数以及除“硬“出厂重置和重新刷写可能性之外的所有调试功能。 无法使用密码保护功能。

    似乎它可能基于延迟的 SYSCFG 加载以及 用于读取/写入操作的锁定函数组合。

    是否知道如何安全、正确地这样做?

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

    您好、Diego 和 Jan、

    我忘了提一些我从第一次到第二次的改变:我在  SYSCFG_DL_init () 之前添加了一个小的延迟,认为它会让我的生活更轻松。 显然,我错了,因为我第一次救了芯片,但不是这一个。 这有什么意义吗?

    int main(void)
    {
        delay_cycles(12000000);
        SYSCFG_DL_init();

    无论如何、我正在考虑做 Diego 建议的那样“您也可以使用一种软件机制、通过 PIN 激活和停用 SWD 线路“、但是我唯一留下的引脚是 NRST 引脚。 所以我想、不可能在 GND 上启动芯片、因为它仍然具有 NRST 功能、对吧? 但我可以将其作为输入启动、然后在代码执行期间当我在其中收到 0 时、启用 SW 引脚上的调试功能。

    这有什么意义吗? 您能否分享一个脚本、说明如何禁用 SW 引脚上的 GPIO 功能并重新启用调试功能?

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

    尊敬的 Jean:
    您是对的。 理论上、您可以设置延迟或输入来打开和关闭调试线路。 要禁用/启用、您可以使用以下命令:

    disable ===>SysCtl->SOCLOCK.SWDCFG  = (SYSCTL_SWDCFG_KEY_VALUE | SYSCTL_SWDCFG_DISABLE_TRUE);

    Enable ==>SysCtl->SOCLOCK.SWDCFG = (SYSCTL_SWDCFG_KEY_VALUE);

    此致、

    Diego Abad

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

    您好、Jan、
    禁用软件线路以增加设备的安全性是正确的。 但是、我们建议仅在代码最终完成后才执行此操作、并且用户不需要进行进一步的更改。 因此、该器件按预期工作、但无法再次对其重新编程(除非发生 POR 并能够以某种方式连接到 SW 线路。) 通过一个时间窗口和/或引脚来激活/停用 SW 线路的方法是在不“快速“器件的情况下切换 SW 功能的理想方法。

    此致、

    Diego Abad

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

    您好 Jean 和 Diego、

    感谢您的评分。 希望我能够将所有内容都运用到我的代码中、并取得积极的成果。

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

    您好、Jan、
    很高兴能提供帮助。 如果您需要任何其他帮助、我建议您创建新的 E2E 帖子。  

    此致、

    Diego Abad

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

    尊敬的 Jan 和 Diego:

    我 找到了 一种方法来断开我的 MCU 的砖型、并使其可用于再次编程。 只需要 XDS 编程器板 (LaunchPad) 和 Uniflash。

    1. 在电路板上连接 Vcc、GND、SWDIO 和 SWCLK 引脚、但将 MCU 的 NRST 连接到 GND (NRST =“0")“)。
    2. 运行“恢复出厂设置手册“脚本。  该软件将能够与您的芯片通信、并要求您按复位按钮。
    3. 从 GND 中释放 NRST (NRST =“1")“)。
    4. 恢复出厂设置将完成、存储器将被擦除。 芯片现已准备好进行编程。

    希望这对您有所帮助。 它对我起作用,即使在代码的开头没有延迟。

    参考资料:

    MSPM0C1103:关于将 SWIO/CLK 和 IO 引脚结合使用 — 基于 Arm 的微控制器论坛 — 基于 Arm 的微控制器 — TI E2E 支持论坛

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

    您好 Jean、

    感谢您的提示、但这种方法已经过测试。 它也不工作、因为 NRST 用作 GPIO、因此复位功能不可用。 我甚至尝试降低 Vcc 以达到 POR、但通信完全停止。

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

    最后、我找到了 适合我的解决方案。 它与 Jean 的步骤类似、但有一些具体要点。 由于我使用 NRST 作为 GPIO、因此常规复位不可用。 因此、我需要改用 POR。 步骤如下:

    1) 将应用 Vcc 和调试器与 USB 断开、并等待足够多的 MCU 将电源松至低于 POR 阈值。

    2) 从调试器断开 NRST 引脚、并通过导线将其直接连接到 GND。

    3) 运行  “恢复出厂设置手册“脚本,当要求“按下复位按钮“时,断开 NRST 到 GND 连接。 MCU 已重置为出厂默认值。 应用程序将响应以关闭调试会话、但不需要它。

    4) MCU 存储器被清除并准备好进行新固件上传。

    步骤 1) 和步骤 2) 最为关键。 在本例中、我一直通过 USB 连接调试器、并且 MCU 通过 NRST 线始终为高电平供电、但硬复位短路脉冲除外。 该脉冲太短、无法在我的应用中激活 POR。

     需要另一个引导条件 — NRST 在 POR 状态下需要为高电平、例如从 NRST 到 Vcc 的上拉电阻。 即使禁用了 NRST 功能并且 NRST 用作开漏输出或输入、这也是强制性的。

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

    您好、Jan、

    很高兴看到您找到了这种解决方案。 我会为将来可能需要此信息的任何客户固定此注释。

    此致、

    Diego Abad