📄 flash_iap.c
字号:
//#define IAP_GLOBALS
#include "configLPC.h"
//void (*IAP_Entry)(uint32 param_tab[], uint32 result_tab[]);
/* 定义函数指针 */
uint32 paramin[8]; // IAP入口参数缓冲区
uint32 paramout[8]; // IAP出口参数缓冲区
//void flashinit(void)
//{
// IAP_Entry = (void(*)())IAP_ENTER_ADR; // 初始化函数指针IAP_Entry
//}
/****************************************************************************
* 名称:SelSector()
* 功能:IAP操作扇区选择,命令代码50。
* 入口参数:sec1 起始扇区
* sec2 终止扇区
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32 SelSector(INT8U sec1, INT8U sec2)
{
paramin[0] = IAP_SELSECTOR; // 设置命令字
paramin[1] = sec1; // 设置参数
paramin[2] = sec2;
//(*IAP_Entry)(paramin, paramout); // 调用IAP服务程序
iap_entry(paramin, paramout); // 调用IAP服务程序
return(paramout[0]); // 返回状态码
}
/****************************************************************************
* 名称:aRamToFlash()
* 功能:复制RAM的数据到FLASH,命令代码51。
* 入口参数:dst 目标地址,即FLASH起始地址。以512字节为分界
* src 源地址,即RAM地址。地址必须字对齐
* no 复制字节个数,为512/1024/4096/8192
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32 RamToFlash(INT32U dst, INT32U src, INT32U no)
{
paramin[0] = IAP_RAMTOFLASH; // 设置命令字
paramin[1] = dst; // 设置参数
paramin[2] = src;
paramin[3] = no;
paramin[4] = IAP_FCCLK;
//(*IAP_Entry)(paramin, paramout); // 调用IAP服务程序
iap_entry(paramin, paramout); // 调用IAP服务程序
return(paramout[0]); // 返回状态码
}
/****************************************************************************
* 名称:EraseSector()
* 功能:扇区擦除,命令代码52。
* 入口参数:sec1 起始扇区
* sec2 终止扇区
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32 EraseSector(INT8U sec1, INT8U sec2)
{
paramin[0] = IAP_ERASESECTOR; // 设置命令字
paramin[1] = sec1; // 设置参数
paramin[2] = sec2;
paramin[3] = IAP_FCCLK;
//(*IAP_Entry)(paramin, paramout); // 调用IAP服务程序
iap_entry(paramin, paramout); // 调用IAP服务程序
return(paramout[0]); // 返回状态码
}
/****************************************************************************
* 名称:BlankCHK()
* 功能:扇区查空,命令代码53。
* 入口参数:sec1 起始扇区
* sec2 终止扇区
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32 BlankCHK(INT8U sec1, INT8U sec2)
{
paramin[0] = IAP_BLANKCHK; // 设置命令字
paramin[1] = sec1; // 设置参数
paramin[2] = sec2;
//(*IAP_Entry)(paramin, paramout); // 调用IAP服务程序
iap_entry(paramin, paramout); // 调用IAP服务程序
return(paramout[0]); // 返回状态码
}
/****************************************************************************
* 名称:ReadParID()
* 功能:读取设备ID,命令代码54。
* 入口参数:无
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32 ReadParID(void)
{
paramin[0] = IAP_READPARTID; // 设置命令字
//(*IAP_Entry)(paramin, paramout); // 调用IAP服务程序
iap_entry(paramin, paramout); // 调用IAP服务程序
return(paramout[0]); // 返回状态码
}
/****************************************************************************
* 名称:BootCodeID()
* 功能:读取boot代码版本号,命令代码55。
* 入口参数:无
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32 BootCodeID(void)
{
paramin[0] = IAP_BOOTCODEID; // 设置命令字
//(*IAP_Entry)(paramin, paramout); // 调用IAP服务程序
iap_entry(paramin, paramout); // 调用IAP服务程序
return(paramout[0]); // 返回状态码
}
/****************************************************************************
* 名称:aCompare()
* 功能:校验数据,命令代码56。
* 入口参数:dst 目标地址,即RAM/FLASH起始地址。地址必须字对齐
* src 源地址,即FLASH/RAM地址。地址必须字对齐
* size 比较字节个数,必须能被4整除
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32 Compare(INT32U dst, INT32U src, INT32U no)
{
paramin[0] = IAP_COMPARE; // 设置命令字
paramin[1] = dst; // 设置参数
paramin[2] = src;
paramin[3] = no;
//(*IAP_Entry)(paramin, paramout); // 调用IAP服务程序
iap_entry(paramin, paramout); // 调用IAP服务程序
return(paramout[0]); // 返回状态码
}
/****************************************************************************
* 名称:FlashToFlash()
* 功能:复制Flash的数据到FLASH
* 入口参数:dst 目标地址,即FLASH起始地址。以512字节为分界
* src 源地址,即FLASH地址。地址必须字对齐
* no 复制字节个数,为512/1024/4096/8192
* 出口参数:IAP返回值(paramout缓冲区)
****************************************************************************/
uint32 FlashToFlash(INT32U dst, INT32U src, INT32U no)
{
BYTE secter,nums,i;
//int temp;
DWORD BRT_DataBuffer[BRT_BUFFER_LENGTH/4];
secter = (dst/32768) + 7;
//temp = src/32768;
nums = no/BRT_BUFFER_LENGTH;
SelSector(secter,secter); // 选择扇区
EraseSector(secter,secter); // 擦除扇区
BlankCHK(secter,secter) ; // 查空扇区
for(i = 0;i < nums;i++)
{ // 选择扇区
memcpy(BRT_DataBuffer, (src + i*BRT_BUFFER_LENGTH), BRT_BUFFER_LENGTH);
SelSector(secter,secter);
RamToFlash((dst + i*BRT_BUFFER_LENGTH), BRT_DataBuffer, BRT_BUFFER_LENGTH); // 写数据到扇区
}
return 1; // 返回状态码
}
/****************************************************************************
* 名称:FlashInit()
* 功能:初始化FLASH
****************************************************************************/
/*void FlashInit(void)
{
memcpy(&g_DataInformation, 0x00079000, sizeof(DATA_INFORMATION));
g_DataInformation.BRT_BusNums = 0;
g_DataInformation.BRT_Flag = 0;
g_DataInformation.startAdress = 0x00028000;
g_DataInformation.endAdress = 0x00028000;
memcpy(RecordTemp1, &g_DataInformation, sizeof(DATA_INFORMATION));
SelSector(23,23); // 选择扇区22
EraseSector(23,23); // 擦除扇区22
BlankCHK(23,23); // 查空扇区22
SelSector(23,23); // 选择扇区22
RamToFlash(0x00079000, RecordTemp1, sizeof(RecordTemp1));
SelSector(10,10); // 选择扇区10
EraseSector(10,10); // 擦除扇区10
BlankCHK(10,10);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -