本文参考iar FlashLoaderGuider
一、简介
大多数开发板存储代码的存储器都是flash。通常应用程序不能直接通过C-SPY下载到flash存储器中的。而是通过一段专门的程序-FlashLoader将代码下载到Flash器件中。
flashloader实际上就是一段小程序,它能对Flash器件编程。flashloader其实就是一些函数集,主要用来擦除,写入Flash。C-SPY下载flashloader到RAM中。C-SPY将PC指针指向flash loader里的函数集来运行。当函数返回,会产生一个中断。C-SPY就会知道函数已经完成,进而继续调用flash loader。简单的说,C-SPY从flash loader调用函数。
1、流程简介
Flashloader的作用:你需要将程序下载到flashloader,但是C-SPY只能够将数据下载到RAM。
步骤
① 将flash loader程序下载到RAM中
② 将应用程序的映像下载到RAM缓冲区中
③ flash loader同过C-SPY启动。将RAM Buffer里读出的数据编程到Flash中
④ 现在,应用程序的映像文件就存在与Flash中,并可以从flash中启动了。在RAM中的flash loader此时已不在需要,这时RAM可以完全为在flash中的应用程序所用了。
实际应用中,过程远比上述复杂。比如,RAM Buffer空间小于Image时,对Flash的编程就要分多个步骤来进行。
2、flash loader的元素
① flash loader 装载程序
flashloader 配置文件(flash存储器配置文件,flash存储器系统配置文件)
② the flash memory device configuration files
是XML文件,后缀名.flash;描述诸如flash的基地址,block 和 page大小还有用哪个flashloader装载程序
③ flash memory system configuration file
是XML格式文件,后缀名为.board。主要是让C-SPY了解一下开发板的信 息。比如如果开发板有超过一个的flash需编程。那么.board文件也需指定属于不同flash器件的映射地址范围。
3、flash的一些概念
页:最小写入单位
快:最小擦除单位
基地址:flash的起始地址,可以被重映射。
二、flash编程具体步骤
flash loader中最重要的两个函数就是 FlashWrite和FlashErase。FlashWrite以页为单位将RAM中的镜像文件写入flash。FlashErase以block为单位擦除Flash。
在将image文件中数据通过flashloader中的FlashWrite函数写入flash时,有以下限制:
① 写操作是顺序执行,且从最低地址开始。
② buffer大小始终是page的整数倍
③ 不管数据大小是不是一页大小,buffer都被填充为一页大小。
不考虑开发板上多个flash器件的flashloader的详细步骤。
① C-SPY读取A.board文件,指定a.flash文件选定所需的flashloader。
② C-SPY将flashloader下载到RAM中。
③ C-SPY将PC值设定为FlashInit函数标号处,然后调用FlashInit()函数。
④ FlashInit()将后面用到的参数和数据写入RAM buffer中。
⑤ FlashInit执行完后会产生一个断点,C-SPY重新获得控制权。
⑥ C-SPY将application的image文件根据flash的页,块大小合理划分。
⑦ 当flash的块在写入数据之前必须将其擦除
⑧ C-SPY将PC指向FlashErase函数处的标号并开始执行。函数一旦执行完便产生中断。
⑨ C-SPY将一些所需数据写入到RAM buffer
⑩ C-SPY将PC指向FlashWrite函数的标号处并开始执行。但函数执行完,产生一个断点。
11 执行完跳到main
三、自己写Flashloader
flashloader包括两个部分
① framework source code :由IAR提供
② 与特定器件有段的code:需自己写
例:下例提供一个简单的从Ram中拷贝数据到flash的编程算法
FlashWrite和FlashErase用到的关于memory基地址是在FlashInit中提供的。