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
实现此功能的代码与用户自己的应用程序位于相同的项目文件中。
根据 Nonmain 配置,MCU 可依托 SWD 与邮箱通信,但不能使用调试端口直接访问内核资源。为 MCU 编写的软件可根据 Mailbox 通信实现密码验证。
| DSSM 寄存器 | 说明 | 调试探针 | 目标器件 | 操作 |
|---|---|---|---|---|
| TX_DATA | 数据缓冲区 | RW | R | TXCTL.TRANSMIT 在调试探针进行写入时设置,并在目标器件进行读取时清零;TXIFG 也在调试探针进行写入时设置 |
| TXCTL | 流控制和状态 | RW | R | 无 |
| RX_DATA | 数据缓冲区 | R | RW | RXCTL.RECEIVE 在目标器件进行写入时设置,并在调试探针进行读取时清零;RXIFG 也在目标器件进行写入时设置 |
| RXCTL | 流控制和状态 | R | RW | 无 |
MCU 的工作流程如图 3-2 所示。
与调试器软件结合,如图 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 会进入主应用程序代码。
在整个实现过程中,会多次修改 Nonmain,这也会增加 MCU 安全风险。特别指出,NONMAIN 是闪存的专用区域,用于存储 BCR 使用的配置数据,与 SWD 策略、闪存存储器等有关。修改 Nonmain 时,如果电源故障之类的异常操作导致 Nonmain 配置不正确,则会导致 MCU 变为“砖块”,永远不会连接。为了避免此问题,在代码中添加了一个监视器,以便在开机和修改 Nonmain 后检测配置是否正确。
请注意,在 MCU 中实现加密调试的代码位于启动文件中,并在 MCU 上电后立即执行。这将跳至 C 初始化例程。