ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.1)- 玩转板载OpenSDA,Freelink调试器

2021-04-16 15:08:20  阅读:207  来源: 互联网

标签:板载 EVK DAPLink 恩智浦 Flash 固件 MXRT 调试器


本文是i.MXRT硬件那些事系列第二篇,第一篇痞子衡给大家整体介绍了i.MXRT官方EVK,从本文开始痞子衡将细聊EVK上的组件,今天要讲的是一个非常经典而且常用的组件 - 板载调试器。如今各大半导体厂商推出的EVK基本都会配置自己家设计的板载调试器,方便客户开箱即用,不需要自己额外准备仿真器。众所周知,在嵌入式开发里调试器的作用是非常巨大的,用好调试器可以事半功倍。那么恩智浦出品的板载调试器有哪些特点呢?痞子衡将会为你揭秘


  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦i.MX RT1xxx系列EVK上板载调试器的用法。

  本文是i.MXRT硬件那些事系列第二篇,第一篇痞子衡给大家整体介绍了i.MXRT官方EVK,从本文开始痞子衡将细聊EVK上的组件,今天要讲的是一个非常经典而且常用的组件 - 板载调试器。如今各大半导体厂商推出的EVK基本都会配置自己家设计的板载调试器,方便客户开箱即用,不需要自己额外准备仿真器。众所周知,在嵌入式开发里调试器的作用是非常巨大的,用好调试器可以事半功倍。那么恩智浦出品的板载调试器有哪些特点呢?痞子衡将会为你揭秘:

一、背景简介

  说到i.MXRT系列EVK板载调试器的背景,那真是一段长长的历史。恩智浦在2015年收购了飞思卡尔,这两家知名半导体公司在这之前都设计了自己的板载调试器,飞思卡尔是OpenSDA调试器,主要用于Kinetis系列Tower/FRDM开发板;恩智浦是LPC-Link调试器,主要用于LPC系列LPCXpresso开发板。i.MXRT系列是在两家合并之后新推出的MCU产品,那么到底要采用哪一种板载调试器呢?设计i.MXRT EVK的工程师也曾纠结过,这个纠结最终也反映到了i.MXRT EVK上。
  i.MXRT系列最先发布的两款芯片是RT1050、RT1020,其后是RT1060、RT1015、RT1010、RT1170...,让我们分别打开它们EVK原理图找到其中板载调试器接口部分,如下所示:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

  早期i.MXRT芯片(RT1050/RT1020)EVK上配置的是OpenSDA调试器,从RT1060以及之后的芯片开始,EVK上板载调试器全部换成了Freelink(其实Freelink就是LPC-Link,在i.MXRT EVK上叫LPC-Link听起来怪怪的,所以改了个名字),为什么会从OpenSDA调试器换到Freelink调试器?因为i.MXRT芯片主要是由原飞思卡尔团队设计的,所以板载调试器第一选择当然是轻车熟路的OpenSDA,但是Freelink主控芯片LPC4322(双核CM4+CM0, 204MHz)相比OpenSDA主控MK20DX128(单核CM4, 50MHz)要强大得多,使用LPC4322作为调试器主控不仅性能更佳,未来功能拓展性也更好(君不见SEGGER J-Link从V10开始主控也选择了LPC4300系列LPC4337),因此高性能的Freelink调试器显然更适合i.MXRT EVK。
  看起来当前i.MXRT EVK存在两种不同的调试器接口,不过仅从功能上来说,OpenSDA和Freelink有区别吗?其实没有区别,恩智浦出厂为这两种不同的调试器主控烧录了相同的固件DAPLink,DAPLink是ARM官方开源的Cortex-M调试器项目,在DAPLink项目主页上,MK20和LPC4322均在器件支持列表里,并且ARM官方还为OpenSDA和LPC-Link电路做了I/O级别的兼容:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

二、核心功能

  上一节讲了无论是OpenSDA接口还是Freelink接口的调试器,其实从调试使用角度来说,它们本质上都是DAPLink调试器,其功能特点都取决于DAPLink固件,继续回到DAPLink项目主页,可以看到如下功能介绍:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

  总体来说DAPLink固件主要有三大功能,第一是CMSIS-DAP协议的在线调试,知名IDE(Keil MDK、IAR EWARM)里都有CMSIS-DAP协议选项;第二是虚拟串口,嵌入式开发里,串口是常用的交互方式,DAPLink使用USB CDC虚拟了串口,为你省去了一个USB转串口的模块(如CH340T模块);第三是拖拽进U盘下载,DAPLink还额外做了一个U盘拖拽下载的功能,方便用户将应用程序下载到片内/片外Flash里。需要注意的是,虚拟串口与U盘下载功能都是板级相关的,跟I/O连接以及Flash型号绑定了。

三、使用示例

  讲完了DAPLink三大核心功能,下面痞子衡将结合恩智浦官方SDK里的示例工程为大家具体演示这三大功能。

3.1 准备工作

  • 准备一块IMXRT1050-EVKB(Rev.A)或者MIMXRT1060-EVK(Rev.A1),假设板载调试器里的DAPLink固件是完好的。
  • 准备一台PC,最好是Win10系统,如果是Win10以下系统需要手动安装好 serial port driver,注意要连接EVK上安装驱动,详见 安装注意事项。
  • 准备一根Micro USB连接线,一端接上EVK的J14口,另一端连PC,EVK供电方式选择DAPLink(将J1的Pin5和Pin6连接)。
  • 在PC上安装至少一个IDE(MCUXpresso/MDK/IAR),痞子衡安装的是IAR EWARM v8.32.2。
  • 进入 MCUXpresso SDK Builder主页 下载最新的RT1050或RT1060 SDK开发包,Toolchain全部勾选上。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

  一切准备工作就绪,你应该可以看到EVK上电源灯D3显示黄色,这表明DAPLink供电正常,再打开设备管理器,可以看到如下三处设备,表明DAPLink驱动也在正常工作。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

3.2 演示一:在线调试

  首先演示的是在线调试,其实更准确的说是在内部SRAM中调试,即利用板载DAPLink调试器直接将应用程序下载进i.MXRT内部SRAM中,并跳转到应用程序中单步执行。当然有朋友会疑问,除了在内部SRAM调试,还有在外部SDRAM调试和在外部SPI NOR Flash调试,后两种不是本小节讨论的内容,痞子衡会在后续的文章中再细聊。
  以RT1050-EVKB为例,使用IAR打开SDK里的 \boards\evkbimxrt1050\demo_apps\hello_world\iar 工程,hello_world是SDK里最典型的例程,该例程一共包含6个Project build(不算xx_debug/xx_release区别),其中debug或ram_0x1400_debug是链接到SRAM中的工程(.text段在ITCM里,.data段在DTCM里),这两个build即可用作在SRAM调试,选中debug工程,确认工程Options里的Debugger选的是CMSIS-DAP,然后点击IAR菜单栏上的“Download and Debug (Ctrl+D)”按钮,便能进入单步调试。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

3.3 演示二:虚拟串口

  继续演示虚拟串口,RT1050/RT1060 SDK里hello_world例程使能的是UART1(GPIO_AD_B0_12/13),OpenSDA/Freelink主控芯片与i.MXRT芯片的UART连接正是这个,因此DAPLink虚拟出来的串口可直接用于hello_world例程。
  进入hello_world工程单步调试以后,随便打开一个串口调试助手,COM口设为39(与3.1节里设备管理器里设备号一致),然后直接按F5运行,可以在串口调试助手接收区里看到"hello world."打印出来。如果没有看到打印信息,请检查J30/J31(RT1050-EVKB)或J45/J46(RT1060-EVK)是否已连接。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

3.4 演示三:U盘拖拽下载

  最后演示U盘拖拽下载,前面讲的在线调试是把应用程序直接下载到i.MXRT内部SRAM中,断电重启后应用程序就丢失了,而U盘拖拽下载是将应用程序下载到外部SPI NOR Flash中,断电重启后ROM会负责启动SPI NOR Flash中的程序,因此可以实现离线运行。如果你看过痞子衡 《i.MXRT启动那些事》 系列文章,你应该知道所有类型的应用程序都可以存储在SPI NOR Flash中,无论是在Flash中XIP执行,还是在SRAM/SDRAM中执行,但是这些需要离线运行的应用程序必须要加上必要的i.MXRT启动头(FDCB,IVT, BootData)形成Bootable image才可以存储在SPI NOR Flash中,而U盘拖拽下载仅适用Bootable image。
  仍以RT1050-EVKB为例,前面说过hello_world一共包含6个Project build,其中flexspi_nor_debug和flexspi_nor_sdram_debug工程可以直接生成Bootable image,因为这两个Build使能了XIP_BOOT_HEADER_ENABLE,这个宏决定了evkbimxrt1050_flexspi_nor_config.c中的hyperflash_config结构体常量和fsl_flexspi_nor_boot.c中的image_vector_table、boot_data结构体常量是否会被链接进最终的可执行文件。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

  痞子衡讲过,U盘拖拽下载是跟Flash类型相关的,咱们再打开RT1050-EVKB原理图,找到其中NOR Flash部分,从原理图上来看,RT1050-EVKB有两种类型NOR Flash可选,分别是八线HyperFlash(S26KS512SDPBHI02)和四线QSPI Flash(IS25WP064AJBLE),而默认连接的是八线HyperFlash,SDK例程里的flexspi_nor_xx build使能的启动头(FDCB)也正是对应HyperFlash(即evkbimxrt1050_flexspi_nor_config.c文件里的hyperflash_config)。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

  在进行U盘拖拽之前,首先需要设置RT1050-EVKB的拨码开关SW7,从原理图上看,SW7的3、4位对应Boot Mode,我们需要将Boot Mode设为2'b01,即设置i.MXRT芯片进入Serial Downloader模式,然后重新上电,再进行U盘拖拽下载。为什么需要这么做?这是因为如果i.MXRT芯片处于非Serial Downloader模式(比如Internal Boot),板子上电,ROM会尝试初始化FlexSPI模块去访问外部Flash,如果FlexSPI模块被初始化过一次,这可能会导致DAPLink中的FlexSPI驱动不能正常工作。
  现在让我们选中flexspi_nor_debug工程,确认工程Options里Output Converter中Output format选择的是"Raw binary",编译工程生成可执行文件hello_world.bin,然后将这个bin文件拖拽进名为 "RT1050-EVK" 的虚拟U盘里:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

  U盘拖拽下载已成功,现在让我们检验一下应用程序是否能够离线运行,首先需要将Boot Mode设为2'b10,即设置i.MXRT芯片进入Internal Boot模式,然后还需要设置i.MXRT从外部SPI NOR Flash启动,从原理图上看,SW7的1、2位对应BOOT_CFG[9]、BOOT_CFG[6],我们需要将BOOT_CFG[6]设成1'b0,即从FlexSPI1 NOR启动,然后再将BOOT_CFG[9]设成1'b1,即FLASH_TYPE选择010 - HyperFlash 1V8,与EVK上连接的Flash类型保持一致。此时断电重启,你应该可以看到hello world离线运行了。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

  至于RT1060-EVK的U盘拖拽下载,其实与RT1050-EVKB差不多,只是需要注意的是RT1060-EVK上默认连接的Flash是四线QSPI Flash,SDK例程里的flexspi_nor_xx build使能的启动头(FDCB)也对应的是QSPI Flash(即evkimxrt1060_flexspi_nor_config.c文件里的qspiflash_config)。U盘下载成后BOOT_CFG[9]需设成1'b0,即FLASH_TYPE选择000 - Device supports 3B read by default。

四、更新固件

  讲完了DAPLink调试器的功能与使用,最后再介绍一下更新DAPLink固件的方法。那么我们为什么需要更新DAPLink固件?我们知道ARM官方一直在维护DAPLink项目,代码也在不断地更新,或修复bug或新增功能,使用最新的DAPLink固件总不是坏事。有人可能会说,只要旧的DAPLink固件功能足够我使用,我就没有必要更新,确实有一定道理,但出现如下两种情况,你就不得不更新DAPLink固件:

  • 你为i.MXRT-EVK更换了Flash连接(比如从HyperFlash换到了QSPI Flash),而且你还想继续使用DAPLink的U盘拖拽下载
  • i.MXRT官方SDK的重大升级,并且DAPLink固件与SDK存在某种联系。据痞子衡所知,SDK 2.3.x的时候,DAPLink是可以自动为拖拽进U盘的裸image加启动头的,而到了SDK 2.6.x的时候,DAPLink就是直接下载Bootable image。

  现在让我们试一下更换DAPLink固件,其实操作很简单,你还记得DAPLink调试器的U盘拖拽下载吗?其实DAPLink固件的更新也是用U盘拖拽下载的方式,因为DAPLink项目本身包含DAPLink Bootloader和DAPLink固件,下载用户应用程序我们借助的是DAPLink固件,而更新DAPLink固件,我们则需要借助DAPLink Bootloader。
  首先让我们准备一个DAPLink固件,我们不需要去DAPLink项目主页自己去编固件,直接进到恩智浦 OpenSDA主页 ,还是以RT1050-EVKB为例吧,默认DAPLink固件是支持onboard hyper-flash的,我们现在将其换为支持onboard spi-flash的固件,点击DAPLink v0244 - Supports onboard spi-flash下面的Download Binary即可下载到k20dx_mimxrt1050_evk_qspi_if_crc_20180419.zip包,将包解压后里面即是我们要的固件(.bin格式)。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

  有了新固件,这时候需要让DAPLink进入Bootloader模式,确认J27(RT1050-EVKB)/J43(RT1060-EVK)连接的是Pin1-2,然后按住SW4(RT1050-EVKB)/SW9(RT1060-EVK)按钮,断电重启,如果出现名为 "MAINTENANCE" 的虚拟U盘,即表明进入DAPLink Bootloader模式成功,这时候将新固件拖拽进去即大功告成。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

  至此,恩智浦i.MX RT1xxx系列EVK上板载调试器的用法痞子衡便介绍完毕了,掌声在哪里~~~


标签:板载,EVK,DAPLink,恩智浦,Flash,固件,MXRT,调试器
来源: https://blog.51cto.com/u_12094353/2711166

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有