HA01 Secure boot快速启动(Fastwakeup)实现
-
1. 前言
参考SDK应用_Secure_Boot 模块配置及应用文档及RM手册中关于安全启动流程的描述,MCU的安全启动分为Normal Boot Mode和Fast wakeup Boot Mode两种,应用中常见的Secure boot启动方案如下:

本文档将基于以下软、硬件环境,介绍如何实现Fast wakeup,并在最后对比Fast wakeup和Normal Mode的启动时间差异。- 硬件环境:YTM32B1HA01 EVB板
- 软件包:基于YCT工具中提供的Secure_boot_demo实现,SDK版本 1_3_1
- 软件环境:VScode+GCC
2. Fast wakeup实现
2.1 Fast wakeup实现原理及步骤
此处Fast wakeup功能通过修改Secure_Boot_Demo工程实现。

具体操作步骤:
1.在YTLINK中划分一个retention RAM分段,用于copy IVT段中的数据。注意:- 分段大小:IVT段的大小为1024,retention RAM中的分段长度配置为0x400即可
- 分段地址:
- 该RAM段处于retention RAM段中(0x20020000~0x20027FFF)
- 该段的起始地址需要满足1K(0x400)
本示例中,在地址0x20020000处创建了一个名为“retentionRam”的分段

Tips:
若用户需要使用YCT工具对生成的hex文件进行加密处理,务必确保增加“retentionRam”分段后编译出的hex文件不包含RAM段,否则YCT工具无法对hex文件进行加密。具体实现方式——-
GCC环境:配置分段的noload属性即可

-
Keil环境:YT-link中配置的noload属性对keil环境无效,使用Keil的用户可参考论坛帖解决
https://forum.ytmicro.com/topic/607/b1md-mcal-dio例程生成的hex文件为什么有0x1fff8400地址的信息?_=1753772506639
2.向REGFILE->DR[0]写入快速唤醒Tag,0x5A5B6E6F
/* Set fast wakeup tag at REGFILE->DR[0] */ REGFILE->DR[0] = 0x5A5B6E6F;3.向REGFILE->DR[1]写入预计放入IVT数据的地址,此处应当填入"retentionRam"分段的起始地址0x20020000
/* Set address of IVT table at REGFILE->DR[1], must be retention RAM area, and must be 1K algined */ REGFILE->DR[1] = 0x20020000;4.copy一份IVT区域的数据存放到"retentionRAM"分段区域
#define FLASH_IVT_ADDR 0x2000800 __attribute__((section(".retentionRam"))) uint8_t Retention_IVT[1024]; /* Copy IVT table to the address which is set at REGFILE->DR[1] */ const uint8_t* pflash_ivt_src = (const uint8_t*)FLASH_IVT_ADDR; memcpy(Retention_IVT, pflash_ivt_src, 1024);2.2 Fast wakeup功能测试
2.2.1 测试方式
如下图,编辑Secure_Boot_Demo工程,通过EN_FAST_WAKEUP宏控制开启fast wake up功能,通过观测PTB12电平变化确认是否成功启动。

2.2.2 测试步骤
1.下载并运行Secure_Boot_Prepare的demo工程,将密钥烧录到HCU_Nvr中。
2.编译Secure_Boot_Demo工程,将编译生成的hex文件上传到YCT配置工具中加密,将加密后生成的.bin文件烧录到MCU中,掉电,再重新上电,即可观察到PTB12在反复翻转(如下图),证明MCU可以成功启动。


在该演示示例中,需要说明:- MCU上电后首次启动走的是Normal Boot Mode,之后的每次复位走的是Fast wakeup。
- 向MCU中烧录加密后的可执行文件,是因为上电时regfile的DR[0]、DR[1]中没有数据(regfile中的数据掉电不保持),未使能fast wakeup功能
2.3 Fast wakeup与Normal Boot启动时间比对
通过控制EN_FAST_WAKEUP宏来切换Fast wakeup和Normal Boot两种启动模式,测量两种模式对应的启动时间。PTB12的低电平持续时间即为相邻两次调用软件复位函数SystemSoftwareReset函数的时间。
Fast wakeup:7.75ms

Normal Boot:8.46ms

以上,可以看出Fast wakeup与Normal Boot启动时间上的差异,二者相差0.71ms,差异不大。
这是因为Secure_Boot_Demo工程校验的flash区域较小,若校验的范围较大,这个时间差异会更明显。3. 参考代码
快速上手云途开发生态
发帖前请查看
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...