?? iap.c
字號:
#include "config.h"
/*定義CCLK值大小,單位為KHz*/
#define IAP_FCCLK 48000
#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;
(*(void(*)())IAP_ENTER_ADR)(paramin,paramout); //調用IAP服務程序
return(paramout[0]); //返回狀態碼
}
/*********************************************************************************************************
**函數名稱:RamToFlash
**函數功能:復制RAM的數據到FLASH,命令代碼51
**入口參數:dst 目標地址,即FLASH起始地址,以256字節為分界
** src 源地址,即RAM地址,地址必須字對其
** no 復制字節個數,為256/512/1024/4096
**出口參數: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;
(*(void(*)())IAP_ENTER_ADR)(paramin,paramout); //調用IAP服務程序
return(paramout[0]); //返回狀態碼
}
/*********************************************************************************************************
**函數名稱:EraseSector
**函數功能:擦除扇區,命令代碼52
**入口參數:sec1 起始扇區
** sec2 終止扇區
**出口參數:IAP 操作狀態碼
** IAP返回值(paramout緩沖區)
********************************************************************************************************/
uint32 EraseSector(uint32 sec1, uint32 sec2)
{
paramin[0] = IAP_ERASESECTOR; //設置命令字
paramin[1] = sec1; //設置參數
paramin[2] = sec2;
paramin[3] = IAP_FCCLK;
(*(void(*)())IAP_ENTER_ADR)(paramin,paramout); //調用IAP服務程序
return(paramout[0]); //返回狀態碼
}
/*********************************************************************************************************
**函數名稱:BlankCHK
**函數功能:查空扇區,命令代碼53
**入口參數:sec1 起始扇區
** sec2 終止扇區
**出口參數:IAP 操作狀態碼
** IAP返回值(paramout緩沖區)
********************************************************************************************************/
uint32 BlankCHK(uint32 sec1, uint32 sec2)
{
paramin[0] = IAP_BLANKCHK; //設置命令字
paramin[1] = sec1; //設置參數
paramin[2] = sec2;
paramin[3] = IAP_FCCLK;
(*(void(*)())IAP_ENTER_ADR)(paramin,paramout); //調用IAP服務程序
return(paramout[0]); //返回狀態碼
}
/*********************************************************************************************************
**函數名稱:ReadParID
**函數功能:讀器件ID,命令代碼54
**入口參數:器件ID地址指針
**出口參數:IAP 操作狀態碼
** IAP返回值(paramout緩沖區)
********************************************************************************************************/
uint32 ReadParID(uint32 *Device_ID)
{
paramin[0] = IAP_READPARTID; //設置命令字
(*(void(*)())IAP_ENTER_ADR)(paramin,paramout); //調用IAP服務程序
*Device_ID = paramout[1];
return(paramout[0]); //返回狀態碼
}
/*********************************************************************************************************
**函數名稱:BootCodeID
**函數功能:讀boot代碼ID,命令代碼55
**入口參數:boot代碼ID地址指針
**出口參數:IAP 操作狀態碼
** IAP返回值(paramout緩沖區)
********************************************************************************************************/
uint32 BootCodeID(uint32 *Boot_ID)
{
paramin[0] = IAP_BOOTCODEID; //設置命令字
(*(void(*)())IAP_ENTER_ADR)(paramin,paramout); //調用IAP服務程序
*Boot_ID = paramout[1];
return(paramout[0]); //返回狀態碼
}
/*********************************************************************************************************
**函數名稱:Compare
**函數功能:校驗數據,命令代碼56
**入口參數:dst 目標地址,即RAM/FLASH起始地址,地址必須字對齊
** src 源地址,即RAM/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;
(*(void(*)())IAP_ENTER_ADR)(paramin,paramout); //調用IAP服務程序
return(paramout[0]); //返回狀態碼
}
/*********************************************************************************************************
**函數名稱:Reinvoke_ISP
**函數功能:重新調用ISP,命令代碼57。
**入口參數:無
**出口參數:無
********************************************************************************************************/
void Reinvoke_ISP(void)
{
paramin[0] = IAP_REINVOKE_ISP; // 設置命令字
(*(void(*)())IAP_ENTER_ADR)(paramin,paramout); // 重新調用ISP
}
/*********************************************************************************************************
**函數名稱:WriteFlash
**函數功能:向FLASH中寫入數據
**入口參數:dst 目標地址,即FLASH起始地址,地址必須以256字節對齊,即地址的低8位必須為0
** src 源地址,即RAM地址,地址必須字對齊,即地址的低兩位必須為0
** no 寫入字節數,必須為256/512/1024/4096
**出口參數:Compare的返回值,操作成功正確返回0
********************************************************************************************************/
uint8 WriteFlash(uint32 dst, uint32 src, uint32 no)
{
SelSector((dst/0x1000),(dst+no)/0x1000); //選擇扇區
EraseSector((dst/0x1000),(dst+no)/0x1000); //擦除扇區
BlankCHK((dst/0x1000),(dst+no)/0x1000); //查空扇區
SelSector((dst/0x1000),(dst+no)/0x1000); //選擇扇區
RamToFlash(dst,src,no); //寫數據到FLASH
return(Compare(dst,src,no)); //比較數據
}
/****************************************************************************
* 名稱:WrDatatoInChip
* 功能:IAP函數調用,測試。通過觀察IAP出口參數來判斷操作是否成功。
* 功能:將接收到數據保存到EEPROM
* 入口參數:write_addr 數據需寫入的起始地址的偏移量
* len 數據長度
* 出口參數:無
*
****************************************************************************/
uint8 WrDatatoInChip(uint8 sec_id,uint8 end_sec_id,uint32 write_addr ,uint8 * strSendMes, uint32 datalen )
{
uint32 i=0;
uint32 j=0;
volatile uint8 *ip=NULL;
uint8 strProtBuff[ByteINSector]; //用來在扇區擦除前保存扇區中的內容
//準備數據
ip=GetAddrInChip(0);//(volatile uint16 *)FLASH_ADDR_InChip+0;
for(i=0;i<ByteINSector;i++)
strProtBuff[i] = *ip++;
for(j=0;j<datalen;j++)
strProtBuff[write_addr+j] = strSendMes[j];
ip=(volatile uint8 *)SDRAM_ADDR_InChip;
for(i=0;i<ByteINSector;i++)
*ip++=strProtBuff[i];
OS_ENTER_CRITICAL();
//ReadParID();
//BootCodeID();
SelSector(sec_id,end_sec_id); // 選擇扇區1
EraseSector(sec_id,end_sec_id); // 擦除扇區1
BlankCHK(sec_id,end_sec_id) ; // 查空扇區1
SelSector(sec_id,end_sec_id);
RamToFlash(FLASH_ADDR_InChip, SDRAM_ADDR_InChip, ByteINSector); // 寫數據到扇區1
BlankCHK(sec_id,end_sec_id) ;
Compare(FLASH_ADDR_InChip, SDRAM_ADDR_InChip, ByteINSector); // 比較數據
OS_EXIT_CRITICAL();
return TRUE;
}
/****************************************************************************
* 名稱:GetDatafromInChip()
* 功能:從扇區中取出相應的數據,保存在字符串strSendMes中
* 入口參數:begin_addr 數據所在的起始地址的偏移量
* i 數據長度
* 出口參數:無
* 注意:這里只考慮單個查詢的情況
****************************************************************************/
uint8 GetDatafromInChip(uint32 begin_addr ,uint8 * strSendMes, uint32 datalen)
{
uint32 j=0;
volatile uint8 *ip=NULL;
uint32 Addr;
OS_ENTER_CRITICAL();
Addr = (uint32)begin_addr;
ip = GetAddrInChip(Addr);
for(j=0;j<datalen;j++)
{
strSendMes[j] = *ip++;
}
OS_EXIT_CRITICAL();
return TRUE;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -