找回密码
 立即注册
查看: 121|回复: 3

老鸟因为误删字符导致读EEPROM出错的经历!

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-09-04 08:47:15
已绑定手机

1

主题

1

回帖

21

积分

新手上路

积分
21
发表于 2025-9-3 16:50:11 | 显示全部楼层 |阅读模式
这段日子在搞一块数控电源的控制板,代码界面和核心代码基本上都完成了,就想着把设置结果和平时的使用数据保存到EEPROM,然后在开机时提取出来恢复使用的,芯片使用的是STC8G1K17,采用的读写方式是IAP方式。没想到代码写好后,可能是因为连续调试太累了,竟然手残把代码中的某个字符删除了,竟然编译顺利通过,但是结果匪夷所思。下面是代码截图:

代码截图1

代码截图1

代码截图2

代码截图2


新代码写入后开机,但结果让我丈二金刚,摸不着头脑。我读取的是6个双字共24个字节,结果只有前面9个字节是正确的,后面的全是错误结果。

Err1

Err1

我当时在思考:如果代码是错误的话,应该读不出来数据呀。数据是在写入芯片时以EEPROM数据的方式写入的,肯定是完全写入了,为何只能读出前面的9个呢?会不会是因为我调整了EEPROM的大小而导致出问题呢?应该又不至于吧,好歹调整也是以扇区为单位,就是512个字节了。会不会是芯片在制造时最后一个扇区的后面这些FLASH出问题呢?因为程序代码超出芯片容量,已经把液晶的显示字库砍掉了大半,EEPROM也调整成只有一个扇区了,所以芯片根本没空间做成仿真调试程序。无耐之下,只好打电话给杨工,结果杨工被我气得哭笑不得,提醒我说:还是好好检查一下代码吧!如果芯片有问题,不会前面的能读出来,后面的不行的。
于是,我试着重新再写一次芯片,这次把剩余字节全擦写为0xFF。结果再读出来,还是那个样。

Err2

Err2

就是前面的9个字节是对的,后面的全错了。
这时我陷入了绝望,天啊,开什么国际玩笑,要么你直接程序出错,要么你直接读不出来吧,怎么搞个只读出来9个字节这么蹊跷?
连续调试程序一周时间,我实在是太累了。放一边吧,又不甘心。
晚饭后反复思考:杨工说的应该是对的,我的代码是不是有问题呢?于是我按杨工说的,参考PDF中的例子,反复对照。好像也没问题呀,等等……我怎么好像眼花了呢?PDF中的地址那里那个符号怎么好像比我这边的多一点呢?我这边是“>”,PDF中的是“>>”。晕死了,移位符变成了大于号,从移位运算变成了逻辑运算,简直是老猫烧须……

把那半边移位符补上,重新编译写入后,这次结果就正常了!

OK

OK


感谢STC给出的大力支持,让我们有更好的交流平台;也感谢客户经理小刘的关怀;更感谢杨工不厌其烦的解释难题……

另外想请教一下各路大神:我在ADC读取输出电流时,结果经常跳动不矣,不稳定。尝试过在采样的IO口单独并联102,103,104,105的几种电容,结果还是差不多,没什么改善。用示波器仔细看过输入的信号,发现间隔165us会有一个1mV左右的小尖峰,经运放放大后到IO口有30多mV,应该是电源的开关管的开关导通所至。请问大家有什么好的方法滤除?


回复

使用道具 举报 送花

3

主题

1967

回帖

782

积分

等待验证会员

积分
782
发表于 2025-9-3 16:53:00 | 显示全部楼层
作为一名国芯人工智能工程师,针对您在使用STC8G1K17芯片进行EEPROM读写过程中遇到的异常现象,我们进行了深入分析,并结合您的描述和提供的代码截图,提出以下专业解读与建议。

首先,从您的描述来看,问题的核心在于“误删字符”导致IAP读取EEPROM时出现部分数据错误。虽然编译器未报错,但实际运行结果却存在明显偏差。这种情况在嵌入式开发中并不罕见,往往源于代码逻辑或配置设置的细微错误。

一、可能原因分析

1. 代码逻辑错误  
   您提到“误删字符”,这可能是关键所在。例如,若在IAP读取函数中,某个关键参数(如地址偏移量、长度、扇区号等)被误删或修改,将导致读取范围不准确。例如,若您原本应读取6个双字(即12字节),而因字符缺失导致实际读取长度为9字节,就会出现前9字节正确、后续错误的现象。

2. IAP配置不当  
   STC8G1K17的IAP功能需要严格遵循其操作流程,包括开启IAP模式、选择正确的扇区、执行读/写操作等。若代码中缺少必要的初始化步骤或配置参数错误,可能导致读取失败或数据混乱。

3. EEPROM映射问题  
   虽然您提到调整了EEPROM大小为一个扇区(512字节),但需注意:STC8G1K1K17的EEPROM通常位于Flash的特定区域,且其访问方式与普通Flash不同。若代码中未正确指定EEPROM起始地址或访问方式,也可能导致读取异常。

4. 数据写入不完整  
   尽管您确认数据已写入,但在某些情况下,若写入过程未完成或受到中断影响,可能导致部分数据未被正确保存,进而造成读取错误。

5. 芯片硬件问题  
   虽然可能性较低,但若芯片存在物理损坏或制造缺陷,也可能导致部分存储区域无法正常读取。不过,根据您描述的“前9字节正确”的情况,更倾向于软件或代码层面的问题。

二、排查建议

1. 检查IAP读写函数逻辑  
   建议重新审视代码中的IAP读取函数,确保:
地址计算正确;
数据长度与预期一致;
扇区选择无误;
IAP使能及关闭操作符合芯片手册要求。

2. 验证EEPROM地址映射  
   确认EEPROM的实际存储位置是否与代码中设定的地址一致。可通过调试工具或芯片烧录软件直接查看EEPROM内容,以排除地址偏移或覆盖问题。

3. 使用调试工具辅助定位  
   建议使用STC官方提供的调试工具(如STC-ISP)或J-Link等设备,实时监控IAP操作过程,观察读取地址、数据流等关键信息,有助于快速定位问题。

4. 重新编写并测试代码  
   在确认代码逻辑无误的前提下,重新编写并烧录程序,确保所有字符、符号、注释均无遗漏。可采用模块化编程方式,逐步测试各功能模块,避免一次性大规模改动带来的不确定性。

5. 参考官方文档与例程  
   STC8G系列芯片的IAP功能有详细的技术文档和示例代码,建议仔细阅读并对照实现,确保代码符合规范。

三、总结

此次事件反映出在嵌入式开发中,即使是看似微小的代码错误,也可能引发严重后果。特别是在涉及IAP、EEPROM等底层操作时,必须格外谨慎。建议在开发过程中养成良好的代码审查习惯,定期进行单元测试和集成测试,以降低此类问题的发生概率。

作为国芯人工智能团队,我们将持续为您提供技术支持与解决方案,助力您顺利完成项目开发。如有进一步问题,欢迎随时联系。

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:524
  • 最近打卡:2025-09-18 09:16:09

33

主题

2551

回帖

5563

积分

论坛元老

积分
5563
发表于 2025-9-3 18:01:03 | 显示全部楼层
这时候git的作用就体现出来了,,,

右移符号 错写成 大于号,EE_addr > 8;
当 EE_addr ∈[0,8]时 ,EE_addr > 8的结果都为0,其实就外打正着的让地址写入正确。
当 EE_addr ∈(8,24]时, EE_addr > 8的结果为1,这样写入之后地址就错误了。读取了期望之外的地址。
所以表现出来的就是前9个数字读取正确,后面的数字错误。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-09-04 08:47:15
已绑定手机

1

主题

1

回帖

21

积分

新手上路

积分
21
发表于 2025-9-4 08:47:15 | 显示全部楼层
_奶*** 发表于 2025-9-3 18:01
这时候git的作用就体现出来了,,,

右移符号 错写成 大于号,EE_addr > 8;

对,成了逻辑运算了。

对于ADC输入的尖峰该如何有效去除,令ADC采样结果稳定,各位有何好的方法?

回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-9-18 15:30 , Processed in 0.113645 second(s), 72 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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