本帖最后由 小恩GG 于 2021-6-1 14:25 编辑
【经验分享】RT1010MCUXPresso ocram flashdriver移植
一 文档说明
从我们之前分享的一些文章,如:RT1064flexRAM ITCM为0 IAR debug问题解决,基于MCUXpresso的RT1024 FlexRAM重新配置后的debug错误 可以知道,当我们做一些关闭ITCM DTCM的flexRAM配置的APP的时候,可能会出现debug下载不进去的情况,该情况通常是由于我们的IDE 的flashdriver代码所在空间位置所决定。比如flashdriver已经占用了RT的ITCM/DTCM, 这个时候如果芯片需要关闭ITCM/DTCM 会导致调用flashdriver失败。通常我们会采用修改flashdriver所在空间位置到OCRAM的方法去解决。如果目前使用的RT芯片已经有了IDE安装目录下自带的源代码,修改flashdriver代码存放位置会很简单,但是我们知道,通常IDE也不会存放所有的源代码,只会给几个典型的RT源代码,所以本文将以RT1010芯片为例,讲解如何在MCUXPresso IDE现有的flashdriver源代码基础上去移植一个MIMXRT1010-EVK的flashdriver,并且存放到ocram,生成.cfx文件供关闭ITCM/DTCM的APP去使用。
二 flashdriver移植步骤
获取参考flashdriver RT源文件,打开MCUXpresso IDE安装目录,flashdriver的路径: C:\nxp\MCUXpressoIDE_11.3.0_5222\ide\Examples\Flashdrivers\NXP\iMXRT 可以看到有RT1020_QSPI以及RT1050的三个驱动源文件,这里我们以iMXRT1020_QSPI.zip为基础,拷贝出来解压移植备用,打开mcuxpresso软件,导入iMXRT1020_QSPI解压后的两个文件iMXRT1020_QSPI以及LPCXFlashDriverLib. 拷贝iMXRT1020_QSPI工程然后粘贴工程重新命名为RT1010的工程,这里为iMXRT1010_QSPI_DOC, 在生成.cfx之前,我们需要先保证这个驱动能够准确的实现RT1010外部QSPI flash芯片的操作,这样才能保证移植的成功。下面进入具体移植步骤。
2.1 文件修改
由于源代码是基于RT1020芯片,所以我们这里需要把相关芯片的驱动以及头文件等代码都修改为RT1010 SDK的相关代码并删掉对应的RT1020芯片的代码,涉及文件有: CMSIS, board, drivers, QSPIsource
CMSIS文件夹:fsl_device_registers.h,MIMXRT1011.h, MIMXRT1011_features.h, system_MIMXRT1011.c, system_MIMXRT1011.h SDK对应文件路径: SDK_2.9.1_EVK-MIMXRT1010\devices\MIMXRT1011 System_MIMXRT1011.c 中SystemInit,屏蔽ICache以及DCache: SCB_EnableICache(); SCB_EnableDCache(); 原因是代码放到OCRAM,和flexSPI都需要经过interconnect bus fabrics,为了防止冲突产生fault,这里直接关闭cache. 否则debug的时候,会遇到直接进入fault的情况。
Board文件夹:替换所有代码为SDK的代码,peripherals.c以及peripherals.h可以不换因为没有用到。 SDK对应文件路径: SDK_2.9.1_EVK-MIMXRT1010\boards\evkmimxrt1010\driver_examples\flexspi\nor\polling_transfer 代码board.h需要修改一个点,否则编译报错: #define BOARD_DEBUG_UART_TYPE 1U
Drivers文件夹: SDK对应的路径: SDK_2.9.1_EVK-MIMXRT1010\devices\MIMXRT1011\drivers
QSPIsource文件夹:MIMXRT1010-EVK使用的是AT25SF128,和RT1020的IS25LP064存在大小和使能quad命令的区别,修改点: Flexspi_QSPI_flash.h #define FLASH_SIZE 0x4000 /* 128Mb/KByte */ #define DEVICE_SIZE 0x1000000 //16MB//0x800000//8MB 从64Mb(8MB)改为128Mb(16MB). Flexspi_QSPI_flash.c /*Enable Quad mode */ [4* NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x31, kFLEXSPI_Command_WRITE_SDR,kFLEXSPI_1PAD, 0x04),
status_t flexspi_nor_enable_quad_mode(FLEXSPI_Type*base) { flexspi_transfer_t flashXfer; status_t status; uint32_twriteValue = 0x02;//0x40 … } 两款芯片的QE位置不一样,所以需要修改。 其余沿用之前的ARM7的代码。
2.2 工程配置 添加RT1010预编译:CPU_MIMXRT1011CAE4A和CPU_MIMXRT1011CAE4A_cm7
图1 修改Linkscripts文件夹下两个ld文件的SRAM位置,从DTCM 0X20000000改到OCRAM 0X20200000 FlashDriver_Test.ld 供debug测试使用 MEMORY { SRAM(rwx) : ORIGIN = 0x20200000, LENGTH = (64 * 1024) - 32 } __top_SRAM = 0x20200000 + (64 * 1024) - 32; FlashDriver_32Kbuffer.ld供最后生成.cfx使用: SRAM (rwx) : ORIGIN = 0x20200000, LENGTH = (64 *1024) 工程编译选择build版本,等工作之后,再转到生成.cfx的版本,这里需要首先编译LPCXFlashDriverLib的4 Release 和 5 Release_SectorHashing生成Lib供后续使用。
图2
图3 在debug的时候,需要配置debugconfiguration为:
图4 需要添加additional options:--nopacked 直接运行,测试结果如下:
图5
图6 可以看到,完全可以实现外部128Mb flash的擦写操作。 下面新建一个build用于配合Release_SectorHashing库生成实际需要使用的.cfx Project->properties
图7 添加Release_SectorHashing库路径:
图8
图9 链接文件改为FlashDriver_32Kbuffer.ld 添加build生成.cfx命令: arm-none-eabi-size "${BuildArtifactFileName}" mkdir -p ../builds cp ${BuildArtifactFileBaseName}.axf../builds/${ConfigName}.cfx
图10 编译查看工程builds文件夹:
图11 可以看到,已经生成了我们需要的MIMXRT1010-EVK_AT25SF128.cfx
三 APP准备与测试结果
准备一个关闭ITCM和DTCM的工程,并且添加我们生成的OCRAM flashdriver驱动生成的MIMXRT1010-EVK_AT25SF128.cfx,具体方法可以查看之前的经验分享: 在附件的APP样例中,startup_mimxrt1011.c ResetISR,添加了不同配置的flexRAM情况:
- #if 1
- //128K OC + 0K ITC + 0K DTC flashloader need modification
- IOMUXC_GPR->GPR17 = 0x55;
- IOMUXC_GPR->GPR16 = (IOMUXC_GPR->GPR16 & (~0x3)) | 0x20000;
- IOMUXC_GPR->GPR14 = 0;
- #endif
- #if 0
- //64K OC + 0K ITC + 64K DTC flashloader no modification
- IOMUXC_GPR->GPR17 = 0xA5;
- IOMUXC_GPR->GPR16 = (IOMUXC_GPR->GPR16 & (~0x1)) | 0x200006;
- IOMUXC_GPR->GPR14 = IOMUXC_GPR_GPR14_CM7_CFGDTCMSZ(0x7);
- #endif
- #if 0
- //64K OC + 64K ITC + 0K DTC flashloader need modification
- IOMUXC_GPR->GPR17 = 0xF5;
- IOMUXC_GPR->GPR16 = (IOMUXC_GPR->GPR16 & (~0x2)) | 0x200005;
- IOMUXC_GPR->GPR14 = IOMUXC_GPR_GPR14_CM7_CFGITCMSZ(0x7);
- #endif
复制代码
配套的scp也在样例中,用于添加到connectscript中
图12
图13
图14
图15 查看ITCM, DTCM, OCRAM, 会发现,只有OCRAM可以查看数据,ITCM/DTCM均不可查看。
图16
图17
图18
运行起来,板上led小灯可以闪烁。 综上,我们可以看到,新生成的ocram flashdriver .cfx完全可以实现关闭ITCM DTCM的下载,并且功能成功运行。
|