原创 STC单片机之内部EEPROM

2010-8-23 23:12 6861 7 3 分类: MCU/ 嵌入式

 


IAP.C


/*


 * 文 件 名:IAP.c


 * 芯    片:STC12C5A60S2


 * 晶    振:12MHz


 * 创 建 者:冷月


 * 创建日期:2010.8.23


 * 修 改 者:


 * 修改日期:


 * 功能描述:STC内部1K(0x0000~0x3FFF)EEPROM读写


 *                  第一扇区0x0000~0x01FF


 *                  第二扇区0x0200~0x03FF


 */


 


#include <STC12C5A.H>


#include "IAP.h"


 


#define    uchar      unsigned char


#define    uint  unsigned int


 


 


/*


 * 函 数 名:Open_IAP


 * 功能描述:允许ISP/IAP


 * 输入参数:无


 * 返 回 值:无


 */


void Open_IAP(void)


{


       //IAPEN   SWBS    SWRST   CMD_FAIL -      WT2     WT1     WT0


       IAP_CONTR = 0x82;           //充许ISP/IAP,系统时钟<20MHz时,设置等待时间WT2,WT1,WT0(010)


}


 


 


/*


 * 函 数 名:Close_IAP


 * 功能描述:禁止ISP/IAP


 * 输入参数:无


 * 返 回 值:无


 */


void Close_IAP(void)


{


       IAP_CONTR = 0x00;           //禁止ISP/IAP


 


       IAP_ADDRH = 0xFF;


       IAP_ADDRL = 0xFF;


}


 


 


/*


 * 函 数 名:Read_IAP_Byte


 * 功能描述:从EEPROM指定的单元读取一个字节数据


 * 输入参数:addr:16bit地址


 * 返 回 值:IAP_DATA:从指定的地址读取到的数据


 */


uchar Read_IAP_Byte(uint addr)


{


       //-       -       -        -      -       -       MS1     MS0


       IAP_CMD = 0x01;


 


       IAP_ADDRH = (addr & 0xFF00)>>8;


       IAP_ADDRL = addr & 0x00FF;


 


       IAP_TRIG = 0x5A;


       IAP_TRIG = 0xA5;                     //对IAP_TRIG先写0x5A再写0xA5,ISP/IAP命令才会生效


 


       return IAP_DATA;


}


 


 


/*


 * 函 数 名:Write_IAP_Byte


 * 功能描述:把一个字节数据写入EEPROM指定的单元,写入数据前应先擦除扇区


 * 输入参数:addr:16bit地址;writeVal:要写入的数据


 * 返 回 值:无


 */


void Write_IAP_Byte(uint addr, uchar writeVal)


{


       //-       -       -        -      -       -       MS1     MS0


       IAP_CMD = 0x02;


 


       IAP_ADDRH = (addr & 0xFF00)>>8;


       IAP_ADDRL = addr & 0x00FF;


 


       IAP_DATA = writeVal;


 


       IAP_TRIG = 0x5A;


       IAP_TRIG = 0xA5;                     //对IAP_TRIG先写0x5A再写0xA5,ISP/IAP命令才会生效


}


 


 


/*


 * 函 数 名:Erase_IAP_Sector


 * 功能描述:擦除扇区,没有字节擦除


 * 输入参数:addr:扇区地址,扇区中任意一个字节地址都是该扇区地址


 * 返 回 值:无


 */


void Erase_IAP_Sector(uint addr)


{


       //-       -       -        -      -       -       MS1     MS0


       IAP_CMD = 0x03;


 


       IAP_ADDRH = (addr & 0xFF00)>>8;


       IAP_ADDRL = addr & 0x00FF;


 


       IAP_TRIG = 0x5A;


       IAP_TRIG = 0xA5;                     //对IAP_TRIG先写0x5A再写0xA5,ISP/IAP命令才会生效


}


 


 


/*


 * 函 数 名:Erase_IAP_Byte


 * 功能描述:擦除指定单元内容


 * 输入参数:addr:单元地址


 * 返 回 值:无


 */


void Erase_IAP_Byte(uint addr)


{


       //STC内部扩展1K(0x0000~0x03FF)ROM


       //临时存放EEPROM一个扇区512Byte数据


       uchar xdata EEPROM_sector[512] = {0};


 


       uint sectorAddr;            //扇区首地址


       uint unit;                      //某个扇区的某个单元0~511


       uint i;


 


       sectorAddr = ((int)(addr / 512)) * 512;


       unit = addr % 512;


 


       for (i=0; i<512; i++)


       {


              EEPROM_sector = Read_IAP_Byte(sectorAddr+i);        //读取扇区


       }


 


       Erase_IAP_Sector(sectorAddr);                  //擦除扇区


       EEPROM_sector[unit] = 0xFF;                         //要擦除的单元置为0xFF


 


       for (i=0; i<512; i++)


       {


              Write_IAP_Byte(sectorAddr+i, EEPROM_sector);         //重新写入扇区


       }


}


 


 


IAP.H


/*


 * 文 件 名:IAP.h


 * 芯    片:STC12C5A60S2


 * 晶    振:12MHz


 * 创 建 者:冷月


 * 创建日期:2010.8.23


 * 修 改 者:


 * 修改日期:


 * 功能描述:STC内部1K(0x0000~0x3FFF)EEPROM读写


 *                  第一扇区0x0000~0x01FF


 *                  第二扇区0x0200~0x03FF


 */


 


#ifndef    _IAP_H_


#define    _IAP_H_


 


#define    uchar      unsigned char


#define    uint  unsigned int


 


 


/*


 * 函 数 名:Open_IAP


 * 调    用:Open_IAP();


 * 功能描述:允许ISP/IAP


 */


void Open_IAP(void);


 


 


/*


 * 函 数 名:Close_IAP


 * 调    用:Close_IAP();


 * 功能描述:禁止ISP/IAP


 */


void Close_IAP(void);


 


 


/*


 * 函 数 名:Read_IAP_Byte


 * 调    用:val = Read_IAP_Byte(0x0000);


 * 功能描述:从指定的EEPROM单元读取一个字节


 */


uchar Read_IAP_Byte(uint addr);


 


 


/*


 * 函 数 名:Write_IAP_Byte


 * 调    用:Write_IAP_Byte(0x0000, 0x12);


 * 功能描述:向EEPROM指定的单元写入一个字节,写之前要先擦除


 */


void Write_IAP_Byte(uint addr, uchar writeVal);


 


 


/*


 * 函 数 名:Erase_IAP_Sector


 * 调    用:Erase_IAP_Sector(0x0000);


 * 功能描述:擦除整个扇区,扇区中任意一个字节地址都是该扇区地址


 */


void Erase_IAP_Sector(uint addr);


 


 


/*


 * 函 数 名:Erase_IAP_Byte


 * 调    用:Erase_IAP_Byte(0x0000);


 * 功能描述:擦除扇区中的一个单元


 */


void Erase_IAP_Byte(uint addr);


 


 


#endif


 


 


main.c


/*


 * 文 件 名:main.c


 * 芯    片:STC12C5A60S2


 * 晶    振:12MHz


 * 创 建 者:冷月


 * 创建日期:2010.8.23


 * 修 改 者:


 * 修改日期:


 * 功能描述:STC内部1K(0x0000~0x3FFF)EEPROM读写


 */


 


#include "IAP.h"


#include "UART.h"


 


#define    uchar      unsigned char


#define    uint  unsigned int


 


/*


 * 函 数 名:main


 * 功能描述:程序入口


 * 输入参数:无


 * 返 回 值:无


 */


void main(void)


{


       uchar temp1 = 0, temp2 = 0;


 


       UART1_Init(0xD9, 0, 1);


 


       Open_IAP();


      


       //Erase_IAP_Sector(0x0000);      


       Erase_IAP_Byte(0x0000);


      


       Write_IAP_Byte(0x0000, 0x56);


       Write_IAP_Byte(0x0001, 0x34);


       temp1 = Read_IAP_Byte(0x0000);


       temp2 = Read_IAP_Byte(0x0001);


                    


       Close_IAP();


      


       UART1_SendOneChar(temp1);


       UART1_SendOneChar(temp2);


 


       while (1);      


}

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2012-6-7 15:04

0k

相关推荐阅读
用户230358 2010-12-06 17:38
通用Makefile
Makefile初学者,看了点Makefile的资料,想着写个通用的Makefile,于是写了三天。。。可能还有很多错误,测试通过的有gcc的.s和.c,以及嵌入式开发arm-linux-gcc的.S...
用户230358 2010-11-28 09:30
RFID MFRC522
单片机:STC12C5A60S2读卡器:MFRC522非接触IC卡:M1卡keil版本:V4程序是看了网上找的,做了些整理,其中有?号的,是不理解为什么那么设置射频做了好多天,还是有很多不明白,希望对...
用户230358 2010-09-16 23:33
eclipse代码自动提示功能设置
默认是输入"."后出现自动提示,用于类成员的自动提示,可是有时候我们希望它能在我们输入类的首字母后就出现自动提示,可以节省大量的输入时间(虽然按alt + /会出现提示,但还是要多按一次按键,太麻烦了...
用户230358 2010-09-16 23:32
EmEditor配置JAVA
1、选择“工具->外部工具->自定义工具”菜单;2、在“外部工具”对话框中点击“新建”按钮,并进行如下设置:   标题:JAVAC   命令:F:\JDK\bin\javac.exe   ...
用户230358 2010-09-05 10:32
独立按键扫描
定时器1每20ms扫描一次按键,可处理短按、长按 key.c/* * 文 件 名:key.c * 芯    片:STC12C5A60S2 * 晶    振:12MHz * 创 建 者:冷月 * 创建日...
用户230358 2010-09-05 10:23
PWM实现蜂呜器唱歌
PWM用定时器0作时钟源可改变频率,用于输出音符频率,占空比输出音符音长 电路图: BUZZ.C /* * 文 件 名:BUZZ.C * 芯    片:STC12C5A60S2 * 晶    振:12...
EE直播间
更多
我要评论
1
7
关闭 站长推荐上一条 /3 下一条