ZHCAF28 March   2025 MSPM0C1103 , MSPM0C1104 , MSPM0C1104-Q1 , MSPM0G1105 , MSPM0G1106 , MSPM0G1107 , MSPM0G1505 , MSPM0G1506 , MSPM0G1507 , MSPM0G3105 , MSPM0G3105-Q1 , MSPM0G3106 , MSPM0G3106-Q1 , MSPM0G3107 , MSPM0G3107-Q1 , MSPM0G3505 , MSPM0G3505-Q1 , MSPM0G3506 , MSPM0G3506-Q1 , MSPM0G3507 , MSPM0G3507-Q1 , MSPM0L1105 , MSPM0L1106 , MSPM0L1228 , MSPM0L1228-Q1 , MSPM0L1303 , MSPM0L1304 , MSPM0L1304-Q1 , MSPM0L1305 , MSPM0L1305-Q1 , MSPM0L1306 , MSPM0L1306-Q1 , MSPM0L1343 , MSPM0L1344 , MSPM0L1345 , MSPM0L1346 , MSPM0L2228 , MSPM0L2228-Q1

 

  1.   1
  2.   摘要
  3.   商标
  4. 1网络安全要求简介
    1. 1.1 MSPM0 的网络安全要求
  5. 2MSPM0 调试寄存器简介
  6. 3实施
    1. 3.1 使用邮箱的调试器
    2. 3.2 MCU
      1. 3.2.1 使用和配置 Nonmain
      2. 3.2.2 MSPM0 软件实现
  7. 4执行
    1. 4.1 首次刷写
    2. 4.2 访问锁定的 MCU
  8. 5如何自定义密码
    1. 5.1 密码
    2. 5.2 密码长度
  9. 6总结
  10. 7参考资料

MSPM0 软件实现

实现此功能的代码与用户自己的应用程序位于相同的项目文件中。

根据 Nonmain 配置,MCU 可依托 SWD 与邮箱通信,但不能使用调试端口直接访问内核资源。为 MCU 编写的软件可根据 Mailbox 通信实现密码验证。

表 3-2 DSSM 寄存器功能
DSSM 寄存器 说明 调试探针 目标器件 操作
TX_DATA 数据缓冲区 RW R TXCTL.TRANSMIT 在调试探针进行写入时设置,并在目标器件进行读取时清零;TXIFG 也在调试探针进行写入时设置
TXCTL 流控制和状态 RW R
RX_DATA 数据缓冲区 R RW RXCTL.RECEIVE 在目标器件进行写入时设置,并在调试探针进行读取时清零;RXIFG 也在目标器件进行写入时设置
RXCTL 流控制和状态 R RW

MCU 的工作流程如图 3-2 所示。

 MCU 软件流程图图 3-2 MCU 软件流程图

与调试器软件结合,如图 3-3 所示。下面是实现加密调试的过程。MCU 运行引导代码后,MCU 首先检查在 Nonmain 配置中是否打开了 AHB-AP。如果没有,则意味着此时处于加密状态,进一步检查 DSSM 寄存器中是否存在密码传输命令。如果有,则发送响应并使用 DSSM 寄存器接收密码。

收到四个 32 位密码后,MCU 会检查这是否为正确密码。如果正确,则会再次更改 Nonmain 配置以启用 AHB-AP 端口。

为了使 Nonmain 生效,需触发 MCU 以通过软件执行引导复位。然后,MCU 重新通电并检测到 AHB-AP 现在已开启。为了确保 MCU 在此调试完成后再次锁定,检测到 AHB-AP 端口打开后再次更改 Nonmain 配置。但是,此配置完成后 MCU 不会复位,因此修改后的 Nonmain 在调试完成之前不会立即生效。

使用密码打开 AHB-AP 端口后,MCU 运行到客户自身代码并可继续调试,再次禁用 AHB-AP 端口。

对于常规 MCU 启动,无需进行调试;在检查 SWD 是否禁用之后,MCU 会进入主应用程序代码。

 MCU 和调试器流程图图 3-3 MCU 和调试器流程图

在整个实现过程中,会多次修改 Nonmain,这也会增加 MCU 安全风险。特别指出,NONMAIN 是闪存的专用区域,用于存储 BCR 使用的配置数据,与 SWD 策略、闪存存储器等有关。修改 Nonmain 时,如果电源故障之类的异常操作导致 Nonmain 配置不正确,则会导致 MCU 变为“砖块”,永远不会连接。为了避免此问题,在代码中添加了一个监视器,以便在开机和修改 Nonmain 后检测配置是否正确。

请注意,在 MCU 中实现加密调试的代码位于启动文件中,并在 MCU 上电后立即执行。这将跳至 C 初始化例程。