求助!急 数据丢失!STC8H8K64U同型号两个封装不一样
STC8H8K64U的LQFP64封装程序正常,换到TSSOP20封装上,EEPROM两个数据,有一个丢失。变成0x01或者其他数,非0xff也非0x00
同一个程序。
求类似情况谁有碰到?或者排查办法?我已经头疼了几天了
规格可能有差异
得看MCU具体的型号
有可能差别在外围和内存上 EEPROM的使用 请 配合比较器做掉电检测 | 唯一正解,电力系统标准应用
https://www.stcaimcu.com/thread-1280-1-1.html
(出处: 国芯人工智能技术交流网站)
封装不同了,肯定还是有点却别的,再仔细检查下吧 没有看到代码,所以我瞎说几句:
或许你的代码本就有BUG,有问题的才是正常的,没问题的是巧合、没有暴露出来而已。
调试方法:去掉不相关的代码,只保留相关代码,专门测试EEPROM。
如果很容易复现这个问题,那不如把工程传上来,让大家都试试。 lcwswust 发表于 2026-3-30 15:55
没有看到代码,所以我瞎说几句:
或许你的代码本就有BUG,有问题的才是正常的,没问题的是巧合、没有暴露出 ...
工程代码模块有点多,这里不能打包上传吧?
我删除些无关的,精简了再复制黏贴上来 不是每次拔插电源都会变,一般第二次拔插才变数据。然后再次拔插基本不变, jully 发表于 2026-3-30 16:14
不是每次拔插电源都会变,一般第二次拔插才变数据。然后再次拔插基本不变, ...
是不是配置了 EEPROM区的大小? 估计程序覆盖了 删除大部分模块后,EEPROM正常了,再把ADC模块加回工程,又出现多次断电后,保存的数据中,有一个丢失了;
ADC只是加入工程并初始化。怀疑可能ADC中断,干扰到EEPROM读写时序。
ADC初始化代码如下:
void ADC_Init()
{
ADCTIM = 0x34; //ADCTIM = CSSETUP |CSHOLD1:0 | SMPDUTY4:0;0x3f;
ADCCFG = 0x02; //ADCspeed;Fsys/2/ADCCFG
ADCEXCFG = 0x04; //0x04:ADC采样2次取平均值.0x05:ADC采样4次取平均值.0x06:ADC采样8次取平均值..0x07:ADC采样16次取平均值,
ADC_CONTR = ADC_POWER| ADC_START ;
Delay(1);
}
EEPROM读写程序如下:
//========================================================================
// 函数: void IapRead()
// 描述: EEPROM读取单字节
// 参数: addr: 读取地址
// 返回值:读取内容
unsigned char IapRead(int addr)
{
unsigned char dat;
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; //设置等待参数12MHz
IAP_CMD = 1; //设置IAP读命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_();
dat = IAP_DATA; //读IAP数据
IapIdle(); //关闭IAP功能
return dat;
}
//========================================================================
// 函数: void IapProgram()
// 描述: EEPROM写入单字节
// 参数: addr: 写入地址
// 参数: dat: 写入内容
void IapProgram(int addr, unsigned char dat)
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; //设置等待参数12MHz
IAP_CMD = 2; //设置IAP写命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_DATA = dat; //写IAP数据
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_();
IapIdle(); //关闭IAP功能
}
页:
[1]
2