📄 flash.c
字号:
#include <LPC213x.h>
#include "config.h"
/* 定义IAP命令字 */
// 命令 参数
#define IAP_SELECTOR 50 // 选择扇区 【起始扇区号、结束扇区号】
#define IAP_RAMTOFLASH 51 // 拷贝数据 【FLASH目标地址、RAM源地址、写入字节数、系统时钟频率】
#define IAP_ERASESECTOR 52 // 擦除扇区 【起始扇区号、结束扇区号、系统时钟频率】
#define IAP_BLANKCHK 53 // 查空扇区 【起始扇区号、结束扇区号】
#define IAP_READPARTID 54 // 读器件ID 【无】
#define IAP_BOOTCODEID 55 // 读Boot版本号 【无】
#define IAP_COMPARE 56 // 比较命令 【Flash起始地址、RAM起始地址、需要比较的字节数】
/* 定义CCLK值大小,单位为KHz */
#define IAP_FCCLK 11059
void (*IAP_Entry)(uint32 param_tab[], uint32 result_tab[]);
#define IAP_ENTER_ADR 0x7FFFFFF1 // IAP入口地址定义
uint32 paramin[8]; // IAP入口参数缓冲区
uint32 paramout[8]; // IAP出口参数缓冲区
/*
*********************************************************************************************************
** 函数名称:SelSector()
** 函数功能:IAP操作扇区选择,命令代码50。
** 入口参数:sec1 起始扇区
** sec2 终止扇区
** 出口参数:IAP操作状态码
** IAP返回值(paramout缓冲区)
*******************************************************************************************************
*/
uint32 SelSector(uint8 sec1, uint8 sec2)
{
paramin[0] = IAP_SELECTOR; // 设置命令字
paramin[1] = sec1; // 设置参数
paramin[2] = sec2;
(*IAP_Entry)(paramin, paramout); // 调用IAP服务程序
return(paramout[0]); // 返回状态码
}
/*
*******************************************************************************************************
** 函数名称:RamToFlash()
** 函数功能:复制RAM的数据到FLASH,命令代码51。
** 入口参数:dst 目标地址,即FLASH起始地址。以512字节为分界
** src 源地址,即RAM地址。地址必须字对齐
** no 复制字节个数,为512/1024/4096/8192
** 出口参数:IAP操作状态码
** IAP返回值(paramout缓冲区)
*******************************************************************************************************
*/
uint32 RamToFlash(uint32 dst, uint32 src, uint32 no)
{
paramin[0] = IAP_RAMTOFLASH; // 设置命令字
paramin[1] = dst; // 设置参数
paramin[2] = src;
paramin[3] = no;
paramin[4] = IAP_FCCLK;
(*IAP_Entry)(paramin, paramout); // 调用IAP服务程序
return(paramout[0]); // 返回状态码
}
/*
*******************************************************************************************************
** 函数名称:EraseSector()
** 函数功能:扇区擦除,命令代码52。
** 入口参数:sec1 起始扇区
** sec2 终止扇区
** 出口参数:IAP操作状态码
** IAP返回值(paramout缓冲区)
*******************************************************************************************************
*/
uint32 EraseSector(uint8 sec1, uint8 sec2)
{
paramin[0] = IAP_ERASESECTOR; // 设置命令字
paramin[1] = sec1; // 设置参数
paramin[2] = sec2;
paramin[3] = IAP_FCCLK;
(*IAP_Entry)(paramin, paramout); // 调用IAP服务程序
return(paramout[0]); // 返回状态码
}
/*
*******************************************************************************************************
** 函数名称:BlankCHK()
** 函数功能:扇区查空,命令代码53。
** 入口参数:sec1 起始扇区
** sec2 终止扇区
** 出口参数:IAP操作状态码
** IAP返回值(paramout缓冲区)
*******************************************************************************************************
*/
uint32 BlankCHK(uint8 sec1, uint8 sec2)
{
paramin[0] = IAP_BLANKCHK; // 设置命令字
paramin[1] = sec1; // 设置参数
paramin[2] = sec2;
(*IAP_Entry)(paramin, paramout); // 调用IAP服务程序
return(paramout[0]); // 返回状态码
}
/*
*******************************************************************************************************
** 函数名称:ReadParID()
** 函数功能:扇区查空,命令代码53。
** 入口参数:无
** 出口参数:IAP操作状态码
** IAP返回值(paramout缓冲区)
*******************************************************************************************************
*/
uint32 ReadParID(void)
{
paramin[0] = IAP_READPARTID; // 设置命令字
(*IAP_Entry)(paramin, paramout); // 调用IAP服务程序
return(paramout[0]); // 返回状态码
}
/*
*******************************************************************************************************
** 函数名称:BootCodeID()
** 函数功能:读取boot代码版本号,命令代码55。
** 入口参数:无
** 出口参数:IAP操作状态码
** IAP返回值(paramout缓冲区)
*******************************************************************************************************
*/
uint32 BootCodeID(void)
{
paramin[0] = IAP_BOOTCODEID; // 设置命令字
(*IAP_Entry)(paramin, paramout); // 调用IAP服务程序
return(paramout[0]); // 返回状态码
}
/*
*******************************************************************************************************
** 函数名称:Compare()
** 函数功能:校验数据,命令代码56。
** 入口参数:dst 目标地址,即RAM/FLASH起始地址。地址必须字对齐
** src 源地址,即FLASH/RAM地址。地址必须字对齐
** no 复制字节个数,必须能被4整除
** 出口参数:IAP操作状态码
** IAP返回值(paramout缓冲区)
*******************************************************************************************************
*/
uint32 Compare(uint32 dst, uint32 src, uint32 no)
{
paramin[0] = IAP_COMPARE; // 设置命令字
paramin[1] = dst; // 设置参数
paramin[2] = src;
paramin[3] = no;
(*IAP_Entry)(paramin, paramout); // 调用IAP服务程序
return(paramout[0]); // 返回状态码
}
//=============================
void zhuanhuan_uart(uint8 *s,uint32 no)
{uint8 i;
for(i=0;i<10;i++)
{
*s=no%10+48;
no=no/10;
s++;
}
*s='\0';
}
void flash_int() // 初始化函数指针IAP_Entry
{
IAP_Entry =(void(*)(uint32 [],uint32 []))IAP_ENTER_ADR; // 初始化函数指针IAP_Entry
}
/*void ram_int()
{uint32 i;
for(i=0;i<256;i++)
tian[i]=i;
} */
//=============================
/*
*******************************************************************************************************
end of
*******************************************************************************************************
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -