8h EEPROM 断电保存数据 放到低压中断中程序无法正常运行,但放到main 函数中是正
void Lvd_Isr() interrupt 6{
PCON &= ~LVDF;
TmData=1;
}
void main()
{
GPIO_INIT();
TmData=0;
init1_init();
init2_init();
Timer0_Init();
EA = 1;
PCON &= ~LVDF; //测试端口
//RSTCFG = ENLVR | LVD3V0; //使能3.0V时低压复位,不产生LVD中断
RSTCFG = LVD3V0; //使能3.0V时低压中断
ELVD = 1; //使能LVD中断
IapErase(0x0400);
IapProgram(0x0400, 123);
TmData = IapRead(0x0400);
while(1)
{
display();
}
}
将IapProgram(0x0400, 123);这个写函数放到低压中断函数(void Lvd_Isr() interrupt 6)中程序无法运行 ,但通过调试,低压中断函数是有运行的, 这eeprom读写函数都是官方的范例函数, 菜鸟一枚,请大神指导一下
针对您描述的STC8H系列芯片EEPROM操作异常问题,结合代码片段及现象描述,现给出以下专业分析及解决方案:
一、问题现象定位
核心矛盾点:IapProgram函数在低压中断服务程序(LVDISR)中无法正常执行,但在主函数中可正常运行。
调试线索:通过调试确认LVD中断可触发,但程序运行异常。需重点关注中断上下文环境对IAP操作的影响。
二、关键原因分析
1. 电压跌落时序问题
LVD中断触发时,系统电压已接近临界阈值(如3.0V)。
EEPROM写入要求:STC8H系列对Flash(EEPROM)编程时需稳定电压(典型要求≥2.4V)。若中断触发后电压持续下降,可能导致写入失败甚至Flash控制器锁死。
2. 中断上下文限制
中断服务程序限制:在中断中直接执行复杂操作(如EEPROM擦写)可能引发以下问题:
时序冲突:IAP操作需严格时序控制,中断嵌套或优先级抢占会导致时序错乱。
中断标志未清除:部分IAP函数依赖全局中断状态,在ISR中操作可能触发未定义行为。
堆栈溢出风险:IAP操作涉及较多局部变量,中断上下文堆栈深度不足易引发崩溃。
3. LVD复位机制干扰
RSTCFG寄存器配置:当前代码选择LVD3V0模式(仅触发中断,不产生复位)。但若电压跌落速度过快,中断服务程序未执行完毕即触发BOD(欠压检测),可能导致非正常复位。
4. Flash操作冲突
代码区与EEPROM区冲突:若程序代码位于0x0000-0x3FFF区间,对0x0400地址擦写可能引发总线冲突(需确认芯片具体存储映射)。
三、解决方案与优化建议
1. 重构数据保存逻辑
原则:在LVD中断中仅标记数据需保存,实际擦写操作移至主循环。
c
volatile bit bLvdFlag = 0;// 全局低压标志
void LvdIsr() interrupt 6 {
PCON &= ~LVDF; // 清除中断标志
bLvdFlag = 1; // 仅设置标志,不进行耗时操作
}
void main() {
// ...初始化代码...
while(1) {
if(bLvdFlag) {
EA = 0; // 关闭全局中断
IapErase(0x0400);
IapProgram(0x0400, 123);
EA = 1; // 恢复中断
bLvdFlag = 0; // 清除标志
}
display();
}
}
优势:
确保IAP操作在稳定主循环中执行。
避免中断上下文资源竞争。
2. 增强电压维持能力
硬件层面:在VCC引脚并联大容量储能电容(如100μF钽电容),延长电压跌落时间。
软件层面:进入LVD中断后立即关闭非必要外设(如ADC、PWM),降低系统功耗。
3. 优化IAP操作时序
时钟稳定性检查:确认系统时钟源(如使用内部IRC)在低压下是否稳定,必要时切换至更低频率。
增加重试机制:
c
#define MAXRETRY 3
uint8t retry = 0;
while(bLvdFlag && retry++ < MAXRETRY) {
IapErase(0x0400);
if(IapProgram(0x0400, 123) == SUCCESS) {
break;
}
Delayms(10);// 增加操作间隔
}
4. 存储地址验证
使用STC-ISP工具确认0x0400地址是否位于用户可用EEPROM区域(不同型号地址范围不同)。
检查连接器脚本,确保程序未占用该地址。
5. 启用看门狗防护
c
WDTCONTR = 0x34;// 开启看门狗,2.3s溢出
while(1) {
WDTCONTR |= 0x10;// 喂狗
// ...主循环代码...
}
作用:防止IAP操作异常导致系统死锁。
四、深度技术验证建议
1. 电压跌落模拟测试
使用可调电源逐步降低VCC,配合示波器监测:
LVD中断触发时的实际电压
系统复位前的维持时间
IAP操作期间电压波动情况
2. IAP状态寄存器监控
c
if(ISPCONTR & 0x08) {// 检测CMDFAIL标志
ISPTRIG = 0x00; // 清除异常状态
ISPCMD = 0x00;
}
3. 中断嵌套测试
在LVDISR中插入模拟负载,验证是否因中断响应延迟导致异常:
```c
void LvdIsr() interrupt 6 {
PCON &= ~LVDF;
for(uint16t i=0; i
[本文内容由国芯人工智能辅助生成,仅供参考] 进入低压中断中已经电压过低了,电压下降到2V之前必须执行完EEPROM操作,时间可能不够
掉电保存数据要使用比较器,判断LDO或DC-DC之前的电压,提前一段时间
页:
[1]