0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

编译可在QSPI Flash上运行的程序

灵动MM32MCU 来源:灵动MM32MCU 作者:灵动MM32MCU 2023-03-31 09:50 次阅读

引言

在前文中已经实现了一个能够在 MDK 平台进行下载代码到 QSPI Flash 中的下载算法,以及一个能跳转执行应用程序的 2nd Bootloader,但若想将代码下载到 QSPI Flash上并运行,仍需对所需执行的代码文件进行少量的修改,使其能够在 QSPI Flash 上运行。

修改Linker文件

本文将 MindSDK 的 PLUS-F5270 hello_world 样例工程作为所需执行的文件,可通过 MindSDK 官网 获取该样例,如图 1 所示。

909b8c36-cee4-11ed-bfe3-dac502259ad0.png

图1 通过官网获取 MindSDK PLUS-F5270 hello_world样例工程

打开 hello_world 样例工程,在Options for Target选项的Linker页面下,找到 Scatter File 选项,该选项中内容为 Linker 所使用的 Scatter File 文件路径,点击该选项右侧的 Edit ,此时样例工程中会弹出对应的 Scatter File 文件界面,如图 2 所示。

90bd849e-cee4-11ed-bfe3-dac502259ad0.png

图2 打开scatter file文件界面

在弹出的 mm32f5277e_flash.scf 文件中,需要根据 QSPI 的存储器映像配置 __ROM_BASE 的数值,QSPI 外设的基础地址为 0x90000000,这个地址值来自于微控制器的用户手册的 “地址映射” 章节,如图 3 所示。因此,__ROM_BASE的数值应该为 0x90000000。

90deff2a-cee4-11ed-bfe3-dac502259ad0.png

图3 QSPI 外设的存储器映像编址范围

QSPI Flash 的大小为8MB,其中 8MB = 8 * 1024 *1024 = 8388608,换算为 16 进制是 0x00800000,因此,__ROM_SIZE 的数值应该为 0x00800000。

Scatter File文件的内容修改如下:

...
/*---------------------FlashConfiguration----------------------------------
;FlashConfiguration
;FlashBaseAddress<0x0-0xFFFFFFFF:8>
;FlashSize(inBytes)<0x0-0xFFFFFFFF:8>
;
*----------------------------------------------------------------------------*/
#define__ROM_BASE0x90000000
#define__ROM_SIZE0x00800000
...

修改源代码

在配置好 Linker 所需的 Scatter File 文件后,需要对将要执行的文件进行检查,去除可能会影响到 QSPI Flash 运行的代码,需要检查的点如下:

检查时钟初始化部分:

是否存在复位 QSPI 模块的时钟或复位 QSPI 所使用的 GPIO 引脚时钟的情况

若存在复位 QSPI 模块,则处理器将无法从 QSPI Flash 中读取下一个要执行的指令。

若存在复位 QSPI 使用引脚的时钟,则运行到引脚时钟复位后,GPIO 复位,引脚不再作为 QSPI 的接口,因此将会影响到 QSPI 与 QSPI Flash 之间的通信

在 “hello_world” 工程中,以上代码可能会出现在 board 目录下的 “clock_init.c” 中。

检查引脚初始化部分:

是否占用 QSPI 所使用的引脚

若引脚初始化时,占用 QSPI 所需引脚,将会影响与 QSPI Flash 的通信

在 “hello_world” 工程中,以上代码可能会出现在 board 目录下的 “pin_init.c” 中。

不能出现以间接模式操作 QSPI Flash 的代码

若执行间接模式操作 QSPI Flash 的代码,会中断直接读模式,而直接读模式是执行存储在 QSPI Flash 的应用程序的基础,因此,执行间接模式操作 QSPI Flash 的代码会使应用程序跑飞。

在 “hello_world” 工程中,没有执行间接模式操作 QSPI Flash 的代码。

添加下载算法到可执行文件

该可执行样例最终将在 QSPI Flash 中存储并运行,因此,需要添加根据实际所使用的 QSPI Flash芯片而配置的下载算法到样例工程中,以帮助调试器将指定位置的数据写入 Flash。

以配置完成的 PLUS-F5270 hello_world 样例工程为例,打开 Options for Target 的 Debug 页面,选择 Settings 选项进入 Cortex Jlink/JTrace Target Driver Setup 页面的 Flash Download ,选择 Add 选项,进入下载算法选择列表,选择前文中设置好的 MM32F5270 QSPI FlashLoader 下载算法,点击 Add 进行添加,如图 4 所示。

90fc8e78-cee4-11ed-bfe3-dac502259ad0.png

图4 添加下载算法到可执行文件中

此处需注意,若下载算法的大小大于Flash Download中RAM for Algorithm的Size选项中的大小,会导致在下载时出现 "Cannot Load Flash Programming Algorithm" 的问题,此时需适当将Size的大小调大一些,本文中设置Size为 0x2000。

验证

配置完成在 QSPI Flash 上运行的可执行文件后,可尝试使用下载算法将整个工程下载到 QSPI Flash 中并使用 2nd Bootloader 执行这个工程。

先将前文中实现运行在片内 Flash 的 2nd Bootloader 下载到 PLUS-F5270 开发板中,再将已经配置好的添加了下载算法的 hello_world 样例工程下载到开发板中的 QSPI Flash 中。下载成功后复位微控制器,通过串口调试器可看到输出字符 "hello_world"。

9133ef8a-cee4-11ed-bfe3-dac502259ad0.png

图5 使用QSPI Flash的hello_world样例工程运行结果

在调试模式下,可以从 Disassemby 窗口观察到进入main函数后地址处于 0x90000950,属于 QSPI Flash 的范围内,由此可见,整个 hello_world 下载到 QSPI Flash中并且正确运行。

9150df50-cee4-11ed-bfe3-dac502259ad0.png

图6 通过调试查看样例起始地址

至此,已经验证了下载算法可用, 2nd Bootloader 可用,修改后的样例工程也可用。

但仍需验证下中断是否可用,本文修改 hello_world 工程,验证 SysTick_Handler() 能否正确执行。

volatileuint32_tsystime=0u;

intmain(void)
{
uint8_tch;

BOARD_Init();

printf("hello,world
");

SysTick_Config(CLOCK_SYSTICK_FREQ/1000u);

while(1)
{
if(systime>1000)
{
systime=0;
putchar('*');
}
}
}

voidSysTick_Handler()
{
systime++;
}

将修改后的样例工程下载并运行在 QSPI Flash 上,其结果如图 7 所示。

9187f594-cee4-11ed-bfe3-dac502259ad0.png

图7 验证SysTick中断可用的样例结果

至此,也验证了中断也可正确执行。

总结

为了编译可在QSPI Flash上运行的可执行文件,需要作出以下两件事:

修改 Linker 文件,将 ROM 的位置和大小修改为 QSPI Flash 的映射地址和大小

修改源代码中所有可能会影响访问QSPI Flash的代码,例如 GPIO 的配置,时钟的配置等

可以发现编译可在 QSPI Flash上运行的可执行文件并不难,因此可以轻松将应用程序迁移到 QSPI Flash 里。

审核编辑:汤梓红

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

    关注

    10

    文章

    1634

    浏览量

    147966
  • 程序
    +关注

    关注

    117

    文章

    3786

    浏览量

    81014
  • MDK
    MDK
    +关注

    关注

    4

    文章

    209

    浏览量

    32063
  • 编译
    +关注

    关注

    0

    文章

    657

    浏览量

    32862
  • QSPI
    +关注

    关注

    0

    文章

    41

    浏览量

    12198

原文标题:灵动微课堂 (第249讲)|mm32-2nd-bootloader技术白皮书(5)——编译可在QSPI Flash上运行的程序

文章出处:【微信号:MindMotion-MMCU,微信公众号:灵动MM32MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    自带的QSPI flash如何下载

    有个一直很头疼的问题就是自带的QSPI flash如何下载的问题,我们以 STM32F7Discovery官方资料-1\STM32Cube_FW_F7_V1.1.0\Projects
    发表于 08-04 06:16

    使用QSPI FLASH来存放程序代码

    使用QSPI FLASH来存放程序代码,可以把程序的部分或者整个程序都存放在QSPI
    发表于 08-12 07:19

    STM32H7的内部FlashQSPI Flash混合执行程序的优势

    第83章 STM32H7的内部FlashQSPI Flash运行程序的混合方式(强烈推荐)本章节为大家讲解内部Flash和外部
    发表于 08-18 06:57

    内部FlashQSPI Flash混合执行程序的优势是什么?

    内部FlashQSPI Flash混合执行程序的优势是什么?
    发表于 11-23 06:12

    QSPI flash运行毫米波芯片的测试代码分享

    。本文就是基于这个问题,尝试把MSS的测试代码直接烧写到QSPI flash运行,并且通过GPIO点灯的状态来反映测试情况,来解决没有JTAG/仿真器情况下的测试问题。
    发表于 11-07 07:52

    什么是QSPI?如何使用QSPIQSPI Flash进行通信呢?

    QSPI Flash 中的程序(XIP)。  因此,可以将 QSPI Flash 映射到一段指定的内存地址空间内,例如,指定到 0x900
    发表于 03-17 15:17

    LS1046AQSPI Flash不可擦除怎么处理?

    在我定制的LS1046A板,我们只使用了一个QSPI Flash S25FS512SDSMFI011,通过QSPI_A_CS0/QSPI_
    发表于 05-18 07:56

    如何从ram运行QSPI演示以测试自定义板QSPI Ram?

    大家好 是否有程序或教程告诉我如何使其中一个演示应用程序从板载 RAM 运行。 我有一个 MIMXRT1060-EVKB 开发套件以及一个装有 MIMXRT1062 的定制板。 在自定义板
    发表于 05-31 10:35

    使用 PCIE 更新 AMD ZYNQ™ 的 QSPI Flash 参考设计

    QSPI 控制器,用来更新 Flash 的启动分区。 软件方面,移植了 Embedded SW 的相关驱动代码至 xdma 平台,并提供了一个简单的上位机测试程序,用来烧写启动镜像至 Fl
    发表于 11-30 18:49

    如何使用QSPI Flash控制器开发板QSPI Flash进行写读操作

    学习内容 本文首先介绍FlashQSPI Flash控制器的相关内容,然后使用 QSPI Flash 控制器,开发板
    的头像 发表于 06-10 17:08 1.4w次阅读
    如何使用<b class='flag-5'>QSPI</b> <b class='flag-5'>Flash</b>控制器开发板<b class='flag-5'>上</b>的 <b class='flag-5'>QSPI</b> <b class='flag-5'>Flash</b>进行写读操作

    从TMS320F281xDSP片FLASH运行应用程序_从FLASH转移到RAM运行_BIOS

    从TMS320F281xDSP片FLASH运行应用程序_从FLASH转移到RAM运行_BIO
    发表于 07-30 11:54 3次下载
    从TMS320F281xDSP片<b class='flag-5'>上</b><b class='flag-5'>FLASH</b>中<b class='flag-5'>运行</b>应用<b class='flag-5'>程序</b>_从<b class='flag-5'>FLASH</b>转移到RAM<b class='flag-5'>运行</b>_BIOS

    QSPI flash 运行毫米波芯片的测试代码

    的测试代码直接烧写到QSPI flash运行,并且通过GPIO点灯的状态来反映测试情况,来解决没有JTAG/仿真器情况下的测试问题。        本文
    的头像 发表于 11-10 09:36 1336次阅读
    在 <b class='flag-5'>QSPI</b> <b class='flag-5'>flash</b> <b class='flag-5'>上</b><b class='flag-5'>运行</b>毫米波芯片的测试代码

    QSPI flash运行毫米波芯片的测试代码

    QSPI flash运行毫米波芯片的测试代码
    发表于 10-28 12:00 0次下载
    在<b class='flag-5'>QSPI</b> <b class='flag-5'>flash</b><b class='flag-5'>上</b><b class='flag-5'>运行</b>毫米波芯片的测试代码

    微控制器外置QSPI Flash选型的注意事项

    为了扩展微控制器可用的 Flash 空间,用户可以使用 QSPI 接口连接 QSPI Flash;为了让用户能尽量像使用片内 Flash
    的头像 发表于 04-07 09:23 2098次阅读

    mm32-2nd-bootloader技术白皮书(5)——编译可在QSPI Flash运行程序

    mm32-2nd-bootloader技术白皮书(5)——编译可在QSPI Flash运行
    的头像 发表于 10-24 16:14 490次阅读
    mm32-2nd-bootloader技术白皮书(5)——<b class='flag-5'>编译</b><b class='flag-5'>可在</b><b class='flag-5'>QSPI</b> <b class='flag-5'>Flash</b><b class='flag-5'>上</b><b class='flag-5'>运行</b>的<b class='flag-5'>程序</b>