上篇介绍了如何使用官方IDE构建开发环境,《RT1052学习笔记(二) 使用官方MCUXpressoIDE 搭建开发环境》
本篇将进一步说明如何使用Jlink进行下载调试。

工程配置

要实现下载,需要配置一下刚刚新建的工程,
因为示例工程是基于官方开发板生成的,而官方开发板默认的代码存储设备是HyperFlash。
由于HyperFlash价格偏高,大部平台应用都是外挂一片QSPI Flash,如正点原子、野火、飞凌 RT1052的开发板
上都使用的是Qspi Flash,所以我们要做相应的修改。

需要修改如下两点:
1、LinkServer Flash Driver
这是一个IDE配置项,我猜测的作用是指定编译器链接的存储设备。
选中工程 右键 -> 属性 -> C/C++ Build -> MCU settings 如下图:
选择《MIMXRT1050_SFDP_QSPI.cfx》

Flash driver.JPG

2、存储设备驱动配置文件
这是一个代码配置,用来告诉芯片内部的引导程序,该如何初始化外部的QSPI Flash,
因为RT1052支持多种多样的启动方式,所以配置也相对麻烦一点。
其实除了flash需要配置,还有一些外设需要配置,比如SDRAM。
这些配置文件都在XIP文件夹中,如下图:
其中
《evkbimxrt1050_flexspi_nor_config》 是配置存储设备驱动和一些其他参数的。
《evkbimxrt1050_sdram_ini_dcd》 是配置外部的SDRAM的。
《fsl_flexspi_nor_boot》 其中包含了两个结构体,引导区域中IVT和BD块,这写后面我还会详细说明。
XIP.JPG

接下来我们修改一下《evkbimxrt1050_flexspi_nor_config.c》文件,
原文件内结构体如下:

const flexspi_nor_config_t hyperflash_config = {
   .memConfig =
    {
        .tag                = FLEXSPI_CFG_BLK_TAG,
        .version            = FLEXSPI_CFG_BLK_VERSION,
        .readSampleClkSrc   = kFlexSPIReadSampleClk_ExternalInputFromDqsPad,
        .csHoldTime         = 3u,
        .csSetupTime        = 3u,
        .columnAddressWidth = 3u,
        // Enable DDR mode, Wordaddassable, Safe configuration, Differential clock
        .controllerMiscOption =
            (1u << kFlexSpiMiscOffset_DdrModeEnable) | (1u << kFlexSpiMiscOffset_WordAddressableEnable) |
            (1u << kFlexSpiMiscOffset_SafeConfigFreqEnable) | (1u << kFlexSpiMiscOffset_DiffClkEnable),
        .sflashPadType = kSerialFlash_8Pads,
        .serialClkFreq = kFlexSpiSerialClk_133MHz,
        .sflashA1Size  = 64u * 1024u * 1024u,
        .dataValidTime = {16u, 16u},
        .lookupTable =
            {
                // Read LUTs
                FLEXSPI_LUT_SEQ(CMD_DDR, FLEXSPI_8PAD, 0xA0, RADDR_DDR, FLEXSPI_8PAD, 0x18),
                FLEXSPI_LUT_SEQ(CADDR_DDR, FLEXSPI_8PAD, 0x10, DUMMY_DDR, FLEXSPI_8PAD, 0x06),
                FLEXSPI_LUT_SEQ(READ_DDR, FLEXSPI_8PAD, 0x04, STOP, FLEXSPI_1PAD, 0x0),
            },
    },
  .pageSize           = 512u,
  .sectorSize         = 256u * 1024u,
 .blockSize          = 256u * 1024u,
 .isUniformBlockSize = true,
 };

可以看到使用的是hyperflash,这里修改成适配我板子的驱动,我板子上的FLASH型号是W25Q128。
修改如下:

const flexspi_nor_config_t spiflash_config = {
.memConfig =
    {
        .tag = FLEXSPI_CFG_BLK_TAG,/*标志:FCFB*/
        .version = FLEXSPI_CFG_BLK_VERSION,/*版本:V1.4.0*/
        .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackInternally,/*内部环回*/
        .csHoldTime = 3u, /*保持时间*/
        .csSetupTime = 3u,/*建立时间*/
        .columnAddressWidth = 0u,/*列地址宽度*/
        .deviceModeCfgEnable = 1u,/*设备模式配置使能*/
        .deviceModeType = 1u,/*Quad 使能命令*/
        .deviceModeSeq.seqNum = 1u,/*LUT序列号*/
        .deviceModeSeq.seqId = 4u, /*LUT序列索引*/    
        .deviceModeArg = 0x000200,/*设置 QE=1(S9)*/
        .deviceType = kFlexSpiDeviceType_SerialNOR,/*设备类型为nor flash*/
        .sflashPadType = kSerialFlash_4Pads,/*设备数据总线为4*/
        .serialClkFreq = kFlexSpiSerialClk_133MHz,/*flash 时钟*/
        .sflashA1Size = 16u * 1024u * 1024u,      /*flash 大小16MBytes*/
        //.dataValidTime = {16u, 16u},
        .lookupTable =
            {
                /*快速读命令(四线)*/
                [0]     = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
                [1]     = FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
                /*读状态命令*/
                [1*4]   = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x04),
                /*写使能命令*/
                [3*4]   = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0),      
                /*擦除扇区命令*/
                [5*4]   = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x20, RADDR_SDR, FLEXSPI_1PAD, 0x04),
                /*页编程命令(四线)*/
                [9*4]   = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x32, RADDR_SDR, FLEXSPI_1PAD, 0x18),  
                [9*4+1] = FLEXSPI_LUT_SEQ(WRITE_SDR,FLEXSPI_4PAD , 0x04, STOP, FLEXSPI_1PAD, 0),                  
                /*整片擦除*/
                [11*4]  = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xc7, STOP, FLEXSPI_1PAD, 0),                  
            },
    },
.pageSize = 256u,/*页大小为256字节*/
.sectorSize = 4u * 1024u,/*扇区大小为4k字节*/
};



Jlink配置

是的,jlink也需要修改,因为Jlink默认的方式也是hyperflash。
安装MCUXpresso 时默认安装了Jlink驱动,路径:C:\Program Files (x86)\SEGGER\JLink
打开《JLinkDevices.xml》文件,搜索RT1052,可以看到默认的驱动配置:

RT1052.JPG

将Name="HyperFlash" 改为Name="QSPI Flash",
Loader="Devices/NXP/iMXRT105x/NXP_iMXRT105x_HyperFlash.elf" 改为 Loader="Devices/NXP/iMXRT105x/NXP_iMXRT105x_QSPI.elf"

修改后如下:

修改后.JPG




下载

1、使用MCUXpresso 的GUI Flash Tool工具:
在如下位置,点击箭头选择SEGGER J-link probes 进行下载。
GUI Tool jlink.JPG




2、使用J-Flash工具下载

下载方法看我之前的博客《使用Jlink下载程序固件》
配置参照下方图片。
J flash配置.JPG


这里介绍下如何生成.bin 或.hex文件,MCUXpresso 默认生成的只有.axf文件,在Debug文件夹下,
选中.axf文件,右键 选择 Binary Utilities 在选择相应的生成类型。
如下:

Create binary.JPG


调试

debug没啥配置的,点击下图红圈图标即可。
debug.JPG


下一篇将介绍程序启动流程。《RT1052学习笔记(四) 程序启动流程 与 Bootable image文件的分析》