?? iap.c
字號(hào):
/*SST單片機(jī)IAP編程示例(C語言)
程序說明:
本程序用的單片機(jī)是
SST89x564RD、SST89x554RC、SST89x58RD2、SST89x54RD2和
SST89x52RD2。示例程序代碼中,執(zhí)行
IAP指令的程序放在單片機(jī)低端程序空間,也就是
BLOCK0,
IAP的程序包括了扇區(qū)擦除(
Sector-Erase)、字節(jié)編程(
Byte-Program)和字節(jié)校驗(yàn)(
Byte-Verify)
(注:字節(jié)校驗(yàn)相當(dāng)于讀數(shù)據(jù)指令)。
IAP程序做成子程序,主程序可以調(diào)用這些子程序執(zhí)行
IAP操
作,把數(shù)據(jù)燒寫到另外一塊的
FLASH空間中(
BLOCK1)。主程序中,目標(biāo)扇區(qū)先被擦除,然后把
數(shù)據(jù)(
0,1,2,…,n,n等于一個(gè)扇區(qū)的大小)寫入到
BLOCK1目標(biāo)地址
BLK1-DST-ADDR,IAP
成功完成后,
ErrorCode變?yōu)?,如果有錯(cuò)誤出現(xiàn)時(shí),程序保持錯(cuò)誤功能,ErrorCode還是為1。
/***********************************************************************************************************
* demoIAP.c -SST89x564RD IAP C51示范代碼
*
* SST89x564RD、SST89x554RC、SST89x58RD2、SST89x54RD2和SST89x53RD2
* MCU有兩個(gè)內(nèi)部FLASH存儲(chǔ)器塊,本代碼是從BLOCK0執(zhí)行IAP指令改寫。
* BLOCK1的1000H(SST89x564RD)或E000H (SST89x554RC、SST89x58RD2、SST89x54RD2
* 和SST89x53RD2)的數(shù)據(jù)。
* 本程序默認(rèn)是SST89x564RD,如果使用SST89x554RC、SST89x58RD2、SST89x54RD2
* 和SST89x53RD2,只要修改變量BLK1_DST_ADDR就可以。
*
***********************************************************************************************************/
#include "shuma.c"
/***********************************************************************************************************
* MCU特殊功能寄存器地址
***********************************************************************************************************/
sfr SFCF = 0xB1; /*FLASH配置位
*/
sfr SFCM = 0xB2; /*FLASH命令位*/
sfr SFAL = 0xB3; /*FLASH地址低位*/
sfr SFAH = 0xB4; /*FLASH地址高位*/
sfr SFDT = 0xB5; /*FLASH數(shù)據(jù)位*/
sfr SFST = 0xB6; /*FLASH狀態(tài)位
*/
/***********************************************************************************************************
* MCU IAP命令
***********************************************************************************************************/
#define SFCM_SE 0x0B; /*扇區(qū)擦除IAP指令*/
#define SFCM_VB 0x0C; /*字節(jié)校讀IAP指令*/
#define SFCM_PB 0x0E; /*字節(jié)編程IAP指令*/
/***********************************************************************************************************
* 全局變量定義
***********************************************************************************************************/
//const unsigned short int BLK1_DST_ADDR = 0x1000;
/*SST89x564RD準(zhǔn)備寫入的目標(biāo)地址
(在另外一塊的片內(nèi)FLASH)
如果是用SST89x554RC、SST89x58RD2、SST89x54RD2和SST89x53RD2,請(qǐng)刪除這句,
改為用下面一句。*/
//const unsigned short int BLK1_DST_ADDR = 0x0F000;
/*SST89x554RC、SST89x58RD2、SST89x54RD2和SST89x53RD2準(zhǔn)備寫入的目標(biāo)地址。
*/
const unsigned short int BLK1_DST_ADDR = 0x0Ff00;
const unsigned char SECT_SIZE = 0x80; /*一個(gè)扇區(qū)的字節(jié)數(shù)
*/
unsigned char ErrorCode; /*標(biāo)示操作的結(jié)果*/
/***********************************************************************************************************
* Function Prototype
***********************************************************************************************************/
void sector_erase(unsigned short int dataAddr);
void byte_program(unsigned short int dataAddr, unsigned char dataByte);
unsigned char byte_verify(unsigned short int dataAddr);
int ready();
void error();
/***********************************************************************************************************
*主程序
深圳科賽電子
0755-83014227 13316986132 e-mail: szks@szks.net http://www.szks.net
SST單片機(jī)
IAP編程示例(
C語言)
* 改寫塊1一個(gè)扇區(qū)的數(shù)據(jù)
(從0開始,每次加1),地址從BLK1_DST_ADDR開始。
* 當(dāng)IAP執(zhí)行成功,
ErrorCode=0,否則ErrorCode=1.
***********************************************************************************************************/
void Ldelay()
{
uint t=100;
while(t--)
{
s_delay();
}
}
unsigned char t=0;
unsigned char v=0;
void Init_timer0()
{
TMOD=0x01;
TH0=0X4C;
TL0=0X00;
ET0=1;
EA=1;
TR0=1;
}
void main()
{
unsigned short int destAddr = BLK1_DST_ADDR;
unsigned char byteCnt ; //字節(jié)數(shù)
unsigned char origData; //存儲(chǔ)IAP操作的數(shù)據(jù)
unsigned char verifyData=0; //校對(duì)數(shù)據(jù)
Init_timer0();
/* sector_erase(destAddr); //寫數(shù)據(jù)前先擦除要寫的扇區(qū)
origData = 0;
verifyData=byte_verify(destAddr+1); //校對(duì)編程的字節(jié)是否正確
for(byteCnt=0; byteCnt<SECT_SIZE; byteCnt++)
{
byte_program(destAddr,origData); //編程一個(gè)字節(jié)
verifyData=byte_verify(destAddr); //校對(duì)編程的字節(jié)是否正確
if(verifyData!=origData)
error(); //如果編程不正確跳到error
destAddr++;
origData++;
}
ErrorCode=0; //IAP正確*/
while(1)
{
verifyData=byte_verify( BLK1_DST_ADDR+8);
smxs(verifyData);
}
}
void timer0()interrupt 1
{
TR0=0;
TH0=0X4C;
TL0=0X00;
t++;
if(t==20)
{
unsigned char verifyData;
v++;
sector_erase(BLK1_DST_ADDR+8);
byte_program( BLK1_DST_ADDR+8, 1);
verifyData=byte_verify( BLK1_DST_ADDR+8); //校對(duì)編程的字節(jié)是否正確
if(verifyData!=1)
error(); //如果編程不正確跳到error
}
TR0=1;
}
/***********************************************************************************************************
* IAP子程序
* 1. Sector-Erase 扇區(qū)擦除
* 2. Byte-Program 字節(jié)編程
* 3. Byte-Verify 字節(jié)校讀
***********************************************************************************************************/
/***********************************************************************************************************
*扇區(qū)擦除子程序
***********************************************************************************************************/
void sector_erase(unsigned short int dataAddr)
{
unsigned short int destAddr = dataAddr;
SFCF = SFCF | 0x40; /*IAP使能*/
SFAH = destAddr>>8; /*存入地址的高位字節(jié)*/
SFAL = destAddr; /*存入地址的低位字節(jié)*/
SFCM = SFCM_SE; /*發(fā)出扇區(qū)擦除指令
*/
if(!ready())
error();
return;
}
/***********************************************************************************************************
*字節(jié)編程子程序
***********************************************************************************************************/
void byte_program(unsigned short int dataAddr, unsigned char dataByte)
{
unsigned short int destAddr = dataAddr;
SFCF = SFCF | 0x40; /* IAP使能*/
SFAH = destAddr>>8; /*存入地址的高位字節(jié)*/
SFAL = destAddr; /*存入地址的低位字節(jié)*/
SFDT = dataByte; /*存入要編程的數(shù)據(jù)
*/
SFCM = SFCM_PB; /*發(fā)出字節(jié)編程指令
*/
if(!ready())
error();
return;
}
/***********************************************************************************************************
*字節(jié)校讀子程序
***********************************************************************************************************/
unsigned char byte_verify(unsigned short int dataAddr)
{
unsigned short int destAddr = dataAddr;
unsigned char readByte;
SFCF = SFCF | 0x40; /*IAP使能*/
SFAH = destAddr>>8; /*存入地址的高位字節(jié)*/
SFAL = destAddr; /*存入地址的低位字節(jié)*/
SFCM = SFCM_VB; /*發(fā)出字節(jié)校讀指令*/
readByte = SFDT;
SFCF = SFCF & 0xBF; /*關(guān)閉IAP*/
SFDT = 0;
return readByte;
}
/***********************************************************************************************************
*準(zhǔn)備子程序
*
* 檢查IAP操作是否完成。如果結(jié)束,關(guān)閉IAP。
***********************************************************************************************************/
int ready()
{
unsigned long int TimeOut = 0;
while (TimeOut < 100000)
{
if ((SFST&4) == 0) /*查IAP是否完成*/
{ /*IAP完成*/
SFCF = SFCF & 0xBF; /*關(guān)閉IAP*/
SFDT = 0;
return 1; /* IAP操作結(jié)束*/
}
TimeOut++;
}
SFCF = SFCF & 0xBF; /*關(guān)閉IAP*/
SFDT = 0;
return 0; /*IAP操作沒有完成*/
}
/***********************************************************************************************************
* Error Function
***********************************************************************************************************/
void error()
{
ErrorCode=1; /*IAP出錯(cuò)*/
while(1) /*軟件陷阱*/
{smxs(0123);}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -