本帖最后由 IFXLingling 于 2023-10-8 11:02 编辑
复位后,首先运行的是引导启动代码,依次执行下列步骤: - 如果有硬件初始化代码,先执行代码。
- 验证用户闪存中的 TOC2(目录)是否有效。
- 获取 App0 Reset Handler 函数。
- 配置 SWD/JTAG 管脚。
- 延迟执行(等待窗口/监听窗口)。
- 启动用户应用程序。
复位时的各操作时序图如下所示: : 可见,总启动时间为: tstartup = tlite_up + tboot + tlisten [td]名称 | 时间项 | 时长 | 内容说明 | 上电时间 | tlite_up | 最长 250 µs | 复位命令后到 CPU 开始执行引导启动代码的时间 | 引导启动时间 | tboot | 0.7 – 600 ms | 引导启动代码执行步骤 1 到 4 所花费的时间。 | 监听窗口 / 等待时间 | tlisten | 20 ms(0 – 100 ms 区间内变化) | 监听窗口默认需要20 ms (引导启动代码执行的第五步),用于连接编程器,进入编程模式。 MCU 监听主机发送正确的 SWJ 命令序列。 |
你可以创建一个简单的应用程序,切换 CM0+ 应用程序中的一个管脚,看看复位后应用程序启动需要多长时间。以下为复位后运行用户应用程序耗时截图: 图中耗时约为21 ms (具体数值可能会上下浮动)。这个启动时间可能无法满足要求复位后快速响应的应用。 为什么启动时间在21 ms 左右? 仔细观察会发现,绝大部分时间是由监听窗口消耗的(~20 ms)。 在PSoC 6 MCU中,监听窗口由 TOC2 (目录)控制。TOC2这种数据结构,提供了用户闪存中特定内容的位置信息,如安全映像、用户应用程序和闪存引导启动参数。详细的 TOC2 格式如下所示。更多信息请参见 PSoC 6 架构 TRM的 "Boot Code" 一章: 修改4:2(LISTEN_WINDOW),配置监听窗口。 注意,如果把监听窗口设置为0 ms 或修改其他位(例如修改SWJ_PINS_CTL,禁用SWJ),就不能再对器件进行编程。请确保仅修改LISTEN_WINDOW位。
建议将监听窗口设置为 1 ms ,该数值适用于大多数应用。在本文所附工程文件中,使用FLASHBOOT_WAIT_1MS宏修改了TOC2结构,将LISTEN_WINDOW设置为 1 ms(值 = 2)。用 CY8CKIT-062-WIFI-BT 套件进行测试。 /** Flashboot parameters */
#define FLASHBOOT_FLAGS ((FLASHBOOT_VALIDATE_NO << TOC_FLAGS_APP_VERIFY_POS) \
| (FLASHBOOT_WAIT_1MS << TOC_FLAGS_DELAY_POS) \
| (FLASHBOOT_CLK_50MHZ << TOC_FLAGS_CLOCKS_POS))
/** TOC2 in SFlash */
CY_SECTION(".cy_toc_part2") __USED static const cy_stc_toc_t cy_toc2 =
{
.objSize = sizeof(cy_stc_toc_t) - sizeof(uint32_t), /**< Object Size (Bytes) excluding CRC */
.magicNum = 0x01211220, /**< TOC2 ID (magic number) */
.appAddr1 = 0x10000000u, /**< Application start address */
.tocFlags = FLASHBOOT_FLAGS, /**< Flashboot flags stored in TOC2 */
.crc = 0UL /**< CRC populated by cymcuelftool */
};
修改 TOC2 的值后,需更新用于验证 TOC2 的 CRC 值。在 PSoC Creator 完成构建后,CyMCUElfTool 会自动完成该更新。 ModusToolbox 中,向 Makefile 添加下列 post-build 命令,为应用签名,生成 TOC2 CRC。 - 在 ModusToolbox 安装目录下的 tools_2.x 文件夹中找到 cymcuelftool.exe ,复制并粘贴到应用程序目录中(此步骤在本文所附工程中已完成)。
- 运行构建前,先将该命令中的应用访问路径修改为绝对路径。
POSTBUILD=./cymcuelftool.exe --sign "<path_to_application>/mtb-psoc6-reduce-startup-time/build/CY8CKIT-062-WIFI-BT/Debug/mtb-psoc6-reduce-startup-time.elf" --output "<path_to_application>/mtb-psoc6-reduce-startup-time/build/CY8CKIT-062-WIFI-BT/Debug/mtb-psoc6-reduce-startup-time.elf" --hex "<path_to_application>/mtb-psoc6-reduce-startup-time/build/CY8CKIT-062-WIFI-BT/mtb-psoc6-reduce-startup-time.hex" 本文附带的文档中包括 ModusToolbox 和 PSoC Creator 工程文件。 - ModusToolbox 工程文件:在CM4应用程序中切换管脚 10.1,监听窗口设为 1 ms。该工程使用预构建的 CM0p 映像,
因为 CM0p 应用程序是先启动的,你可以使用双 CPU 应用模板,在 CM0p 应用程序中切换管脚。这样操作在时间上会更精准,因为 CM0p 应用程序与 CM4 应用程序启动存在先后顺序, CM0p 到 CM4 之间通常会有几微秒的延迟。 - PSoC Creator 工程文件: 分别切换 CM0p 应用程序的 10.0 管脚和 CM4 应用程序的 10.1 管脚,将监听窗口设为 1 ms 。连接逻辑分析仪,按下套件上的复位开关。应该能看到从 XRES到CM0p 执行应用程序的启动时间约为 2 ms,相比 21 ms,有很大改进。对于 ModusToolbox 应用程序,读数区间可以从复位开始到 CM4 应用程序启动结束。
|