📄 main_block0.c
字号:
//#pragma
/***********************************************************************************************************
* IAP_SST.c - SST89X564/554 SST89X516/58/54/52RD2的IAP在使用中编程
* 和如何使用地址不连续的BLOCK1块和BLOCK0一起作为程序存储区的演示程序
* 弘微科技(SPAC) 田伯运
* WEB: www.spacltd.com.cn TEL:0755-26010579 E-MAIL:andy.tian@spacltd.com.cn
*
* 功能介绍:
* 1.主要是演示SST的MCU(SST89X564/554 SST89X516/58/54/52RD2)的内部FLASH在线擦除编程
* 2.如何使用地址定位指令,使地址不连续的两个存储块都做为程序存储区使用,将原本
* 8K的程序存储区的SST89E/V52RD2变为16K的程序存储区.*
* 解决方法:在连接选项"KEIL C51/PROJECT/OPTIONS FOR TARGET/BL51 LOCATE/CODE"中
* 加入模块定位命令:*TOOL(0XF800),BLOCK1(0XF900)
* 3.如何在C51中嵌入A51汇编语言.
* 4.如何使用SOFTICE进行在线仿真SST单片机内部的1K扩展RAM和FLASH存储单元的擦除,改写,内容读取(实时显示)
* 5.也可作为软件仿真的逻辑分析仪功能的一个演示例子
*
* 功能,可以对单片机内部的FLASH存储器的内容改写更新,包括扇区擦除,字节编程,字节校验
* 等常用函数,用户可根据这些基本功能,延伸出MCU的程序在线升级,数据存储等功能.
* 本例子是对内部BLOCK1的FLASH的0X1000H地址的一个扇区(128个字节单元),写入00--0X80
* 的数据.如果编程成功,则闪烁P1.2,P1.3两个灯,如果编程失败,则点亮P1.2灯.
***********************************************************************************************************/
#include <SST89x5xxRD2.H> //加入SST MCU单片机的头文件,这样就剩去了许多的特殊寄存器的声明,
#include <stdio.h>
/***********************************************************************************************************
* Global Variable Definition
***********************************************************************************************************/
#define SST89X516_564RD 1
#define SST89X5XRD 0
#if SST89X516_564RD
unsigned short int EEPROM_ADDR_START = 0x01000;
//定义SST89EV564,89EV516RD2的数据存储起始地址在BLOCK1的0X1000-0X1FFF
#endif
#if SST89X5XRD
unsigned short int EEPROM_ADDR_START = 0x0F000;
//定义SST89EV554,89EV5XRD2的数据存储起始地址在BLOCK1的0XF000-0XFFFF
#endif
unsigned int test_addr =0xf802; //测试的FLASH地址单元为0xf802
const unsigned char SECT_SIZE = 0x80; /* 定义一个扇区的字节数为0x80=128个*/
unsigned char ErrorCode; /*show the result of the operation*/
sbit LED_ERR = P1^2;
sbit LED_OK = P1^3;
/***********************************************************************************************************
* Function Prototype,用到的函数声明
***********************************************************************************************************/
/***********************************************************************************************************
* 用到的外部函数声明
***********************************************************************************************************/
extern void sector_erase(unsigned short int dataAddr); //扇区擦除函数,擦除的地址为dataAddr
extern void byte_program(unsigned short int dataAddr, unsigned char dataByte);//字节编程函数
extern bit byte_modify(unsigned short int dataAddr, unsigned char dataByte);//字节编程函数
extern unsigned char byte_verify(unsigned short int dataAddr); //字节校验函数
extern int ready(); //检查是否擦除或编程的操作是否已经完成
extern void error(); //超时错误
extern void DelayUs(unsigned char n); //一个外部在BLOCK1块内的C51函数
extern void DelayMs(unsigned char n); //一个外部在BLOCK1块内的C51函数
extern void delay_100ms(unsigned char n); //延时100MS函数,一个外部在BLOCK1块内的C51函数
/***********************************************************************************************************
* IAP演示主程序
***********************************************************************************************************/
void main()
{
unsigned short int destAddr = EEPROM_ADDR_START;//擦除与编程的首地址
//----------------------测试FLASH_IAP在线编程的功能演示4:正常显示为:P1口显示暗灯的数据加一------------------------
//--可使用VIEW->MEMORY WINDOW->B1:0X1000查看SST MCU内部BLOCK1 FLASH存储器内容(B1:0X0000-0X1FFF)或(B1:0XE000-0XFFFF)的变化--------------------
SFCF=0x41; //使BLOCK1显示在0XE000-0XFFFF之间(SST89EV554,89EV5XRD2)
//SFCF=0x43; //??使BLOCK1定位在0X0000-0X1FFF之间(SST89EV564,89EV516RD2)
sector_erase(0xf100);
byte_modify(test_addr, 0xe7); //将0X1002存储器单元的内容修改为0X34
byte_modify(test_addr, 0x23); //将0X1002存储器单元的内容修改为0X98
byte_modify(test_addr, 0x45); //将0X1002存储器单元的内容修改为0X98
P1|=0x01;
while(P1&0x01); //如果P1.0=1,则一直原地循环
//----------------------测试FLASH_IAP在线编程的功能演示4-------------------------
while(1)
{
LED_OK=~LED_OK; //闪烁成功和错误指示灯(P1.3和P1.2),表示编程成功
LED_ERR=~LED_ERR;
delay_100ms(10);//调用C_BLOCK1.C C语言在BLOCK1中的0XF800地址的子程序1
DelayMs(3); //调用C_BLOCK1.C C语言在BLOCK1中的0XF800地址的子程序2
DelayUs(3); //调用C_BLOCK1.C C语言在BLOCK1中的0XF800地址的子程序3
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -