kini 发表于 2024-5-20 09:44:07

为什么eeprom断电保存功能存一个字节的0x08就行,再大如0x09断电以后就记不住了

以下是eeprom配置
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCAI.com ---------------------------------------------*/
/* --- BBS: www.STCAIMCU.com-----------------------------------------*/
/* --- QQ:800003751 -------------------------------------------------*/
/* Èç¹ûÒªÔÚ³ÌÐòÖÐʹÓô˴úÂë,ÇëÔÚ³ÌÐòÖÐ×¢Ã÷ʹÓÃÁËSTCµÄ×ÊÁϼ°³ÌÐò            */
/*---------------------------------------------------------------------*/

#include "STC8G_H_EEPROM.h"
#define eepRomAdd_mainAddr 0x06 ¶¨Òåeeprom´¢´æµØÖ·
//========================================================================
// º¯Êý: void        ISP_Disable(void)
// ÃèÊö: ½ûÖ¹·ÃÎÊISP/IAP.
// ²ÎÊý: non.
// ·µ»Ø: non.
// °æ±¾: V1.0, 2012-10-22
//========================================================================

void        DisableEEPROM(void)
{
        IAP_CONTR = 0;                        //½ûÖ¹IAP²Ù×÷
        IAP_CMD   = 0;                        //È¥³ýIAPÃüÁî
        IAP_TRIG= 0;                        //·ÀÖ¹IAPÃüÁîÎó´¥·¢
        IAP_ADDRH = 0xff;                //Çå0µØÖ·¸ß×Ö½Ú
        IAP_ADDRL = 0xff;                //Çå0µØÖ·µÍ×Ö½Ú£¬Ö¸Ïò·ÇEEPROMÇø£¬·ÀÖ¹Îó²Ù×÷
}

//========================================================================
// º¯Êý: void EEPROM_Trig(void)
// ÃèÊö: ´¥·¢EEPROM²Ù×÷.
// ²ÎÊý: none.
// ·µ»Ø: none.
// °æ±¾: V1.0, 2014-6-30
//========================================================================
void EEPROM_Trig(void)
{
        F0 = EA;    //±£´æÈ«¾ÖÖжÏ
        EA = 0;   //½ûÖ¹ÖжÏ, ±ÜÃâ´¥·¢ÃüÁîÎÞЧ
        IAP_TRIG = 0x5A;
        IAP_TRIG = 0xA5;                  //ÏÈËÍ5AH£¬ÔÙËÍA5Hµ½IAP´¥·¢¼Ä´æÆ÷£¬Ã¿´Î¶¼ÐèÒªÈç´Ë
                                                                                                                                                        //ËÍÍêA5Hºó£¬IAPÃüÁîÁ¢¼´±»´¥·¢Æô¶¯
                                                                                                                                                        //CPUµÈ´ýIAPÍê³Éºó£¬²Å»á¼ÌÐøÖ´ÐгÌÐò¡£
        _nop_();
        _nop_();
        EA = F0;    //»Ö¸´È«¾ÖÖжÏ
}

//========================================================================
// º¯Êý: void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
// ÃèÊö: ´ÓÖ¸¶¨EEPROMÊ×µØÖ·¶Á³ön¸ö×Ö½Ú·ÅÖ¸¶¨µÄ»º³å.
// ²ÎÊý: EE_address:¶Á³öEEPROMµÄÊ×µØÖ·.
//       DataAddress: ¶Á³öÊý¾Ý·Å»º³åµÄÊ×µØÖ·.
//       number:      ¶Á³öµÄ×Ö½Ú³¤¶È.
// ·µ»Ø: non.
// °æ±¾: V1.0, 2012-10-22
//========================================================================
void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
{
        IAP_ENABLE();                           //ÉèÖõȴýʱ¼ä£¬ÔÊÐíIAP²Ù×÷£¬ËÍÒ»´Î¾Í¹»
        IAP_READ();                           //ËÍ×Ö½Ú¶ÁÃüÁÃüÁî²»Ðè¸Ä±äʱ£¬²»ÐèÖØÐÂËÍÃüÁî
        do
        {
                IAP_ADDRH = EE_address / 256;       //Ë͵ØÖ·¸ß×Ö½Ú£¨µØÖ·ÐèÒª¸Ä±äʱ²ÅÐèÖØÐÂË͵ØÖ·£©
                IAP_ADDRL = EE_address % 256;       //Ë͵ØÖ·µÍ×Ö½Ú
                EEPROM_Trig();                      //´¥·¢EEPROM²Ù×÷
                *DataAddress = IAP_DATA;            //¶Á³öµÄÊý¾ÝËÍÍù
                EE_address++;
                DataAddress++;
        }while(--number);

        DisableEEPROM();
}

//========================================================================
// º¯Êý: void EEPROM_SectorErase(u16 EE_address)
// ÃèÊö: °ÑÖ¸¶¨µØÖ·µÄEEPROMÉÈÇø²Á³ý.
// ²ÎÊý: EE_address:Òª²Á³ýµÄÉÈÇøEEPROMµÄµØÖ·.
// ·µ»Ø: non.
// °æ±¾: V1.0, 2013-5-10
//========================================================================
void EEPROM_SectorErase(u16 EE_address)
{
        IAP_ENABLE();                     //ÉèÖõȴýʱ¼ä£¬ÔÊÐíIAP²Ù×÷£¬ËÍÒ»´Î¾Í¹»
        IAP_ERASE();                        //ºêµ÷ÓÃ, ËÍÉÈÇø²Á³ýÃüÁÃüÁî²»Ðè¸Ä±äʱ£¬²»ÐèÖØÐÂËÍÃüÁî
                                                                                                                                                        //Ö»ÓÐÉÈÇø²Á³ý£¬Ã»ÓÐ×Ö½Ú²Á³ý£¬512×Ö½Ú/ÉÈÇø¡£
                                                                                                                                                        //ÉÈÇøÖÐÈÎÒâÒ»¸ö×Ö½ÚµØÖ·¶¼ÊÇÉÈÇøµØÖ·¡£
        IAP_ADDRH = EE_address / 256;       //ËÍÉÈÇøµØÖ·¸ß×Ö½Ú£¨µØÖ·ÐèÒª¸Ä±äʱ²ÅÐèÖØÐÂË͵ØÖ·£©
        IAP_ADDRL = EE_address % 256;       //ËÍÉÈÇøµØÖ·µÍ×Ö½Ú
        EEPROM_Trig();                      //´¥·¢EEPROM²Ù×÷
        DisableEEPROM();                  //½ûÖ¹EEPROM²Ù×÷
}

//========================================================================
// º¯Êý: void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
// ÃèÊö: °Ñ»º³åµÄn¸ö×Ö½ÚдÈëÖ¸¶¨Ê×µØÖ·µÄEEPROM.
// ²ÎÊý: EE_address:дÈëEEPROMµÄÊ×µØÖ·.
//       DataAddress: дÈëÔ´Êý¾ÝµÄ»º³åµÄÊ×µØÖ·.
//       number:      Ð´ÈëµÄ×Ö½Ú³¤¶È.
// ·µ»Ø: non.
// °æ±¾: V1.0, 2012-10-22
//========================================================================
void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)//дÈëÊý¾Ý
{
        IAP_ENABLE();                     //ÉèÖõȴýʱ¼ä£¬ÔÊÐíIAP²Ù×÷£¬ËÍÒ»´Î¾Í¹»
        IAP_WRITE();                        //ºêµ÷ÓÃ, ËÍ×Ö½ÚдÃüÁî
        do
        {
                IAP_ADDRH = EE_address / 256;   //Ë͵ØÖ·¸ß×Ö½Ú£¨µØÖ·ÐèÒª¸Ä±äʱ²ÅÐèÖØÐÂË͵ØÖ·£©
                IAP_ADDRL = EE_address % 256;   //Ë͵ØÖ·µÍ×Ö½Ú
                IAP_DATA= *DataAddress;         //ËÍÊý¾Ýµ½IAP_DATA£¬Ö»ÓÐÊý¾Ý¸Ä±äʱ²ÅÐèÖØÐÂËÍ
                EEPROM_Trig();                  //´¥·¢EEPROM²Ù×÷
                EE_address++;                     //ÏÂÒ»¸öµØÖ·
                DataAddress++;                  //ÏÂÒ»¸öÊý¾Ý
        }while(--number);                   //Ö±µ½½áÊø
        DisableEEPROM();
}




soma 发表于 2024-5-20 10:33:20

注释都是乱码,格式没调好?

乘风飞扬 发表于 2024-5-20 10:41:29

用附件例子烧录到芯片里试试,通过串口打印EEPROM读写结果。
每个地址写入内容从0x00~-0xFF都可以,同一个地址重复写入之前要先擦除。

kini 发表于 2024-5-20 12:22:17

乘风飞扬 发表于 2024-5-20 10:41
用附件例子烧录到芯片里试试,通过串口打印EEPROM读写结果。
每个地址写入内容从0x00~-0xFF都可以,同一个 ...

感谢,就是忘记擦除了

toddyang 发表于 2024-5-22 07:56:35

乱码注释,看着眼晕
页: [1]
查看完整版本: 为什么eeprom断电保存功能存一个字节的0x08就行,再大如0x09断电以后就记不住了