引言
在前文中已经实现了一个能够在 mdk 平台进行下载代码到 qspi flash 中的下载算法,以及一个能跳转执行应用程序的 2nd bootloader,但若想将代码下载到 qspi flash上并运行,仍需对所需执行的代码文件进行少量的修改,使其能够在 qspi flash 上运行。
修改linker文件
本文将 mindsdk 的 plus-f5270 hello_world 样例工程作为所需执行的文件,可通过 mindsdk 官网 获取该样例,如图 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文件的内容修改如下:
.../*--------------------- flash configuration ----------------------------------; flash configuration; flash base address ; flash size (in bytes) ; *----------------------------------------------------------------------------*/#define __rom_base 0x90000000#define __rom_size 0x00800000...
修改源代码
在配置好 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() 能否正确执行。
volatile uint32_t systime = 0u;int main(void){ uint8_t ch; board_init(); printf(hello, world); systick_config(clock_systick_freq / 1000u); while (1) { if (systime > 1000) { systime = 0; putchar('*'); } }}void systick_handler(){ systime++;}
将修改后的样例工程下载并运行在 qspi flash 上,其结果如图 7 所示。
图7 验证systick中断可用的样例结果
至此,也验证了中断也可正确执行。
总结
为了编译可在qspi flash上运行的可执行文件,需要作出以下两件事:
修改 linker 文件,将 rom 的位置和大小修改为 qspi flash 的映射地址和大小
修改源代码中所有可能会影响访问qspi flash的代码,例如 gpio 的配置,时钟的配置等
可以发现编译可在 qspi flash上运行的可执行文件并不难,因此可以轻松将应用程序迁移到 qspi flash 里。
TE Connectivity 公布2017财年第二季度财报
VCA2612/2613/2616有效负反馈和传统电缆终端结构电路
行业方案|数商云电子信息行业SRM供应商管理解决方案
Hart通信在DPV1中的实现
华为开启自卫战:鸿蒙OS系统将让华为进全场景的万物互联新时代
编译可在QSPI Flash上运行的程序
如何计算模型对预测结果的信心
数字压力变送器的设计
优恩-常见抑制瞬变骚扰器件(TVS管/MOV压敏电阻/陶瓷气体放电管)区别
苹果印度扩产,富士康将迎来危机感
苹果发布隐私指南,可防止他人访问个人数据
建筑能耗监测系统解决方案
绅士802音响的设计
联想新机moto_x4最新消息:搭载骁龙660,IP68防水+13MP双摄!或将于8月24日在巴西发布,预售价5200元左右
任意波形发生器_DDS任意波形发生器的设计
iphone8什么时候上市?iphone8最新消息:iphone8屏幕支架被曝光,屏下指纹+不规则全面屏
工业互联网成为企业转型升级的动力
苹果智能手表手机如约而至 移动支付成亮点
Rolls-Royce也加入飞行车战局,看看EVTOL的构造如何
谈谈看不见的天线---内置天线