当前位置:首页 > 单片机 > 单片机
[导读]STC89C51、52内部都自带有2K字节的EEPROM,54、55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000 次以上,先来介绍下ISP与IAP的区别和特点。知识点:ISP与IAP介绍

STC89C51、52内部都自带有2K字节的EEPROM,54、55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000 次以上,先来介绍下ISP与IAP的区别和特点。

知识点:ISP与IAP介绍

ISP:In System Programable 是指在系统编程,通俗的讲,就是片子已经焊板子上,不用取下,就可以简单而方便地对其进行编程。比如我们通过电脑给STC单片机下载程序,或给AT89S51单片机下载程序,这就是利用了ISP技术。

IAP:In Application Programable 是指在应用编程,就是片子提供一系列的机制(硬件/软件上的)当片子在运行程序的时候可以提供一种改变flash数据的方法。通俗点讲,也就是说程序自己可以往程序存储器里写数据或修改程序。这种方式的典型应用就是用一小段代码来实现程序的下载,实际上单片机的ISP功能就是通过IAP技术来实现的,即片子在出厂前就已经有一段小的boot程序在里面,片子上电后,开始运行这段程序,当检测到上位机有下载要求时,便和上位机通信,然后下载数据到存储区。大家要注意千万不要尝试去擦除这段ISP引导程序,否则恐怕以后再也下载不了程序了。

STC单片机内部有几个专门的特殊功能寄存器负责管理ISP/IAP功能的,见表1。

表1 ISP/IAP相关寄存器列表

名称地址功能描述D7D6D5D4D3D2D1D0复位值ISP_DATAE2hFlash数据寄存器







1111 1111ISP_ADDRHE3hFlash高字节地址寄存器







0000 0000ISP_ADDRLE4hFlash低字节地址寄存器







0000 0000ISP_CMDE5hFlash命令模式寄存器----------MS2MS1MS0xxxx x000ISP_TRIGE6hFlash命令触发寄存器







xxxx xxxxISP_CONTRE7hISP/IAP 控制寄存器ISPENSWBSSWRST----WT2WT1WT0000x x000

ISP_DATA:ISP/IAP操作时的数据寄存器。

ISP/IAP从Flash读出的数据放在此处,向Flash写入的数据也需放在此处。

ISP_ADDRH:ISP/IAP操作时的地址寄存器高八位。

ISP_ADDRL:ISP/IAP操作时的地址寄存器低八位。

ISP_CMD:ISP/IAP操作时的命令模式寄存器,须命令触发寄存器触发方可生效。命令模式如表2所示。

表2 ISP_CMD寄存器模式设置

D7D6D5D4D3D2D1D0模式选择保留命令选择
----------000待机模式,无ISP操作----------001对用户的应用程序flash区及数据flash区字节读----------010对用户的应用程序flash区及数据flash区字节编程----------011对用户的应用程序flash区及数据flash区扇区擦除

程序在系统ISP程序区时可以对用户应用程序区/数据Flash区(EEPROM)进行字节读/字节编程/扇区擦除;程序在用户应用程序区时,仅可以对数据Flash区(EEPROM)进行字节读/字节编程/扇区擦除。STC89C51RC/RD+系列单片机出厂时已经固化有ISP引导码,并设置为上电复位进入ISP程序区,并且出厂时就已完全加密。

ISP_TRIG:ISP/IAP操作时的命令触发寄存器。

在ISPEN(ISP_CONTR.7) =1时,对ISP_TRIG 先写入46h,再写入B9h,ISP/IAP命令才会生效。

STC89C52RC,STC89LE52RC单片机内部可用Data Flash(EEPROM)的地址如表3所示,其它型号单片机请查阅相关资料。

表3 STC89C52RC、STC89LE52RC单片机内部EEPROM地址表

第一扇区第二扇区第三扇区第四扇区起始地址结束地址起始地址结束地址起始地址结束地址起始地址结束地址2000H21FFH2200H23FFH2400H25FFH2600H27FFH第五扇区第六扇区第七扇区第八扇区起始地址结束地址起始地址结束地址起始地址结束地址起始地址结束地址2800H29FFH2A00H2BFFH2C00H2DFFH2E00H2FFFH

每个扇区为512字节,建议大家在写程序时,将同一次修改的数据放在同一个扇区,方便修改,因为在执行擦除命令时,一次最少要擦除一个扇区的数据(需要提供扇区的首地址),每次在更新数据前都必须要擦除原数据方可重新写入新数据,不能直接在原来数据基础上更新内容。

注意:上面的是数据存储区的地址,程序存储区地址是从0~1FFF,共8K,程序区只能是ISP编程。

以下是自己写的这部分功能代码,因为风格问题,不太喜欢原著代码,感觉自己的还严谨一点。

/****************************************************************************/

/* IAP驱动 */

/****************************************************************************/

/************************************************************************************************************************/

/*ISP/IAP相关寄存器列表*/

/*名称地址功能描述D7D6D5D4D3D2D1D0复位值*/

/*ISP_DATAE2hFlash数据寄存器1111 1111*/

/*ISP_ADDRHE3hFlash高字节地址寄存器0000 0000*/

/*ISP_ADDRLE4hFlash低字节地址寄存器0000 0000*/

/*ISP_CMDE5hFlash命令模式寄存器----------MS2MS1MS0xxxx x000*/

/*ISP_TRIGE6hFlash命令触发寄存器xxxx xxxx*/

/*ISP_CONTRE7hISP/IAP 控制寄存器ISPENSWBSSWRST----WT2WT1WT0000x x000*/

/************************************************************************************************************************/

/************************************************************************************/

/*ISP_CMD寄存器模式设置*/

/* D7D6D5D4D3D2D1D0模式选择*/

/*保留命令选择*/

/* ----------000待机模式,无ISP操作*/

/* ----------001对用户的应用程序flash区及数据flash区字节读*/

/* ----------010对用户的应用程序flash区及数据flash区字节编程*/

/* ----------011对用户的应用程序flash区及数据flash区扇区擦除*/

/************************************************************************************/

/*在ISPEN(ISP_CONTR.7) =1时,对ISP_TRIG 先写入46h,再写入B9h,ISP/IAP命令才会生效。*/

/* 定义常量 */

#define ERROR 0

#define OK 1

/* 定义Flash 操作等待时间 */

//#define WAIT_TIME 0x00 //mcu clock 40mhz

//#define WAIT_TIME 0x01 //mcu clock 20mhz

//#define WAIT_TIME 0x02 //mcu clock 10mhz

#define WAIT_TIME 0x03 //mcu clock 5mhz

sfr ISP_DATA= 0xe2; // Flash数据寄存器

sfr ISP_ADDRH= 0xe3;// Flash高字节地址寄存器

sfr ISP_ADDRL= 0xe4;// Flash低字节地址寄存器

sfr ISP_CMD= 0xe5;// Flash命令模式寄存器

sfr ISP_TRIG= 0xe6;// Flash命令触发寄存器

sfr ISP_CONTR= 0xe7;// ISP/IAP 控制寄存器

#define CMD_READ0x01// 定义IAP的读字节操作

#define CMD_PRGM0x02// 定义IAP的写字节操作

#define CMD_ERASE0x03// 定义IAP的擦除扇区操作

/*********************** 打开 ISP,IAP 功能 ***********************/

static void ISPIAPEnable(void)

{

  //EA= 0; // 关中断

  ISP_CONTR= ISP_CONTR & 0x18; // 0001,1000

  ISP_CONTR= ISP_CONTR | WAIT_TIME;// 写入硬件延时

  ISP_CONTR= ISP_CONTR | 0x80; // ISPEN = 1

}

/*********************** 关闭 ISP,IAP 功能 ***********************/

static void ISPIAPDisable(void)

{

  ISP_CONTR= ISP_CONTR & 0x7f;// ISPEN = 0

  ISP_TRIG= 0x00;

  //EA = 1; // 开中断

}

/************************* 触发Flash操作 *************************/

static ActiveOperate(void)

{

  bit eacpy;

  eacpy = EA;

  EA = 0;

  ISPIAPEnable();

  ISP_TRIG = 0x46; // 触发ISP_IAP命令字节1

  ISP_TRIG = 0xb9; // 触发ISP_IAP命令字节2

  {UINT8 i=2; while(i--);}

  ISPIAPDisable();

  EA = eacpy;

}

/**************************** 读一字节 ****************************/

static UINT8 IAPReadByte(const UINT16 uiAddr)

{

  ISP_ADDRH= (UINT8)(uiAddr >> 8);// 写地址

  ISP_ADDRL= (UINT8)(uiAddr&0xFF);

  ISP_CMD = ISP_CMD & 0xf8;// 清低三位

  ISP_CMD = ISP_CMD | CMD_READ;// 写入读命令

  ActiveOperate();// 触发执行

  return (ISP_DATA); // 返回读到的数据

}

/**************************** 写一字节 ****************************/

static void IAPWriteByte(const UINT16 uiAddr, const UINT8 ucData)

{

  ISP_ADDRH= (UINT8)(uiAddr >> 8);// 写地址

  ISP_ADDRL= (UINT8)(uiAddr&0xFF);

  ISP_CMD = ISP_CMD & 0xf8;// 清低三位

  ISP_CMD = ISP_CMD | CMD_PRGM;// 写入写命令

  ISP_DATA= ucData; // 写入数据准备

  ActiveOperate();// 触发执行

}

/**************************** 擦除一扇区 ****************************/

static void IAPEarseSection(const UINT16 uiAddr)

{

  UINT16uiSecAddr;

  uiSecAddr= (uiAddr & 0xfe00);// 取扇区地址

  ISP_ADDRH= (UINT8)(uiSecAddr >> 8);// 写地址

  ISP_ADDRL= 0x00;

  ISP_CMD= ISP_CMD & 0xf8; // 清低三位

  ISP_CMD= ISP_CMD | CMD_ERASE;// 写入擦除命令

  ActiveOperate();// 触发执行

}

------------------------------------------------------------------------------------------------------------------------

#include//到宏晶网站下载头文件或自己在现有的头文件上加上相应的寄存器定义即可。
#include
#define uchar unsigned char
#define uint unsigned int

/****************uart init***********/
void UART_inti(void)
{
AUXR=0x40;//定时器1速度是普通8051的12倍,不分频
TMOD=0x20;//定时器1工作在方式2,用来产生波特率
SCON=0x50;//串口工作在方式1,允许接收
TL1=0xF7;//波特率为38400;FB为115200
TH1=0xF7;
PCON=0x00;//SMOD=0
TR1=1; //产生波特率
}

void ISP_write

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭