复旦微裸机SD卡移植

文章讲述了在移植官方Demo时,如何将FatFs库移动到BSP并处理BootLoader下cache和cache.h的替换,解决因片内RAM满导致的内存迁移问题,以及调整ICF脚本、链接器设置和调试fsbl工程的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   由于只是移植官方的demo,直接贴出移植过程就不详细阐述了
      Demo下的FatFs整个拷贝至BSP->librc下,不要和FSBL下的混了!!!!!
在这里插入图片描述
   将头文件添加到编译环境
   sdmmcps_v1_0整个替换

   BootLoader下cache.c和cache.h替换
   编译报错如下:
在这里插入图片描述
在这里插入图片描述

   报错如下,因为片内ram满了,需要跑到ddr上
在这里插入图片描述
   更改icf脚本

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */
/*-Memory Regions-*/

/* ddr: first 1MB is uncacheable */
define symbol __AXI_DDR_START = 0x00200000;
define symbol __AXI_DDR_END = 0x3FFFFFFF;
define symbol __ICFEDIT_region_RAM_start__ = __AXI_DDR_START;
define symbol __ICFEDIT_region_RAM_end__   = __AXI_DDR_END;

/*-Sizes-*/
define symbol __ICFEDIT_size_mmutbl__  = 0x4000;
define symbol __ICFEDIT_size_vectors__  = 0x100;
define symbol __ICFEDIT_size_cstack__   = 0x40000; 
define symbol __ICFEDIT_size_irqstack__ = 0x200;
define symbol __ICFEDIT_size_fiqstack__ = 0x200;
define symbol __ICFEDIT_size_abtstack__ = 0x60;
define symbol __ICFEDIT_size_undstack__ = 0x40;

define symbol __ICFEDIT_size_heap__     = 0x8000000;
/*-Exports-*/
export symbol __ICFEDIT_region_RAM_start__;
export symbol __ICFEDIT_region_RAM_end__;
export symbol __ICFEDIT_size_vectors__;
export symbol __ICFEDIT_size_cstack__;
export symbol __ICFEDIT_size_irqstack__;
export symbol __ICFEDIT_size_fiqstack__;

export symbol __ICFEDIT_size_heap__;
/**** End of ICF editor section. ###ICF###*/

define memory mem with size = 4G;
define region MMU_TBL_region = mem:[from __ICFEDIT_region_RAM_start__ size __ICFEDIT_size_mmutbl__];
define region VEC_region = mem:[from __ICFEDIT_region_RAM_start__+__ICFEDIT_size_mmutbl__  size __ICFEDIT_size_vectors__];
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__+__ICFEDIT_size_mmutbl__+__ICFEDIT_size_vectors__ to __ICFEDIT_region_RAM_end__];

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { };
define block FIQ_STACK with alignment = 8, size = __ICFEDIT_size_fiqstack__ { };
define block ABT_STACK with alignment = 8, size = __ICFEDIT_size_abtstack__ { };
define block UND_STACK with alignment = 8, size = __ICFEDIT_size_undstack__ { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

initialize by copy with packing=none { readwrite };  
do not initialize  { readonly section .noinit };

place in MMU_TBL_region { section .mmu_tbl };
place in VEC_region { section .vectors };
place in RAM_region { readonly };
place in RAM_region { section .cstartup };
place in RAM_region { readwrite, block IRQ_STACK, block FIQ_STACK, block ABT_STACK, block UND_STACK, block CSTACK, block HEAP };

   硬件导出fsbl和移植的工程文件,可以直接点击下面的工程标签切换
在这里插入图片描述
   切换工程之后,配置一下对应的工程。同样右键点击 fsbl 工程,选择第一个 options,可以查看 fsbl 的 linker 的选型,
   a7_sram.icf 表示是放到片内 OCM 里的
在这里插入图片描述
   我们在 hello 工程上,点击右键之后选中 options,查看 linker 的 icf 文件,用a7_ahbsram.icf文件

   改完链接脚本,还需要把 hello 工程里的 ps_init 屏蔽掉(platform.c中Status = ps_init();注释掉),不要再初始化 DDR 了,这里是因为 IAR 没有 ps_init.tcl 脚本来初始化外设包括 DDR,都是硬编码到应用程序的 main 入口处的 init_platorm 函数里了,所以必须手动屏蔽 DDR 初始化

   设置 fsbl 工程为 active(直接点击到 fsbl 工程就不需要这个操作),下载运行fsbl,在下图位置打上断点,断点只要在执行 ps_init 之后都可以。
在这里插入图片描述
   运行到断点处,关闭 fsbl 调试界面:
   退出调试界面后面, 特别注意的是 IAR 打断点退出 debug 还会继续往前运行的,这个是 IAR 的 bug, 在线调试的话,如果硬件板子不好修改 boot mode 的跳线的话,即 MIO5 从高变低(qspi falsh 启动模式切到 jtag 启动模式)可以直接把用来初始化 DDR的 fsbl 的强制修改为 jtag 启动,这样的话这个 fsbl 也就不会去 qspi 加载后续镜像了,特别是可以避免 qspi 里的程序有问题会导致 cpu 挂死等问题导致 jlink 断链

在这里插入图片描述
在这里插入图片描述
   退出调试,切换到helloworld工程再次调试即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快跑bug来啦

创作不易,来点动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值