查看: 6456|回复: 2

[原创] 【经验分享】RT600 MCUXpresso JLINK debug QSPI flash

[复制链接]

该用户从未签到

713

主题

6372

帖子

0

超级版主

Rank: 8Rank: 8

积分
25023
最后登录
2025-7-31
发表于 2021-9-23 16:46:51 | 显示全部楼层 |阅读模式
本帖最后由 小恩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.jpg
图1
超级算法提供了三种RT600下载算法:MIMXRT600_UFL_L0, MIMXRT600_UFL_L1, MIMXRT600_UFL_L2.
2.jpg
图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.jpg
图3  
4.jpg                                           
图4
5.jpg
图5
可以看到,上述实现了外部flash的读,擦除。
2.4 Jflash 测试
操作步骤Target->connect->productionprogramming
6.jpg
图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的命令。

  1. const flexspi_nor_config_t flexspi_config = {
  2.     .memConfig =
  3.         {

  4.                 .tag                  = FLASH_CONFIG_BLOCK_TAG,
  5.                 .version              = FLASH_CONFIG_BLOCK_VERSION,
  6.                 .readSampleClkSrc     = kFlexSPIReadSampleClk_LoopbackInternally,
  7.                 .csHoldTime           = 3,
  8.                 .csSetupTime          = 3,
  9.                 .columnAddressWidth   = 0,
  10.                 .deviceModeCfgEnable  = 0,
  11.                 .deviceModeType       = 0,
  12.                 .waitTimeCfgCommands  = 0,
  13.                 .deviceModeSeq        = {.seqNum = 0,
  14.                                          .seqId  = 0,},
  15.                 .deviceModeArg        = 0,
  16.                 .configCmdEnable      = 0,
  17.                 .configModeType       = {0},
  18.                 .configCmdSeqs        = {0},
  19.                 .configCmdArgs        = {0},
  20.                 .controllerMiscOption = (0),
  21.                 .deviceType           = 1,
  22.                 .sflashPadType        = kSerialFlash_4Pads,
  23.                 .serialClkFreq        = kFlexSpiSerialClk_133MHz,
  24.                 .lutCustomSeqEnable   = 0,
  25.                 .sflashA1Size         = BOARD_FLASH_SIZE,
  26.                 .sflashA2Size         = 0,
  27.                 .sflashB1Size         = 0,
  28.                 .sflashB2Size         = 0,
  29.                 .csPadSettingOverride = 0,
  30.                 .sclkPadSettingOverride = 0,
  31.                 .dataPadSettingOverride = 0,
  32.                 .dqsPadSettingOverride  = 0,
  33.                 .timeoutInMs            = 0,
  34.                 .commandInterval        = 0,
  35.                 .busyOffset             = 0,
  36.                 .busyBitPolarity        = 0,
  37.             .lookupTable =
  38.                 {
  39. #if 0
  40.                         [0]  = 0x08180403,
  41.                         [1]  = 0x00002404,
  42.                         [4]  = 0x24040405,
  43.                         [12] = 0x00000604,
  44.                         [20] = 0x081804D8,
  45.                         [36] = 0x08180402,
  46.                         [37] = 0x00002080,
  47.                         [44] = 0x00000460,
  48. #endif

  49.                                                                    // Fast Read
  50.                                                                     [4*0+0] = FLEXSPI_LUT_SEQ(CMD_SDR  ,  FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
  51.                                                                                         [4*0+1] = FLEXSPI_LUT_SEQ(MODE4_SDR, FLEXSPI_4PAD, 0x00, DUMMY_SDR , FLEXSPI_4PAD, 0x09),
  52.                                                                                         [4*0+2] = FLEXSPI_LUT_SEQ(READ_SDR , FLEXSPI_4PAD, 0x04, STOP_EXE  , FLEXSPI_1PAD, 0x00),

  53.                                                                                         //read status
  54.                                                                                         [4*1+0] = FLEXSPI_LUT_SEQ(CMD_SDR , FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x04),

  55.                                                                                         //write Enable
  56.                                                                                         [4*3+0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP_EXE, FLEXSPI_1PAD, 0),

  57.                                                                                         // Sector Erase byte LUTs
  58.                                                                                         [4*5+0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20, RADDR_SDR, FLEXSPI_1PAD, 0x18),


  59.                                                                                         // Block Erase 64Kbyte LUTs
  60.                                                                                         [4*8+0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xD8, RADDR_SDR, FLEXSPI_1PAD, 0x18),

  61.                                                                     //Page Program - single mode
  62.                                                                                     [4*9+0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x02, RADDR_SDR, FLEXSPI_1PAD, 0x18),
  63.                                                                                         [4*9+1] = FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x04, STOP_EXE, FLEXSPI_1PAD, 0x0),

  64.                                                                                         //Erase whole chip
  65.                                                                                         [4*11+0]= FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60, STOP_EXE, FLEXSPI_1PAD, 0),


  66.                 },
  67.         },
  68.     .pageSize           = 0x100,
  69.     .sectorSize         = 0x1000,
  70.     .ipcmdSerialClkFreq = 1,
  71.     .isUniformBlockSize = 0,
  72.     .blockSize          = 0x10000,
  73. };
复制代码


该code在QSPI flash MT25QL128ABA1ESE结合RT685上测试过,可以成功boot。
3.2 Debug configuration 配置
选择MCUXpresso IDE中JLINK options为JLINK驱动的JLinkGDBServerCL.exe
Windows->preferences
7.jpg
图7
按debug,生成.launch文件。
8.jpg
图8
Run->Debug configurations
9.jpg
图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.jpg
图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.jpg
图11
12.jpg
图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.jpg
图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.jpg
图14
点击connect to ROM, 查看是否能够识别外部芯片,并且读出芯片size。
15.jpg
图15
连接成功后,可以下载工具自带的image,是读写是否成功:
NXP-MCUBootUtility-3.3.1\apps\NXP_MIMXRT685-EVK_Rev.E\led_blinky_0x08001000_fdcb.srec
16.jpg
图16
可以看到连接读写均可以成功,说明外部QSPI flash已经成功运行。
evkmimxrt685_iap_flash_qspiA.zip (7.95 MB, 下载次数: 14)
回复

使用道具 举报

该用户从未签到

1

主题

3

帖子

0

中级会员

Rank: 3Rank: 3

积分
289
最后登录
2025-7-22
发表于 2025-7-21 11:11:10 | 显示全部楼层
请问Segger新版本适配了QSPI的算法,MCUXpresso用jlink下载调试的时候怎么选择portA portB呢?
具体如下:Segger8.12
用jflash创建的时候选择device MIMXRT685S_M33,会有portA portB的选项:
微信图片_20250721110951.png
但是MCUXpresso v24.12 里面选择JLINK调试,没有弹出选择哪个port,默认用的是portB,portA接Flash的板子下载就会失败,怎么选择portA下载呢?
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

1

帖子

0

新手上路

Rank: 1

积分
12
最后登录
2025-7-28
发表于 2025-7-25 15:57:34 | 显示全部楼层
dylan11111 发表于 2025-7-21 11:11
请问Segger新版本适配了QSPI的算法,MCUXpresso用jlink下载调试的时候怎么选择portA portB呢?
具体如下:S ...

请问该问题是否解决呢,如解决,期望告知在哪里选择呢,谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-8-2 14:51 , Processed in 0.095677 second(s), 22 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表