找回密码
 立即注册
查看: 122|回复: 2

8h EEPROM 断电保存数据 放到低压中断中程序无法正常运行,但放到main 函数中是正

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-05-15 11:28:57
已绑定手机

2

主题

1

回帖

24

积分

新手上路

积分
24
发表于 2025-5-15 11:28:57 | 显示全部楼层 |阅读模式
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读写函数都是官方的范例函数, 菜鸟一枚,请大神指导一下
        

回复

使用道具 举报 送花

3

主题

711

回帖

133

积分

等待验证会员

积分
133
发表于 2025-5-15 11:53:00 | 显示全部楼层
针对您描述的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中断中仅标记数据需保存,实际擦写操作移至主循环。
  
  1. c
  2.    volatile bit bLvdFlag = 0;  // 全局低压标志
  3.    void LvdIsr() interrupt 6 {
  4.        PCON &= ~LVDF;          // 清除中断标志
  5.        bLvdFlag = 1;           // 仅设置标志,不进行耗时操作
  6.    }
  7.    void main() {
  8.        // ...初始化代码...
  9.        while(1) {
  10.            if(bLvdFlag) {
  11.                EA = 0;         // 关闭全局中断
  12.                IapErase(0x0400);
  13.                IapProgram(0x0400, 123);
  14.                EA = 1;         // 恢复中断
  15.                bLvdFlag = 0;   // 清除标志
  16.            }
  17.            display();
  18.        }
  19.    }
复制代码
   优势:
确保IAP操作在稳定主循环中执行。
避免中断上下文资源竞争。

2. 增强电压维持能力
硬件层面:在VCC引脚并联大容量储能电容(如100μF钽电容),延长电压跌落时间。
软件层面:进入LVD中断后立即关闭非必要外设(如ADC、PWM),降低系统功耗。

3. 优化IAP操作时序
时钟稳定性检查:确认系统时钟源(如使用内部IRC)在低压下是否稳定,必要时切换至更低频率。
增加重试机制:
   
  1. c
  2.      #define MAXRETRY 3
  3.      uint8t retry = 0;
  4.      while(bLvdFlag && retry++ < MAXRETRY) {
  5.          IapErase(0x0400);
  6.          if(IapProgram(0x0400, 123) == SUCCESS) {
  7.              break;
  8.          }
  9.          Delayms(10);  // 增加操作间隔
  10.      }
复制代码

4. 存储地址验证
使用STC-ISP工具确认0x0400地址是否位于用户可用EEPROM区域(不同型号地址范围不同)。
检查连接器脚本,确保程序未占用该地址。

5. 启用看门狗防护
  
  1. c
  2.    WDTCONTR = 0x34;  // 开启看门狗,2.3s溢出
  3.    while(1) {
  4.        WDTCONTR |= 0x10;  // 喂狗
  5.        // ...主循环代码...
  6.    }
复制代码
   作用:防止IAP操作异常导致系统死锁。

四、深度技术验证建议
1. 电压跌落模拟测试  
   使用可调电源逐步降低VCC,配合示波器监测:
LVD中断触发时的实际电压
系统复位前的维持时间
IAP操作期间电压波动情况

2. IAP状态寄存器监控
  
  1. c
  2.    if(ISPCONTR & 0x08) {  // 检测CMDFAIL标志
  3.        ISPTRIG = 0x00;    // 清除异常状态
  4.        ISPCMD = 0x00;
  5.    }
复制代码

3. 中断嵌套测试  
   在LVDISR中插入模拟负载,验证是否因中断响应延迟导致异常:
   ```c
   void LvdIsr() interrupt 6 {
       PCON &= ~LVDF;
       for(uint16t i=0; i

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:469
  • 最近打卡:2025-06-17 09:09:48
已绑定手机

79

主题

5131

回帖

9132

积分

超级版主

DebugLab

积分
9132
发表于 2025-5-15 13:14:05 | 显示全部楼层
进入低压中断中已经电压过低了,电压下降到2V之前必须执行完EEPROM操作,时间可能不够
掉电保存数据要使用比较器,判断LDO或DC-DC之前的电压,提前一段时间
DebugLab
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-17 15:09 , Processed in 1.191299 second(s), 56 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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