1、SST 单片机 IAP 编程示例 (C语言)程序说明:本程序用的单片机是 SST89x564RD、SST89x554RC、SST89x58RD2、SST89x54RD2和SST89x52RD2。示例程序代码中,执行 IAP指令的程序放在单片机低端程序空间,也就是 BLOCK0,IAP的程序包括了扇区擦除(Sector-Erase)、字节编程(Byte-Program)和字节校验(Byte-Verify)(注:字节校验相当于读数据指令)。IAP 程序做成子程序,主程序可以调用这些子程序执行 IAP操作,把数据烧写到另外一块的 FLASH空间中(BLOCK1)。主程序中,目标扇区先被擦除,然后把数
2、据(0,1,2,n,n 等于一个扇区的大小)写入到 BLOCK1目标地址BLK1-DST-ADDR,IAP成功完成后,ErrorCode 变为 0,如果有错误出现时,程序保持错误功能,ErrorCode还是为 1。/* demoIAP.c - SST89x564RD IAP C51示范代码* SST89x564RD、SST89x554RC、SST89x58RD2、SST89x54RD2 和 SST89x53RD2* MCU有两个内部 FLASH存储器块,本代码是从 BLOCK0执行 IAP指令改写。* BLOCK1的 1000H(SST89x564RD)或 E000H (SST89x554RC
3、、SST89x58RD2、SST89x54RD2* 和 SST89x53RD2)的数据。* 本程序默认是 SST89x564RD,如果使用SST89x554RC、SST89x58RD2、SST89x54RD2* 和 SST89x53RD2,只要修改变量 BLK1_DST_ADDR就可以。*/* MCU特殊功能寄存器地址*/sfr SFCF = 0xB1; /*FLASH配置位*/sfr SFCM = 0xB2; /*FLASH命令位*/sfr SFAL = 0xB3; /*FLASH地址低位*/sfr SFAH = 0xB4; /*FLASH地址高位*/sfr SFDT = 0xB5; /*F
4、LASH数据位*/sfr SFST = 0xB6; /*FLASH状态位*/* MCU IAP命令*/#define SFCM_SE 0x0B; /*扇区擦除 IAP指令*/#define SFCM_VB 0x0C; /*字节校读 IAP指令*/#define SFCM_PB 0x0E; /*字节编程 IAP指令*/* 全局变量定义*/const unsigned short int BLK1_DST_ADDR = 0x1000;/*SST89x564RD准备写入的目标地址(在另外一块的片内 FLASH)如果是用 SST89x554RC、SST89x58RD2、SST89x54RD2 和 SS
5、T89x53RD2,请删除这句,改为用下面一句。*/*const unsigned short int BLK1_DST_ADDR = 0x0F000; */*SST89x554RC、SST89x58RD2、SST89x54RD2 和 SST89x53RD2准备写入的目标地址。*/const unsigned char SECT_SIZE = 0x80; /*一个扇区的字节数*/unsigned char ErrorCode; /*标示操作的结果*/* Function Prototype*/void sector_erase(unsigned short int dataAddr);void
6、 byte_program(unsigned short int dataAddr, unsigned char dataByte);unsigned char byte_verify(unsigned short int dataAddr);int ready();void error();/* 主程序 * 改写块 1一个扇区的数据(从 0开始,每次加 1),地址从 BLK1_DST_ADDR开始。* 当 IAP执行成功,ErrorCode=0,否则 ErrorCode=1.*/void main()unsigned short int destAddr = BLK1_DST_ADDR;un
7、signed char byteCnt ; /*字节数*/unsigned char origData; /*存储 IAP操作的数据*/unsigned char verifyData; /*校对数据*/sector_erase(destAddr); /*写数据前先擦除要写的扇区*/origData = 0;for(byteCnt=0; byteCnt8; /*存入地址的高位字节*/SFAL = destAddr; /*存入地址的低位字节*/SFCM = SFCM_SE; /*发出扇区擦除指令*/if(!ready()error();return;/* 字节编程子程序*/void byte_p
8、rogram(unsigned short int dataAddr, unsigned char dataByte)unsigned short int destAddr = dataAddr;SFCF = SFCF | 0x40; /* IAP使能*/SFAH = destAddr8; /*存入地址的高位字节*/SFAL = destAddr; /*存入地址的低位字节*/SFDT = dataByte; /*存入要编程的数据*/SFCM = SFCM_PB; /*发出字节编程指令*/if(!ready()error();return;/* 字节校读子程序*/unsigned char by
9、te_verify(unsigned short int dataAddr)unsigned short int destAddr = dataAddr;unsigned char readByte;SFCF = SFCF | 0x40; /*IAP使能*/SFAH = destAddr8; /*存入地址的高位字节*/SFAL = destAddr; /*存入地址的低位字节*/SFCM = SFCM_VB; /*发出字节校读指令*/readByte = SFDT;SFCF = SFCF /*关闭 IAP*/SFDT = 0;return readByte;/* 准备子程序* 检查 IAP操作是否完成。如果结束,关闭 IAP。*/int ready()unsigned long int TimeOut = 0;while (TimeOut 100000)if (SFST /*关闭 IAP*/SFDT = 0;return 1; /* IAP操作结束*/TimeOut+;SFCF = SFCF /*关闭 IAP*/SFDT = 0;return 0; /*IAP操作没有完成*/* Error Function*/void error()ErrorCode=1; /*IAP出错*/while(1) /*软件陷阱*/