在很多应用场合,需要对一些参数进行永久保存,但是一些参数在程序运行过程中,有能发生改变,因此如何在断电时,有效地保存这些参数是十分关键的。TI提供了用户自主烧写LF2407A的FLASH API函数,在此介绍使用方法。
在以下的例子中,假设我把参数保存在FLASH的SECTION3中,所以在程序运行中,只需要重新烧写SECTION3就可以了,而不能对整个FLASH进行烧写!!
完整的程序在附件里,你可以根据自己的需要加以修改。下面对该程序进行简单说明:
/***********************************/
asm(" .include var.h ");
asm(" .if (DEV_TYPE != LF2407) ");
asm(" .emsg \"ERROR: DEV TYPE is not LF2407\" ");
asm(" .endif ");
#pragma CODE_SECTION(kernelControlLoop,"KER_text")
#pragma CODE_SECTION(handleError,"KER_text")
int handleError(void); /*对FLASH操作发生错误时的处理函数 */
int kernelControlLoop(void);/*FLASH烧写的控制程序*/
void SystemInit(); /*系统初始化函数*/
#include "CFlash.h" /*FLASH API的头文件*/
#include "regs240x.h" /*LF2407A的寄存器头文件 */
#include "pfunc.h" /*从程序空间读取数据函数的头文件*/
/* 定义一个全局变量,用来保存准备烧入FLASH 的数据,格式如下所示: */
int Parameters[]=
{
00,00,00,00,00,00,00,00,00,00, // point parameters, default is 0x0;
00,00,00,00,00,00,00,00,00,00,
10, // the total point of auto mode, the default is 0xa
00, // the manunal is the default work mode
00, // disable the print
00, // press is the default mode
00, // check1
00, // check2
00, // check3
00, // check4
00, // check5
00, // check6
00, // Saved Length
00 // Counter Number
};
main()
{
unsigned int tmp[40]; /*定义一个数组,用以保存从FLASH读出的数据*/
int OnePara; /*假设这是一个需要随时保存的参数*/
SystemInit(); /*系统初始化*/
/* 您的程序开始 */
.
.
.
OnePara = 0x12;
/* 此时可见参数发生了改变,并且需要保存,按照下面的操作: */
Parameters[6] = OnePara;
/*把下面的6个函数直接COPY到你的程序中*/
lf240xInitSys(void)
copyClearAlgo();
copyEraseAlgo();
copyProgramAlgo();
copyKernel();
kernelControlLoop(); /*该函数非常关键,具体说明参看下面*/
/* 此时完成了参数保存操作*/
/* 如果需要从FLASH中读取参数可以使用下面的函数,含义如下:从FLASH的0x7000处开始,连续读取32个数据,保存在tmp中*/
PFUNC_blkRead((int*)0x7000, (int*)tmp, 32);
.
.
.
}
/*该函数非常关键!!!!!!!!!!,可以根据自己的使用情况配置,在此假设把参数保存在FLASH的SECTION3中
*/
int kernelControlLoop(void)
{
flashAlgoVars.SECTOR_CMD=(SECTOR3); /*选择FLASH的SECTION3区域*/
clearFlash(flashAlgoVars); /*调用函数清除所选择的FLASH区域*/
if(0!=flashAlgoVars.ALGO_STATUS) /*错误检查,注意:绝对不能省略,切记!!!!!*/
{ handleError();}
flashAlgoVars.SECTOR_CMD=(SECTOR3);/*选择FLASH的SECTION3区域*/
eraseFlash(flashAlgoVars);/*调用函数擦写所选择的FLASH区域*/
if(0!=flashAlgoVars.ALGO_STATUS) /*错误检查,注意:绝对不能省略,切记!!!!!*/
{ handleError();}
flashAlgoVars.SECTOR_CMD=(SECTOR3);/*选择FLASH的SECTION3区域*/
flashAlgoVars.DATA_PTR=(int)(OnePara);/*指定保存参数的指针,也就是开始定义的
全部变量
*/
flashAlgoVars.FL_SECEND=32; /*设置烧入FLASH的数据个数*/
flashAlgoVars.ADDR=0x7000; /* 指定参数的开始地址*/
programFlash(flashAlgoVars);/*调用烧写函数*/
if(0!=flashAlgoVars.ALGO_STATUS)/*错误检查,注意:绝对不能省略,切记!!!!!*/
{ handleError(); }
}
/*在该系统初始化中,一定要注意关闭WatchDog功能,切记!!!!!*/
void lf240xInitSys(void)
{
WDCR=0x6f;
SCSR1=0x09;
}