本帖最后由 小恩GG 于 2021-9-24 10:56 编辑
【经验分享】RT600 MCUXpressoJLINK debug QSPI flash 一 文档简介 MIMXRT600-EVK官方开发板板载使用的外部flash是octal flash,放在flexSPIportB口。但是实际使用中,很多客户定制板需要更换外部flash类型以及flexSPI端口,官方最近推出一个关于RT600 customer flash的应用笔记: 该文章主要讲的还是使用CMSIS DAP的相关烧录算法,通过修改option的方式去修改对应的flexSPI端口与flash类型。 最近遇到一些客户开发板使用了RT600结合外部QSPI flash在MCUXpressoIDE中使用JLINK 仿真下载遇到了不能下载的问题,但是使用CMSIS DAP结合对应的QSPI cfx却能下载,所以在此总结相关经验,讲解如何在RT600结合MCUXPresso IDE中使用JLINK去仿真下载代码到外部QSPI flash。 二 JLINK 驱动准备与测试 MCUXpressoIDE使用JLINK下载,最终调用的还是JLINK驱动下的脚本以及烧录算法,而下载的JLINK驱动,默认选择了MIMXRT600之后,匹配的外部flash就是EVK自带的octal flash烧录算法,这样如果不提供对应QSPI flash烧录算法文件,虽然客户板子能够找到内核,但是却不能成功操作外部flash。所以如果想要在MCUXPresso IDE中使用JLINK,首先要保证JLINK驱动自带的软件能够成功的操作外部flash,比如擦除读写。下面给出具体JLINK驱动如何添加RT600 QSPI flash的驱动与脚本。 2.1 JLINK驱动安装 本文测试使用V7.54b,其他版本测试方法一样。 下载并安装,安装之后的默认路径为:C:\ProgramFiles\SEGGER 2.2 超级下载算法RT-UFL RT-UFL v1.0是NXP SE团队研发的一款涵盖NXP 官方MIMXRT-EVK下载算法与不同型号flash的超级下载算法,主要针对Segger JLINK 调试器。 RT-UFL v1.0下载地址: 具体可以参考: 下面针对RT600QSPI具体给出算法补丁。 \RT-UFL-1.0\algo\SEGGER\JLink_Vxxx路径下的全部文件拷贝覆盖到\SEGGER\JLink 目录,然后把C:\ProgramFiles\SEGGER\JLink\Devices\NXP\iMXRT_UFL\iMXRT6xx_CortexM33.JLinkScript 脚本内容替换为超级算法下的如下脚本内容: RT-UFL-master\test\SEGGER\JLink_Vxxx\Devices\NXP\iMXRT6xx\archive2\evkmimxrt685.JLinkScript 否则会导致MCUXpresso debug界面复位按钮复位不成功。 图1 超级算法提供了三种RT600下载算法:MIMXRT600_UFL_L0, MIMXRT600_UFL_L1, MIMXRT600_UFL_L2. 图2 其中 _L0 后缀算法适用于 QSPI Flash 和 Octal Flash(Page 大小是256 Bytes,Sector大小是 4KB),_L1/2 后缀算法适用于 Hyper Flash(Page大小是512 Bytes,Sector大小是 4KB/64KB)。 2.3 JLINK commander 测试 注意device选择为:MIMXRT600_UFL_L0 图3
图4 图5 可以看到,上述实现了外部flash的读,擦除。 2.4 Jflash 测试 操作步骤Target->connect->productionprogramming 图6 由此可见,JFLASH完成了RT600外部QSPI的擦除与烧录。 不过需要注意,不是所有JLINK都能支持JFLASH,本文使用的是Segger JLINK plus. 三 MCUXpresso配置与测试 MCUXpresso: v11.4.0 SDK_2_10_0_EVK-MIMXRT685 MCUXPresso IDE导入SDK工程,比如helloworld,或者led_output。 3.1 QSPI FCB 配置 FCB是放在flash偏移地址0X08000400开始用于flexSPI NOR boot的头代码,具体的内容定义请查看RT600 usermanual的Table 997. FlexSPI flash configuration block。 不同的外部flash配置不一样,如果外部使用QSPI flash,需要定义FCB为对应的QSPI以及LUT。 修改SDK flash_config文件夹下的flash_config.c。LUT包含fast read, status read, write enable, sectorerase, block erase, page program, erase whole chip.如果使用的外部QSPI flash相关命令不一样,需要根据对应的memory芯片datasheet去修改对应LUT的命令。
- const flexspi_nor_config_t flexspi_config = {
- .memConfig =
- {
- .tag = FLASH_CONFIG_BLOCK_TAG,
- .version = FLASH_CONFIG_BLOCK_VERSION,
- .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackInternally,
- .csHoldTime = 3,
- .csSetupTime = 3,
- .columnAddressWidth = 0,
- .deviceModeCfgEnable = 0,
- .deviceModeType = 0,
- .waitTimeCfgCommands = 0,
- .deviceModeSeq = {.seqNum = 0,
- .seqId = 0,},
- .deviceModeArg = 0,
- .configCmdEnable = 0,
- .configModeType = {0},
- .configCmdSeqs = {0},
- .configCmdArgs = {0},
- .controllerMiscOption = (0),
- .deviceType = 1,
- .sflashPadType = kSerialFlash_4Pads,
- .serialClkFreq = kFlexSpiSerialClk_133MHz,
- .lutCustomSeqEnable = 0,
- .sflashA1Size = BOARD_FLASH_SIZE,
- .sflashA2Size = 0,
- .sflashB1Size = 0,
- .sflashB2Size = 0,
- .csPadSettingOverride = 0,
- .sclkPadSettingOverride = 0,
- .dataPadSettingOverride = 0,
- .dqsPadSettingOverride = 0,
- .timeoutInMs = 0,
- .commandInterval = 0,
- .busyOffset = 0,
- .busyBitPolarity = 0,
- .lookupTable =
- {
- #if 0
- [0] = 0x08180403,
- [1] = 0x00002404,
- [4] = 0x24040405,
- [12] = 0x00000604,
- [20] = 0x081804D8,
- [36] = 0x08180402,
- [37] = 0x00002080,
- [44] = 0x00000460,
- #endif
- // Fast Read
- [4*0+0] = FLEXSPI_LUT_SEQ(CMD_SDR , FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
- [4*0+1] = FLEXSPI_LUT_SEQ(MODE4_SDR, FLEXSPI_4PAD, 0x00, DUMMY_SDR , FLEXSPI_4PAD, 0x09),
- [4*0+2] = FLEXSPI_LUT_SEQ(READ_SDR , FLEXSPI_4PAD, 0x04, STOP_EXE , FLEXSPI_1PAD, 0x00),
- //read status
- [4*1+0] = FLEXSPI_LUT_SEQ(CMD_SDR , FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x04),
- //write Enable
- [4*3+0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP_EXE, FLEXSPI_1PAD, 0),
- // Sector Erase byte LUTs
- [4*5+0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20, RADDR_SDR, FLEXSPI_1PAD, 0x18),
- // Block Erase 64Kbyte LUTs
- [4*8+0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xD8, RADDR_SDR, FLEXSPI_1PAD, 0x18),
- //Page Program - single mode
- [4*9+0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02, RADDR_SDR, FLEXSPI_1PAD, 0x18),
- [4*9+1] = FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x04, STOP_EXE, FLEXSPI_1PAD, 0x0),
- //Erase whole chip
- [4*11+0]= FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60, STOP_EXE, FLEXSPI_1PAD, 0),
- },
- },
- .pageSize = 0x100,
- .sectorSize = 0x1000,
- .ipcmdSerialClkFreq = 1,
- .isUniformBlockSize = 0,
- .blockSize = 0x10000,
- };
复制代码
该code在QSPI flash MT25QL128ABA1ESE结合RT685上测试过,可以成功boot。 3.2 Debug configuration 配置 选择MCUXpresso IDE中JLINK options为JLINK驱动的JLinkGDBServerCL.exe Windows->preferences 图7 按debug,生成.launch文件。 图8 Run->Debug configurations 图9 选择device为MIMXRT600_UFL_L0,如果SWD接线过长,导致debug不够稳定,也可以指定speed为低频去测试。 3.3 下载debug测试 下载之前需要注意ISP模式的配置,本文使用外部4线QSPI 接在FlexSPI A port,所以需要配置ISP boot mode 为 FlexSPI boot from Port A: ISP2 PIO1_17 low, ISP1 PIO1_16 high, ISP0 PIO1_15 high 选择debug,可以看到能够成功的进入debug,并且进入到main函数: 图10 运行起来之后,可以发现P0_26波形翻转,接口打印有数据。 四 外部QSPI flash功能检查经验 对于客户自制的板子,通常需要先使用JLINK commander看是否能找到内核,如果能找到内核之后,可以使用如下方法去验证外部的QSPI flash是否能够工作。 4.1 SDK IAP flash代码测试 SDK_2_10_0_EVK-MIMXRT685\boards\evkmimxrt685\driver_examples\iap\iap_flash 根据外部使用的FLASH情况,修改代码中的option0,option1.关于option0,option1的定义查看RT600 user manual Table 1004.Option0 definition 和Table 1005.Option1 definition 图11 图12 对于外部的QSPI flash接到FlexSPI portA,可以修改代码配置如下: option.option0.U = 0xC0000001;//EXAMPLE_NOR_FLASH; option.option1.U= 0x00000000;//EXAMPLE_NOR_FLASH_OPTION1; 烧录IAP_flash的代码到内部RAM,并且debug运行: 图13 可以看到,外部memory初始化,擦除,读写都成功运行,而且memory查看对应flash区域的数据也是正确的。 4.2 MCUBootUtility 测试 芯片进入ISP模式,然后使用MCUBootUtility tool去做连接,烧录读取测试。 ISP模式:ISP2:high, ISP1: high, ISP0 low 配置 FlexSPI NOR Device Configuration 为QSPI, 可以使用现成的ISSI_IS25LPxxxA_IS25WPxxxA模板。 图14 点击connect to ROM, 查看是否能够识别外部芯片,并且读出芯片size。 图15 连接成功后,可以下载工具自带的image,是读写是否成功: NXP-MCUBootUtility-3.3.1\apps\NXP_MIMXRT685-EVK_Rev.E\led_blinky_0x08001000_fdcb.srec 图16 可以看到连接读写均可以成功,说明外部QSPI flash已经成功运行。
evkmimxrt685_iap_flash_qspiA.zip
(7.95 MB, 下载次数: 14)
|