大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1062 TencentOS Tiny EVB_AIoT开发板在Flash调试与离线启动。
腾讯 TencentOS 团队于2021年12月8日联合恩智浦半导体、安谋科技发起了一个线上开发者活动 - TencentOS Tiny AIoT 应用创新大赛。为了这个大赛,腾讯 TencentOS 团队联合恩智浦半导体、厚德物联网设计了一款高性能 AIoT 评估板,用于 TencentOS tiny 基础内核和 AIoT 应用功能体验和评估。
痞子衡受邀为这个大赛准备一场直播课程(12月30日晚7点),主题是板载主控恩智浦 i.MXRT1062 芯片快速开发指南,由于课程时间限定在40分钟,要讲的内容又比较多,注定只能走马观花,所以这个系列文章就围绕 EVB_AIoT 开发板给这场直播做一个铺垫和补充。上一篇我们讲了 《开发环境搭建与点灯》,本文是第二篇,我们来讲讲在 Flash 调试与离线启动:
一、跑通串口打印
上一篇文章我们借助板载 DAP-Link 调试器在芯片内部 RAM 里以在线调试的方式跑通了最入门的点灯实验,今天我们换个同样也非常经典的串口打印例程,恩智浦 SDK 包里有模板工程(记得用 MCUXpresso IDE 导出):
- 串口例程:\SDK_2.10.1_EVK-MIMXRT1060\boards\evkmimxrt1060\demo_apps\hello_world
hello_world 模板工程里使能的是 i.MXRT1062 UART1(管脚是 GPIO_AD_B0[13:12]]),我们查看 EVB_AIoT 板原理图,这两个 UART1 信号同样被引了出来(即下图 AT_PC_UART 信号),不过用了模拟开关 BCT4699 做了切换设计,这里我们需要改一下默认设置,将母板上 SW1 开关拨到 1-2,这样 UART1 就被连到了板载调试器虚拟串口上:
1. 开关 SW1 选择 2-3(出厂默认设置):
- 母板接插无线模块连通母板 DAP-Link 调试器虚拟串口
2. 开关 SW1 选择 1-2:
- 子板主控 UART2 连通母板接插无线模块
- 子板主控 UART1 连通母板 DAP-Link 调试器虚拟串口
虽然不用更改 hello_world 模板工程的源代码,但是我们还是要按照第一篇文章 《开发环境搭建与点灯》 第 2.3 小节里指示在工程属性里勾选上 Link application to RAM 选项,此外还要调整一下工程属性 Memory details 窗口里 SRAM_DTC 的位置,不同于 led_blinky 模板工程默认用 SRAM_DTC 作主链接 RAM,这个 hello_world 模板工程默认是用外接 SDRAM 作为主链接 RAM,这个会涉及 SDRAM 初始化脚本加载问题,我们先不考虑这个问题,直接将 RAM3 移动到 RAM 位置:
改完后编译工程,使用板载 DAP-Link 下载工程调试,然后用串口调试助手软件打开板载 DAP-Link 调试器虚拟出的 mbed Serial Port,在 IDE 里按 F8(Resume)键让程序跑起来,这时候应该能看到 'hello world.' 的打印输出。
二、i.MXRT1062 离线启动
目前为止,我们跑的两个例程 led_blinky 和 hello_world 均是在 i.MXRT1062 内部 TCM 里在线调试,板子断电后程序就丢失了。那么如何去使能离线启动呢?
这里就开始涉及 i.MXRT1062 启动话题了,建议先通读痞子衡旧文 《i.MXRT Boot简介》。i.MXRT1062 内部并没有非易失性代码存储器,所以你会在 EVB_AIoT 子板上看到有两颗华邦 W25Q64JVSIQ Flash,一颗连到了芯片 FlexSPI1 外设(管脚 GPIO_SD_B1[11:06],这并不是唯一的启动连接 pinmux 选择,详见 《i.MXRT1060 FlexSPI NOR启动连接方式大全》 ),另一颗连到了芯片 LPSPI3 外设(管脚 GPIO_AD_B0[3:0]),这两颗 Flash 都可以用于存储应用程序代码去启动,只不过前一种连接方式能支持 XiP,后者不支持 XiP,一般情况下我们更多是用 FlexSPI 连接的 NOR Flash 去做离线启动:
i.MXRT1062 的启动工作主要是由固化在芯片内部的 ROM bootloader 来实现的,因为 ROM bootloader 在设计时要求支持非常多种类的存储器(串并行NOR/串并行NAND/SD卡/eMMC等)去启动,所以其定义了一套启动头来辅助启动,详见 《i.MXRT Bootable image格式与加载》一文。
对于连接在 FlexSPI 外设上的串行 NOR Flash,其至少需要三个启动头,包括 qspiflash_config、image_vector_table、boot_data,它们需要被烧写到 Flash 中的固定偏移位置:0x0、0x1000、0x1020,这三个启动头已经在模板工程目录 xip 文件夹里的源文件里了。image_vector_table、boot_data 头正常不需要改动,qspiflash_config 头因连接的 Flash 而异:
三、MCUXpresso IDE下在Flash调试
要实现在 Flash 调试,首先 IDE 要能把应用程序下载进 Flash,其次被下载的应用程序要能够从 Flash 中正常启动。前者需要一个合适的 Flash 下载算法(请阅读 《MCUXpresso IDE串行NOR Flash下载算法》一文),后者需要正确的启动头以及芯片启动模式设置(请阅读 《MCUXpresso IDE下在线调试时使用不同复位策略的现象总结》 一文)。
板级设置方面只需要检查下子板上的 J2 拨码开关状态是不是 1-off, 2-on,即主控芯片 BOOT_MODE[1:0] 为 2'b10 - 从 Flash 启动模式,注意这个 J2 拨码开关的设置仅 POR 复位有效。
因为 EVB_AIoT 板上使用的这颗华邦 W25Q64JVSIQ 与恩智浦官方 MIMXRT1060-EVK 评估板上使用的芯成 IS25WP064AJBLE 特性类似,均是符合 JESD216A 标准的四线串行 NOR Flash,而且管脚连接也一致,所以它俩对于 i.MXRT 来说下载算法和启动头是一样的,我们不需要做任何改动,直接使用模板工程配置就行了。
在 MCUXpresso IDE 工程里去掉 Link application to RAM 选项,再检查下 LinkServer flash driver 的设置,这个默认 MIMXRT1060_SFDP_QSPI.cfx 下载算法直接可以用于下载调试 EVB_AIoT 子板上的华邦 Flash。试试看你可以在 Flash 里单步调试这个 hello_world 例程的。
四、独立烧录工具
除了在 MCUXpresso IDE 里通过调试器去下载程序进 Flash 启动,恩智浦还提供了独立的上位机工具来完成程序烧录,这主要借助了 i.MXRT1062 的 ROM bootloader 以及二级 Flashloader 设计,这个功能不是依靠 SWD 调试口来下载程序,而是主控芯片上指定的 UART1(GPIO_AD_B0[13:12]) 或者 USB OTG1 口去下载。
EVB_AIoT 母板上将 USB OTG1 信号引到了 PCIe 接头上,所以我们不方便用 USB 口去下载程序,只能用连到母板板载 DAP-Link 调试器虚拟串口上的 UART1 去下载了(这也是第一小节跑通串口打印例程的用意,确认下串口没问题)。
使用独立烧录工具下载前,必须先将子板上的 J2 拨码开关状态设为 1-on, 2-off,即主控芯片 BOOT_MODE[1:0] 为 2'b01 - 串行下载模式,再次提醒这个 J2 拨码开关的设置仅 POR 复位有效。下载完成后需要将 J2 切回到 1-off,2-on 看芯片启动效果。
独立烧录软件均支持常见的应用程序镜像文件格式(.elf/.axf/.srec/.hex/.bin),你随便用哪种格式都可以完成下载,非常方便。
4.1 MCUBootUtility
4.2 MCUXpresso Secure Provisioning Tool
至此,i.MXRT1062 TencentOS Tiny EVB_AIoT开发板在Flash调试与离线启动痞子衡便介绍完毕了,掌声在哪里~~~
欢迎订阅
文章会同时发布到我的 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。