有上面的几个函数后,下面就可以根据需要编写SD卡升级函数了:
1.定义用户程序地址
定义用户程序的起始地址,用户可以根据自己的实际情况设定,一般都从0x0000 0000开始存放IAP代码,之后的空间才是存放用户代码的。
-
#define APP_CODE_START_ADDR 0x00006000 // 用户程序起始地址
复制代码
2.从SD卡中读写bin文件更新升级
从SD卡中升级程序很简单。流程是:从SD卡中打开升级文件,每次读取512字节,然后写入Flash,直到编写完成。
IAP支持256/512/1024/2048/4096等多字节编程方式,只是SD卡每扇区大小一般都是512字节,所以这里使用512字节为单位进行编程。
-
/********************************************************************************** * FunctionName : UCSDCardProgram() * Description : 从SD卡编程 * EntryParameter : fileName - 应用程序在SD卡中的名字, buf - 缓冲 * ReturnValue : None *********************************************************************************/ uint8 UCSDCardProgram(uint8 *fileName, uint8 *buf) { uint32 addr = 0; FATFS fs; /*Work area (file system object) for logical drive*/ FIL file; /*file objects*/ UINT br; /*File R/W count*/ FRESULT res;
DisableIRQ(); // 禁止中断 SectorPrepare(6, 6); // 选择扇区 SectorErase(6, 6); // 擦除扇区 EnableIRQ(); // 使能中断
/*Register a work area for logical drive 0*/ f_mount(0, &fs);
/*Create file*/ res = f_open(&file, (const TCHAR *)fileName, FA_OPEN_EXISTING|FA_READ);
if(res != FR_OK) { return res; } else { while (1) { res = f_read(&file, buf, 512, &br); // 读取数据
DisableIRQ(); SectorPrepare(6, 6); RamToFlash(APP_CODE_START_ADDR + addr, (uint32)buf, 512); // 写数据到FLASH EnableIRQ(); addr += 512;
if ((res != FR_OK) || (br < 512)) { break; } } }
/*Close all files*/ f_close(&file); // 关闭文件,必须和f_open函数成对出现
/*Unregister a work area before discard it*/ f_mount(0, 0);
return FR_OK; }
复制代码
3.主函数:
主函数实现按键扫描,如果有按键,进行SD卡升级,如果没有按键直接跳转到应用程序。
代码一开始判断按键,所以一般都是需要按下按键后复位系统,当然也可以适当循环扫描按键的次数。等待一定的时间。。。。。。。
-
/********************************************************************************** * FunctionName : main() * Description : 主函数 * EntryParameter : None * ReturnValue : None *********************************************************************************/ int main(void) { void (*userProgram)() = (void (*)())OSInit; // 函数指针
OSInit(); // 初始化系统
while (1) { if (KeyGetValue()) { UCSDCardProgram("LPC1114.bin", SDBuf); }
userProgram = (void (*)())(APP_CODE_START_ADDR + 1); (*userProgram)(); // 启动程序 } }
复制代码
到此IAP程序完成了,下面就是编写应用程序了。。。。。。。。。。。。。。。。。。。。。。
[ 本帖最后由 zhaojun_xf 于 2011-12-26 08:03 编辑 ] |