XIP模式的littlefs_shell代码实现

电子说

1.2w人已加入

描述

写在前面

在实际应用中,通常会使用Serial Nor flash作为RT系列MCU的代码储存设备,如QSPI,HyperFlash等,这些设备都支持XIP特性,而这些Flash除了储存代码外,剩下的空间可以用于存储数据,比如设备参数,log信息,并能用文件系统来管理,所以这次小编就分享一个可运行在QSPI的Littlefs的例程,可用于管理QSPI的数据区域。

代码Fig1

测试环境介绍

硬件平台:MIMXRT1060-EVKB;

代码Fig2 MIMXRT1060-EVKB

IDE:MCUXpresso;

移植步骤

我们直接以SDK中的littlefs_shell工程作为模板来避免重复造轮子,由于littlefs_shell工程是链接到RAM中,所以我们需要对它进行改造。

添加Flash项

代码Fig3 添加Flash

添加FDCB
littlefs_shell工程默认是链接到RAM中,所以需要手动添加FDCB,具体如下所示。

在工程中添加xip(来自于SDK library)

代码Fig4

Settings->Preprocessor中,添加XIP_EXTERNAL_FLASH=1和XIP_BOOT_HEADER_ENABLE=1

代码Fig5

函数重定位
Fig6为littlefs_shell工程的代码分层图,其中结构体lfs_config包含块设备的各类操作接口函数及各种参数配置,而接口函数需要调用FlexSPI驱动函数才能真正实现QSPI的读写,删除等操作。

代码Fig6 代码分层

由于代码本身就是在QSPI中运行,需要修改linker file把块设备的各类操作接口函数和FlexSPI驱动函数重定位到RAM中运行。

代码代码Fig7

修改Flexspi clock
littlefs_shell工程中,Flex_SPI时钟会被重新设置,这部分也需要进行重定位处理的,不然会触发hardfalut,当然,你可以在BOARD_InitBootClocks()中,就提前设置好想要的FlexSPI时钟频率,避免二次设置。

 

  CLOCK_InitUsb1Pll(&g_ccmConfigUsbPll);
  CLOCK_InitUsb1Pfd(kCLOCK_Pfd0, 24);   /* Set PLL3 PFD0 clock 360MHZ. */
  CLOCK_SetMux(kCLOCK_FlexspiMux, 0x3); /* Choose PLL3 PFD0 clock as flexspi source clock. */
  CLOCK_SetDiv(kCLOCK_FlexspiDiv, 2);   /* flexspi clock 120M. */

 

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分