相关阅读:
mm32-2nd-bootloader技术白皮书(1)——配置软硬件环境
mm32-2nd-bootloader技术白皮书(2)——QSPI外设简介
mm32-2nd-bootloader技术白皮书(3)——设计实现QSPI Flash的下载算法
mm32-2nd-bootloader技术白皮书(4)——设计实现简单的2nd bootloader
引言
在前文中已经实现了一个能够在 MDK 平台进行下载代码到 QSPI Flash 中的下载算法,以及一个能跳转执行应用程序的 2nd Bootloader,但若想将代码下载到 QSPI Flash上并运行,仍需对所需执行的代码文件进行少量的修改,使其能够在 QSPI Flash 上运行。
修改Linker文件
本文将 MindSDK 的 PLUS-F5270 hello_world 样例工程作为所需执行的文件,可通过 MindSDK 官网 (https://mindsdk.mindmotion.com.cn/) 获取该样例,如图 1 所示。
图1 通过官网获取 MindSDK PLUS-F5270 hello_world样例工程
打开 hello_world 样例工程,在Options for Target选项的Linker页面下,找到Scatter File选项,该选项中内容为 Linker 所使用的 Scatter File 文件路径,点击该选项右侧的Edit,此时样例工程中会弹出对应的 Scatter File 文件界面,如图 2 所示。
图2 打开scatter file文件界面
在弹出的 mm32f5277e_flash.scf 文件中,需要根据 QSPI 的存储器映像配置__ROM_BASE的数值,QSPI 外设的基础地址为 0x90000000,这个地址值来自于微控制器的用户手册的 “地址映射” 章节,如图 3 所示。因此,__ROM_BASE的数值应该为 0x90000000。
图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 所示。
图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"。
图5 使用QSPI Flash的hello_world样例工程运行结果
在调试模式下,可以从 Disassemby 窗口观察到进入main函数后地址处于 0x90000950,属于 QSPI Flash 的范围内,由此可见,整个 hello_world 下载到 QSPI Flash中并且正确运行。
图6 通过调试查看样例起始地址
至此,已经验证了下载算法可用, 2nd Bootloader 可用,修改后的样例工程也可用。
但仍需验证下中断是否可用,本文修改 hello_world 工程,验证 SysTick_Handler() 能否正确执行。
volatileuint32_tsystime=0u; intmain(void) { uint8_tch; BOARD_Init(); printf("hello,worldrn"); SysTick_Config(CLOCK_SYSTICK_FREQ/1000u); while(1) { if(systime>1000) { systime=0; putchar('*'); } } } voidSysTick_Handler() { systime++; }
将修改后的样例工程下载并运行在 QSPI Flash 上,其结果如图 7 所示。
图7 验证SysTick中断可用的样例结果
至此,也验证了中断也可正确执行。
总结
为了编译可在QSPI Flash上运行的可执行文件,需要作出以下两件事:
修改 Linker 文件,将 ROM 的位置和大小修改为 QSPI Flash 的映射地址和大小
修改源代码中所有可能会影响访问QSPI Flash的代码,例如 GPIO 的配置,时钟的配置等
可以发现编译可在 QSPI Flash上运行的可执行文件并不难,因此可以轻松将应用程序迁移到 QSPI Flash 里。
来源:灵动MM32MCU
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理
审核编辑 黄宇
-
FlaSh
+关注
关注
10文章
1634浏览量
148009 -
bootloader
+关注
关注
2文章
235浏览量
45622 -
SDK
+关注
关注
3文章
1036浏览量
45930 -
QSPI
+关注
关注
0文章
41浏览量
12201
发布评论请先 登录
相关推荐
评论