找回密码
 立即注册
查看: 78|回复: 9

关于8H4K64TL的EEPROM

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-04-11 13:49:10
已绑定手机

1

主题

3

回帖

13

积分

新手上路

积分
13
发表于 2025-4-11 13:49:10 | 显示全部楼层 |阅读模式
1. EEPROM 写入前是否要进行擦除。好像遇到了数据无法正确保存。是因为只能把字节里的1写成0 么?

2. 如果写入前进行擦除,是怎么擦除的。
   目前遇到eep_erase(0x0000), 会导致我存在(0x0512)开始的2个字节的数据变成FF,
   就算我改到(0x0600)的数据也是会被擦除的。

回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-11 13:53:01 | 显示全部楼层
关于STC8H4K64TL的EEPROM操作问题,以下是专业解答:

1. EEPROM写入前是否需要进行擦除:
在STC8H4K64TL中,EEPROM的写入操作确实需要先进行擦除。这是因为EEPROM的物理特性决定了它只能将位从1变为0,而不能直接将0变为1。因此,在写入新数据之前,必须先将目标地址的数据擦除为全1(即0xFF),然后再进行写入操作。如果未进行擦除操作,可能会导致数据无法正确保存,因为新数据中的1无法覆盖原有的0。

2. 擦除操作的具体实现:
在STC8H4K64TL中,擦除操作通常是通过调用特定的擦除函数来实现的。例如,eeperase(0x0000)会擦除从地址0x0000开始的整个EEPROM区域。需要注意的是,擦除操作是以页为单位进行的,而不是单个字节。因此,即使你只指定了一个起始地址,擦除操作也会影响到该页内的所有数据。
你提到的eeperase(0x0000)导致地址0x0512和0x0600的数据也被擦除,这是因为这些地址位于同一个擦除页内。为了避免这种情况,建议在擦除操作前,先将需要保留的数据备份到其他存储区域,或者在设计时合理安排数据的存储位置,确保需要保留的数据不在同一个擦除页内。

3. 建议的操作流程:
备份数据:在进行擦除操作前,先将需要保留的数据备份到RAM或其他非易失性存储区域。
擦除操作:调用擦除函数,擦除目标页的数据。
写入数据:将备份的数据重新写入EEPROM,或者写入新的数据。

4. 注意事项:
擦除页大小:了解并确认STC8H4K64TL的EEPROM擦除页大小,以便合理安排数据存储位置。
擦除次数限制:EEPROM的擦写次数有限,频繁的擦写操作会缩短其寿命,因此应尽量减少不必要的擦写操作。
数据校验:在写入数据后,建议进行数据校验,确保数据正确写入。

通过以上步骤和注意事项,可以有效解决STC8H4K64TL EEPROM数据无法正确保存的问题,并确保数据的完整性和可靠性。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-11 13:53:01 | 显示全部楼层
关于STC8H4K64TL的EEPROM操作问题,以下是专业解答:

1. EEPROM写入前是否需要进行擦除:
在STC8H4K64TL中,EEPROM的写入操作确实需要先进行擦除。这是因为EEPROM的物理特性决定了它只能将位从1变为0,而不能直接将0变为1。因此,如果在写入新数据之前不进行擦除操作,可能会导致数据无法正确保存。具体来说,如果目标地址的当前数据位为0,而新数据位为1,那么写入操作将无法改变该位的状态,从而导致数据错误。

2. EEPROM的擦除操作:
在STC8H4K64TL中,EEPROM的擦除操作是通过将目标地址的数据位全部置为1(即0xFF)来实现的。擦除操作通常是以页为单位进行的,这意味着擦除一个地址会影响到整个页面的数据。例如,调用eeperase(0x0000)会擦除从0x0000开始的整个页面的数据,即使你只希望擦除特定地址的数据。
你提到的eeperase(0x0000)导致0x0512和0x0600地址的数据也被擦除,这是因为这些地址位于同一个擦除页面内。为了避免这种情况,建议在擦除操作前,先将需要保留的数据读取出来,擦除后再重新写入。

3. 解决方案:
数据备份:在进行擦除操作之前,先将需要保留的数据读取并备份到RAM中。
分页管理:合理规划数据的存储位置,避免将需要频繁擦除的数据和需要保留的数据放在同一个擦除页面内。
写入前擦除:在每次写入新数据之前,确保目标地址已经进行了擦除操作,以保证数据能够正确写入。

总结:STC8H4K64TL的EEPROM操作需要特别注意擦除和写入的顺序,以及擦除操作对页面内其他数据的影响。通过合理的数据管理和操作流程,可以有效避免数据丢失或错误。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-11 13:53:01 | 显示全部楼层
关于STC8H4K64TL的EEPROM操作问题,以下是专业解答:

1. EEPROM写入前是否需要进行擦除:
在STC8H4K64TL中,EEPROM的写入操作确实需要先进行擦除。这是因为EEPROM的物理特性决定了它只能将位从1变为0,而不能直接将0变为1。因此,在写入新数据之前,必须先将目标地址的数据擦除为全1(即0xFF),然后再写入新的数据。如果未进行擦除操作,可能会导致数据无法正确保存,因为新数据中的1无法覆盖原有的0。

2. 擦除操作的具体实现:
在STC8H4K64TL中,擦除操作通常是通过调用特定的擦除函数来实现的。例如,eeperase(0x0000)会擦除从地址0x0000开始的整个EEPROM区域。需要注意的是,擦除操作是以页为单位进行的,而不是单个字节。因此,即使你只指定了一个起始地址,擦除操作也会影响到该页内的所有数据。
你提到的问题,即擦除操作导致其他地址的数据也被擦除,这是因为擦除操作是以页为单位进行的。例如,如果0x0000和0x0512位于同一个页内,那么擦除0x0000所在的页会同时擦除0x0512的数据。为了避免这种情况,建议在擦除操作前,先将需要保留的数据读取出来,擦除后再重新写入。

3. 解决方案:
数据备份:在进行擦除操作前,先将需要保留的数据读取并备份到RAM中。
分页管理:合理规划EEPROM的使用,确保需要保留的数据和需要擦除的数据位于不同的页中。
擦除后写入:在擦除操作完成后,立即将备份的数据重新写入EEPROM。

4. 示例代码:
  
  1. c
  2.    // 假设需要保留0x0512和0x0513的数据
  3.    uint8t data1 = eepread(0x0512);
  4.    uint8t data2 = eepread(0x0513);
  5.    // 擦除EEPROM
  6.    eeperase(0x0000);
  7.    // 重新写入保留的数据
  8.    eepwrite(0x0512, data1);
  9.    eepwrite(0x0513, data2);
复制代码

通过以上方法,可以有效避免在擦除操作中丢失重要数据,并确保EEPROM的正确使用。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-11 13:53:01 | 显示全部楼层
关于STC8H4K64TL的EEPROM操作问题,以下是专业解答:

1. EEPROM写入前是否需要进行擦除:
   在STC8H4K64TL中,EEPROM的写入操作确实需要先进行擦除。这是因为EEPROM的物理特性决定了它只能将位从1变为0,而不能直接将0变为1。因此,在写入新数据之前,必须先将目标地址的数据擦除为全1(即0xFF),然后再进行写入操作。如果未进行擦除操作,可能会导致数据无法正确保存,因为新数据中的1无法覆盖原有的0。

2. EEPROM的擦除操作:
   在STC8H4K64TL中,EEPROM的擦除操作是以扇区为单位进行的。每个扇区的大小为512字节。因此,当调用eeperase(0x0000)时,实际上会擦除从0x0000开始的整个扇区(即0x0000到0x01FF)。这解释了为什么在0x0512和0x0600地址的数据也会被擦除为0xFF,因为这些地址位于同一个扇区内。

   解决方法:
数据保护:在进行擦除操作之前,建议先将需要保留的数据读取并暂存到RAM中,待擦除完成后再将这些数据写回EEPROM。
扇区管理:合理规划数据的存储位置,避免将需要频繁更新的数据与需要长期保存的数据放在同一个扇区内。可以将不同类别的数据分散存储在不同的扇区中,以减少擦除操作对其他数据的影响。

3. 具体操作步骤:
擦除操作:调用eeperase(address)函数,其中address为要擦除的扇区的起始地址。擦除操作会将整个扇区的数据置为0xFF。
写入操作:在擦除完成后,调用eepwrite(address, data)函数,将数据写入指定的地址。注意,写入的数据应为8位字节。

4. 注意事项:
擦除时间:EEPROM的擦除操作需要一定的时间,通常在几毫秒到几十毫秒之间。在擦除操作完成之前,避免进行其他EEPROM操作。
数据校验:在写入数据后,建议进行数据校验,确保数据正确写入。可以通过读取写入的数据并与原始数据进行比较来实现。

总结:在STC8H4K64TL中,EEPROM的写入操作需要先进行擦除,且擦除操作是以扇区为单位进行的。为了避免数据丢失,建议在擦除前备份需要保留的数据,并合理规划数据的存储位置。通过正确的操作步骤和注意事项,可以确保EEPROM数据的正确保存和读取。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-04-11 13:49:10
已绑定手机

1

主题

3

回帖

13

积分

新手上路

积分
13
发表于 2025-4-11 14:01:36 | 显示全部楼层
国芯人*** 发表于 2025-4-11 13:53
关于STC8H4K64TL的EEPROM操作问题,以下是专业解答:

1. EEPROM写入前是否需要进行擦除:

关于第二点,为啥0x0512和0x0600的地址会属于0x0000~0x1FF这个扇区里,不是很理解
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2025-4-11 14:49:29 | 显示全部楼层
烧录时要设置 EEPROM 的大小,这样可以确定 EEPROM的 最大有效地址

跟据烧录时选择的频率,要设置等待参数
截图202504111447168501.jpg

如图,IAP_TPS 要改成 24

截图202504111448389345.jpg
截图202504111449256971.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-04-11 13:49:10
已绑定手机

1

主题

3

回帖

13

积分

新手上路

积分
13
发表于 2025-4-11 15:15:33 | 显示全部楼层
神*** 发表于 2025-4-11 14:49
烧录时要设置 EEPROM 的大小,这样可以确定 EEPROM的 最大有效地址

跟据烧录时选择的频率,要设置等待参数 ...

目前我用的11.052Mhz的,所以我IAP_TPS选择的是12.
#define     EE_ADDRESS  0x0000  
#define     EE_ADDRESS_C_1 0x0200
void EEPROM_SectorErase(u16 EE_address)
{
    EA = 0;
    IAP_CONTR = 0x80;            
    IAP_TPS   = 12;               12MHz
    IAP_CMD   = 3;              
    IAP_ADDRH = EE_address / 256;
    IAP_ADDRL = EE_address % 256;
    IAP_TRIG  = 0x5a;            
    IAP_TRIG  = 0xa5;            
    _nop_();
    DisableEEPROM();
    EA = 1;
}
void DisableEEPROM(void)
{
    IAP_CONTR = 0;    // 锟截憋拷 IAP 锟斤拷锟斤拷
    IAP_CMD   = 0;    // 锟斤拷锟斤拷锟斤拷锟侥达拷锟斤拷
    IAP_TRIG  = 0;    // 锟斤拷锟斤拷锟斤拷锟斤拷拇锟斤拷锟?1锟?71锟?1锟?77
    IAP_ADDRH = 0x80; // 锟斤拷锟斤拷址锟斤拷锟矫碉拷锟斤拷 IAP 锟斤拷锟斤拷
    IAP_ADDRL = 0;
}

我去执行            
EEPROM_SectorErase(EE_ADDRESS_C_1);
EEPROM_write_n(EE_ADDRESS_C_1, pBuf, 10);        // Current Status
会将EE_ADDRESS  里的PID也擦除变成FF   FF
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-04-11 13:49:10
已绑定手机

1

主题

3

回帖

13

积分

新手上路

积分
13
发表于 2025-4-11 15:44:46 | 显示全部楼层
法外狂*** 发表于 2025-4-11 15:15
目前我用的11.052Mhz的,所以我IAP_TPS选择的是12.
#define     EE_ADDRESS  0x0000  
#define     EE_AD ...

有可能是因为烧录设置地方的EEPROM默认是0.5K的原因,改成1k,这样有效地址好像就是正常的了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2025-4-11 15:49:05 | 显示全部楼层
目前我用的11.052Mhz的,所以我IAP_TPS选择的是12.

===11


EEPROM 你先选择个 8K

0000H ~ 1FFFH
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:19 , Processed in 0.132148 second(s), 105 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表