⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stc12c5410ad_flashiap.c

📁 一个完整的个人产品开发源代码,包括对单片机STC12C5410的编程(含内部AD采样、自创的内部Flash编程源码等)、LCD1602的驱动编程等。
💻 C
字号:
/********************************************************************************************************
**				                STC12C5410AD单片机Flash EEPROM的IAP操作例程源文件
**
**                                          版权所有 (c) 2007,罗建
**                                               保留所有权利
**
**                                                  V1.00
**
**
**-------------------------------------------------文件信息----------------------------------------------
**文   件   名: STC12C5410AD_FlashIAP.H
**创   建   人: 罗 建
**最后修改日期: 2007年06月29日
**描        述: STC12C5410AD单片机Flash EEPROM的IAP操作例程头文件。本文件中的例程借鉴了深圳宏晶公司的相关
**              例程。本文件的原始文件来源于STC89C54RD_FlashIAP.H。
**
**-----------------------------------------------历史版本信息--------------------------------------------
** 创建人: 罗建
** 版  本: V1.00
** 日 期: 2007年06月29日
** 描 述: 原始版本。
**
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 版  本:
** 日 期:
** 描 述:
**
**-----------------------------------------------当前版本修订--------------------------------------------
** 修改人: 罗建
** 日 期: 2007年06月29日
** 描 述: 
**
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include <Intrins.h>
#include "STC12C5410AD.H"
#include "STC12C5410AD_FlashIAP.H"

// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: ISP_IAP_Enable
** 功能描述: 允许对STC12C5410AD单片机的EEPROM进行ISP/IAP操作。
** 输  入: 无
** 输  出: 无
** 全局变量: 无
** 全局常量:无
** 调用模块: 无
** 其它说明:详见有关ISP_CONTR寄存器的说明。
**
** 作  者: 罗建
** 日  期: 2007年06月29日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void ISP_IAP_Enable(void)
{
  EA = 0;	                                     /* 关中断 */
  ISP_CONTR	= ISP_CONTR & 0x18;                  /* 0001,1000 */
  ISP_CONTR	= ISP_CONTR | WAIT_TIME;             /* 设置等待时间 */
  ISP_CONTR	= ISP_CONTR | 0x80;                  /* 1000,0000 */
}

// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: ISP_IAP_Disable
** 功能描述: 禁止对STC12C5410AD单片机的EEPROM进行ISP/IAP操作。
** 输  入: 无
** 输  出: 无
** 全局变量: 无
** 全局常量:无
** 调用模块: 无
** 其它说明:详见有关ISP_CONTR和ISP_TRIG两个寄存器的说明。
**
** 作  者: 罗建
** 日  期: 2007年06月29日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void ISP_IAP_Disable(void)
{
  ISP_CONTR	= ISP_CONTR & 0x7f;	                 /* 0111,1111 */
  ISP_TRIG	= 0x00;
  EA = 1;                	                     /* 开中断 */
}

// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: ReadBytes
** 功能描述: 读STC12C5410AD单片机EEPROM中的连续ByteQuantity个字节数据到nDataBuf缓冲区中。
** 输  入: nByteAddr>>>>>>>>>>要读出的数据缓冲区在EEPROM中的首地址;
**           ByteQuantity>>>>>>>要读出的数据个数;
**           nDataBuf[]>>>>>>>>>要读出的数据。
** 输  出: 位变量>>>>>>>>>>>>>操作成功则返回OK(实际上永远返回OK)。
** 全局变量: 无
** 全局常量:无
** 调用模块: ISP_IAP_Enable>>>>>允许对STC89C54RD+单片机的EEPROM进行ISP/IAP操作;
**           ISP_IAP_Disable>>>>禁止对STC89C54RD+单片机的EEPROM进行ISP/IAP操作。
** 其它说明:详细的操作说明见深圳宏晶公司的数据手册。
**
** 作  者: 罗建
** 日  期: 2007年06月29日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
bit ReadBytes(INT16U nByteAddr, INT8U ByteQuantity, INT8U nDataBuf[])
{
  INT8U  i;
  
  ISP_CMD = ISP_CMD & 0xF8;                      /* 1111,1000 */
  ISP_CMD = ISP_CMD | CMD_READ_DM;               /* 0000,0001 */
  ISP_IAP_Enable();
  for (i=0;i<ByteQuantity;i++)                   /* 写入ByteQuantity个字节 */
  {
    ISP_ADDRH = (INT8U)(nByteAddr >> 8);         /* 设置扇区地址 */
    ISP_ADDRL = (INT8U)(nByteAddr & 0x00FF);
    ISP_TRIG  = 0x46;
    ISP_TRIG  = 0xB9;
    _nop_();
    nDataBuf[i] = ISP_DATA;                      /* 读取一字节数据,并移动缓冲区指针 */
    nByteAddr++;                                 /* 准备下一个字节地址 */
  }
  ISP_IAP_Disable();
  return OK;
}

// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: WriteBytes
** 功能描述: 将nDataBuf缓冲区中的连续ByteQuantity个字节数据写入到STC12C5410AD单片机EEPROM中。
** 输  入: nByteAddr>>>>>>>>>>要写入的数据缓冲区在EEPROM中的首地址;
**           ByteQuantity>>>>>>>要写入的数据个数;
**           nDataBuf[]>>>>>>>>>要写入的数据。
** 输  出: 位变量>>>>>>>>>>>>>操作成功则返回OK,否则返回ERROR。** 全局变量: 无
** 全局常量:无
** 调用模块: ISP_IAP_Enable>>>>>允许对STC12C5410AD单片机的EEPROM进行ISP/IAP操作;
**           ISP_IAP_Disable>>>>禁止对STC12C5410AD单片机的EEPROM进行ISP/IAP操作。
** 其它说明:详细的操作说明见深圳宏晶公司的数据手册。
**
** 作  者: 罗建
** 日  期: 2007年06月29日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
bit WriteBytes(INT16U nByteAddr, INT8U ByteQuantity, INT8U nDataBuf[])
{
  INT16U i;  
  INT16U nSectorAddr;
  
  /* 擦除要修改/写入的扇区 */
  nSectorAddr = (nByteAddr & 0xFE00);            /* 1111,1110,0000,0000; 取扇区地址 */
  ISP_ADDRH	= (INT8U)(nSectorAddr >> 8);         /* 设置扇区地址 */
  ISP_ADDRL	= 0x00;
  ISP_CMD   = ISP_CMD &	0xF8;                    /* 1111,1000 */
  ISP_CMD   = ISP_CMD |	CMD_ERASE_DM;            /* 0000,0011 */
  ISP_IAP_Enable();
  ISP_TRIG  = 0x46;                              /* 触发ISP_IAP命令 */
  ISP_TRIG  = 0xB9;                              /* 触发ISP_IAP命令 */
  _nop_();

  /* 写入连续ByteQuantity个字节,并校验 */    
  for (i=0;i<ByteQuantity;i++)                   /* 读取ByteQuantity个字节 */
  {
    /* 写一个字节 */	
	  ISP_ADDRH = (INT8U)(nByteAddr >> 8);         /* 设置扇区地址 */
    ISP_ADDRL = (INT8U)(nByteAddr & 0x00FF);
    ISP_DATA  =	nDataBuf[i];                     /* 设置要编程的数据,并移动缓冲区指针 */
    ISP_CMD   = ISP_CMD & 0xF8;                  /* 1111,1000 */
    ISP_CMD   = ISP_CMD | CMD_PROGRAM_DM;        /* 0000,0010 */
    ISP_IAP_Enable();                            /* 允许IAP编程 */
    ISP_TRIG  =	0x46;                            /* 触发ISP_IAP命令 */
    ISP_TRIG  =	0xB9;                            /* 触发ISP_IAP命令 */
    _nop_();
    /* 读回来 */
    ISP_DATA  =	0x00;
    ISP_CMD   =	ISP_CMD & 0xF8;                  /* 1111,1000 */
    ISP_CMD   =	ISP_CMD | CMD_READ_DM;           /* 0000,0001 */
    ISP_TRIG  =	0x46;	                           /* 触发ISP_IAP命令 */
    ISP_TRIG  =	0xB9;                            /* 触发ISP_IAP命令 */
    _nop_();
    /*  比较对错 */
    if(ISP_DATA != nDataBuf[i])
    {
      ISP_IAP_Disable();
      return ERROR;
    }
    nByteAddr++;                                 /* 准备下一个字节地址 */
  }
  ISP_IAP_Disable();                             /* 禁止IAP编程 */
  return OK;
}    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -