历史上的今天
今天是:2024年11月11日(星期一)
2019年11月11日 | LPC1778的IAP编程源码
2019-11-11 来源:51hei
最近在做一个LPC1778的远程烧写,应用到了IAP编程,所以分享一下。
单片机源程序如下:
#include "IAP.h"
/*********************************************************************************************************
宏定义
*********************************************************************************************************/
#define IAP_ENTER_ADR 0x1FFF1FF1 /* IAP入口地址定义 */
#if defined ( __CC_ARM )
__align(4) INT8U GucIapTmp[1024]; /* 定义4K空间,编程Flash时使用 */
#elif defined ( __ICCARM__ )
#pragma pack(push)
#pragma pack(4)
INT8U GucIapTmp[1024];
#pragma pack(pop)
#endif
/*
* 定义CCLK值大小,单位为KHz
*/
#define IAP_FCCLK (96000)
#define IAP_ENTER_ADR 0x1FFF1FF1 /* IAP入口地址定义 */
/*
* 定义函数指针
*/
void (*IAP_Entry) (INT32U param_tab[], INT32U result_tab[]);
INT32U paramin[8]; /* IAP入口参数缓冲区 */
INT32U paramout[8];
#define UARTBPS 9600 /* 串口通信波特率 */
volatile INT8U GucRcvOver; /* 接收完成标志 1:表示完成 */
volatile INT32U GulRcvCount; /* 接收字节数 */
INT32U *GpulFlagPoint = (INT32U *)UserFlag; /* 用户程序标志指针 */
INT32U *pSECTORADDL1 = (INT32U *)SECTORADDL1; /* 用户程序标志指针 */
INT32U *pSECTORADDL2 = (INT32U *)SECTORADDL2; /* 用户程序标志指针 */
INT32U *pSECTORADDL3 = (INT32U *)SECTORADDL3; /* 用户程序标志指针 */
INT32U *pSECTORADDH1 = (INT32U *)SECTORADDH1; /* 用户程序标志指针 */
INT32U *pSECTORADDH2 = (INT32U *)SECTORADDH2; /* 用户程序标志指针 */
INT32U *pSECTORADDH3 = (INT32U *)SECTORADDH3; /* 用户程序标志指针 */
/* IAP出口参数缓冲区 */
/*********************************************************************************************************
** Function name: sectorPrepare
** Descriptions: IAP操作扇区选择,命令代码50
** input parameters: sec1: 起始扇区
** sec2: 终止扇区
** output parameters: paramout[0]: IAP操作状态码,IAP返回值
** Returned value: paramout[0]: IAP操作状态码,IAP返回值
*********************************************************************************************************/
INT32U sectorPrepare (INT8U sec1, INT8U sec2)
{
paramin[0] = IAP_Prepare; /* 设置命令字 */
paramin[1] = sec1; /* 设置参数 */
paramin[2] = sec2;
(*IAP_Entry)(paramin, paramout); /* 调用IAP服务程序 */
return (paramout[0]); /* 返回状态码 */
}
/*********************************************************************************************************
** Function name: ramCopy
** Descriptions: 复制RAM的数据到FLASH,命令代码51
** input parameters: dst: 目标地址,即FLASH起始地址。以512字节为分界
** src: 源地址,即RAM地址。地址必须字对齐
** no: 复制字节个数,为512/1024/4096/8192
** output parameters: paramout[0]: IAP操作状态码,IAP返回值
** Returned value: paramout[0]: IAP操作状态码,IAP返回值
*********************************************************************************************************/
INT32U 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服务程序 */
上一篇:2440裸机编程之六 实时时钟
下一篇:2440裸机编程之五 定时器
史海拾趣




