~ 芯芯向荣 ~ 发表于 2025-7-25 14:12:29

8H 掉电模式偶尔唤不醒 | 已解决

请教一下大家,做了个按键矩阵(2个外部中断+4个普通IO),外部中断是INT0、INT1,但有时候按键按下就再也无法退出低功耗模式了,出现问题的时候,打印信息显示停在了Sleeping!(正常是进入省电模式前,会打印Sleeping!,退出省电模式后会打印wakeup).
以下是部分代码:

void main(void)
{
      System_Init();
      
      while(1)
      {               
                if(Key_Lock && TX_Data_Ready)
                {
                        printf("Sending!\n");
                        Key_Handle(key_value);               
                }      
      delay_ms(2);               
            if(!Key_Lock && !INT_State )
                        Enter_PowerDown();
      }
}



void      System_Init(void)

{   
      EAXSFR();
      IRCDB = 0x10;
      
      GPIO_config( );
      Exti_config( );
      UART_config( );
    Timer0_Init();
      LT8960L_INIT();
      delay_ms(5);
      LT8960L_Sleep();    //低功耗
      
    EA = 1;         //开启总中断
      PCON|=0x02;      //掉电
}

void Enter_PowerDown(void)
{
      Ext_Init();//进入低功耗前初始化外部中断,但并没有解决偶尔无法唤醒的问题
      printf("Sleeping!\n");

      
    PCON |= 0x02;       // 进入掉电模式
    _nop_();_nop_();
      _nop_();_nop_();
      _nop_();_nop_();
      _nop_();
                        
      printf("Wakeup!\n");

}
void Ext_Init(void)
{
      IT0 = 1;                        //INT0(P3.2)下降沿中断
      EX0 = 1;                        //使能INT0中断

      IT1 = 1;                        //INT1(P3.3)下降沿中断
      EX1 = 1;                        //使能INT1中断
}
void INT0_ISR_Handler() interrupt INT0_VECTOR         
{
      if(R1 == 0 && !INT_State)   
      {
          key_down_time = system_time;
          INT_State = 1;
      }
}

void INT1_ISR_Handler() interrupt INT1_VECTOR   
{
      if(R2 == 0 && !INT_State)
      {
          key_down_time = system_time;         
          INT_State = 2;
      }
}





国芯人工智能 发表于 2025-7-25 14:18:00

关于STC8H系列单片机在掉电模式下偶尔无法唤醒的问题,结合您提供的代码和描述,可能存在以下几个关键原因:

1. 中断配置不完整或未正确使能
   在进入掉电模式前,需确保所有用于唤醒的中断源(如INT0、INT1)已正确配置并启用。若中断配置不完整,可能导致系统无法响应外部事件。

2. 掉电模式设置不正确
   STC8H系列支持多种低功耗模式,包括空闲模式、停机模式和掉电模式。其中,掉电模式需要配合外部中断或定时器唤醒。若PCON寄存器设置不正确,可能影响唤醒机制。

3. 中断服务函数未正确处理
   外部中断触发后,需确保中断服务函数能够正常执行,并在退出低功耗模式后恢复系统状态。若中断服务函数存在错误或未返回,可能导致系统无法继续运行。

4. 电源管理与外设配置冲突
   在进入低功耗模式前,应关闭不必要的外设以降低功耗。若某些外设未正确关闭,可能影响系统的稳定性和唤醒能力。

5. 代码逻辑问题
   在您的代码中,EnterPowerDown()函数被调用的条件是!KeyLock && !INTState。若该条件判断不准确,可能导致系统在不应进入低功耗模式时误入,从而影响唤醒机制。

建议检查以下几点:
确保所有中断源(INT0、INT1)在进入掉电模式前已正确配置并启用。
检查PCON寄存器的设置是否符合掉电模式的要求。
确保中断服务函数能够正确处理中断事件,并在退出低功耗模式后恢复系统状态。
在进入低功耗模式前,关闭不必要的外设以减少功耗。
仔细检查代码逻辑,确保EnterPowerDown()函数被正确调用。

通过以上调整,可以有效提高系统在掉电模式下的稳定性和唤醒能力。

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

DebugLab 发表于 2025-7-25 14:32:22

P32、P33不是直接接按键到GND,进入省电模式时能确保P10、P11、P12、P13是低电平吗?
问题复现时短接P32或P33到GND试一下

~ 芯芯向荣 ~ 发表于 2025-7-25 15:55:41

DebugLab 发表于 2025-7-25 14:32
P32、P33不是直接接按键到GND,进入省电模式时能确保P10、P11、P12、P13是低电平吗?
问题复现时短接P32或P ...

已解决,把几个printf打印注释掉了。
说明是串口没正常恢复?

DebugLab 发表于 2025-7-25 16:25:02

~ 芯芯向荣 ~ 发表于 2025-7-25 15:55
已解决,把几个printf打印注释掉了。
说明是串口没正常恢复?
printf只是输出字符串到缓冲区,还需要等待串口硬件发送完毕才能进入省电模式
这是我的程序,Uart_T_Len在发送完毕后会清零,等待Uart_T_Len为0后再进入省电模式
https://www.stcaimcu.com/thread-16321-1-1.html



神农鼎 发表于 2025-7-25 16:46:27











vb2002 发表于 2025-7-27 20:42:28

盲猜那个AI_USB.H 里面的两个printf没有取消注释, 导致程序卡死
页: [1]
查看完整版本: 8H 掉电模式偶尔唤不醒 | 已解决