大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是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主页、知乎主页、微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:把玩i.MXRT1062 TencentOS Tiny EVB_AIoT开发板(2) - 在Flash调试及离线启动的更多相关文章

  1. 痞子衡嵌入式:把玩i.MXRT1062 TencentOS Tiny EVB_AIoT开发板(1) - 开发环境搭建与点灯

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1062 TencentOS Tiny EVB_AIoT开发板环境搭建与点灯. 腾讯 TencentOS 团队于2021年1 ...

  2. 痞子衡嵌入式:知名半导体MCU大厂软件开发C代码规范

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是飞思卡尔软件开发C语言编码规范. 2020鼠年春节是个漫长的假期,痞子衡在家百无聊赖,翻出了2016年10月1日(这个时间是痞子衡正式开始 ...

  3. 痞子衡嵌入式:深入i.MXRT1050系列ROM中串行NOR Flash启动初始化流程

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是深入i.MXRT1050系列ROM中串行NOR Flash启动初始化流程. 从外部串行NOR Flash启动问题是i.MXRT系列开发最 ...

  4. 痞子衡嵌入式:了解i.MXRT1060系列ROM中串行NOR Flash启动初始化流程优化点

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1060系列ROM中串行NOR Flash启动初始化流程优化点. 前段时间痞子衡写了一篇 <深入i.MXRT1050系 ...

  5. 痞子衡嵌入式:高性能MCU之Media应用开发那些事 - 索引

    大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是高性能MCU之Media应用开发相关知识. 飞思卡尔半导体(现恩智浦半导体)2017年推出的i.MX RT系列第一款芯片i.MXRT1 ...

  6. 痞子衡嵌入式:飞思卡尔Kinetis系列MCU开发那些事 - 索引

    大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是飞思卡尔Kinetis系列微控制器相关知识. 飞思卡尔半导体(现恩智浦半导体)于2010年开始推出的Kinetis系列昭示着ARM C ...

  7. 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU硬件那些事(2.2)- 在串行NOR Flash XIP调试原理

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列EVK在串行NOR Flash调试的原理. 本文是i.MXRT硬件那些事系列第二篇的续集,在第二篇首集 ...

  8. 痞子衡嵌入式:记录i.MXRT1060驱动LCD屏显示横向渐变色有亮点问题解决全过程(提问篇)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1060上LCD横向渐变色显示出亮点问题的分析解决经验. 痞子衡前段时间在支持一个i.MXRT1060客户项目时遇到了LCD ...

  9. 痞子衡嵌入式:基于恩智浦i.MXRT1060的MP4视频播放器(RT-Mp4Player)设计

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是基于i.MXRT1062的MP4播放器参考设计. i.MXRT1062是恩智浦i.MXRT四位数系列的中端型号,外设搭配上很均衡,辅以6 ...

随机推荐

  1. 洛谷 P3783 - [SDOI2017]天才黑客(前后缀优化建图)

    题面传送门 神仙题一道. 首先注意到这里的贡献涉及到边的顺序,并且只与相邻的边是什么有关,因此不难想到一个做法--边转点,点转边,具体来说对于每条边 \(e\),我们将其拆成两个点 \(in_e,ou ...

  2. ggplot2 颜色渐变(离散颜色)设置

    一.示例数据准备 数据格式如下: 二.作图 1.直接作图结果如下,默认蓝色渐变. 1 ggplot(df,aes(x=BP_A,y=P.value,colour=R2))+ 2 geom_point( ...

  3. chmod文件权限分配问题

    一. 文件(文件夹)的权限问题 一个文件或者文件夹,使用它的人有三类:root.当前用户和其他用户,例如,我们可以通过 ls -l xxx.xxx 来查看文件 "xxx.xxx" ...

  4. MPI 学习笔记

    目录 MPI学习笔记 MPI准备 概述 前置知识补充 环境部署 1.修改IP及主机名 2.关闭防火墙 3.实现免密码SSH登录 4.配置MPI运行环境 5.测试 程序的执行 编译语句 运行语句 MPI ...

  5. Redis6 新特性

    Redis6新特性 ACL安全策略 ACL(access control list): 访问控制列表,可以设置多个用户,并且给每个用户单独设置命令权限和数据权限 default用户和使用require ...

  6. Scala(八)【面向对象总结】

    面向对象总结 面向对象 1.scala包 1.声明包 1.在文件第一行通过package 包名 2.package 包名{ .... } 第二种方法,包名只能在target目录才能看到 2.导入包 1 ...

  7. react动态添加样式:style和className

    react开发过程中,经常会需要动态向元素内添加样式style或className,那么应该如何动态添加呢??? 一.react向元素内,动态添加style 例如:有一个DIV元素, 需要动态添加一个 ...

  8. 【swift】Xcode未响应(卡死、卡住、CPU满载、忙碌、转圈圈)

    在尝试了网上的方法,依然没能解决问题,尝试如下: 1.去自己项目的路径,找到<你的项目名.xcodeproj>,点击[显示包内容],删除xcuserdata文件夹 2.去Library,把 ...

  9. Stream.toMap

    Collectors类的tomap方法将流收集到映射实例中. list 转 map collection.stream().collect(Collectors.toMap(User::getId, ...

  10. GO 时间处理

    比较大小 比较大小 先把当前时间格式化成相同格式的字符串,然后使用time的Before, After, Equal 方法即可. time1 := "2015-03-20 08:50:29& ...