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;
}
}
关于STC8H系列单片机在掉电模式下偶尔无法唤醒的问题,结合您提供的代码和描述,可能存在以下几个关键原因:
1. 中断配置不完整或未正确使能
在进入掉电模式前,需确保所有用于唤醒的中断源(如INT0、INT1)已正确配置并启用。若中断配置不完整,可能导致系统无法响应外部事件。
2. 掉电模式设置不正确
STC8H系列支持多种低功耗模式,包括空闲模式、停机模式和掉电模式。其中,掉电模式需要配合外部中断或定时器唤醒。若PCON寄存器设置不正确,可能影响唤醒机制。
3. 中断服务函数未正确处理
外部中断触发后,需确保中断服务函数能够正常执行,并在退出低功耗模式后恢复系统状态。若中断服务函数存在错误或未返回,可能导致系统无法继续运行。
4. 电源管理与外设配置冲突
在进入低功耗模式前,应关闭不必要的外设以降低功耗。若某些外设未正确关闭,可能影响系统的稳定性和唤醒能力。
5. 代码逻辑问题
在您的代码中,EnterPowerDown()函数被调用的条件是!KeyLock && !INTState。若该条件判断不准确,可能导致系统在不应进入低功耗模式时误入,从而影响唤醒机制。
建议检查以下几点:
确保所有中断源(INT0、INT1)在进入掉电模式前已正确配置并启用。
检查PCON寄存器的设置是否符合掉电模式的要求。
确保中断服务函数能够正确处理中断事件,并在退出低功耗模式后恢复系统状态。
在进入低功耗模式前,关闭不必要的外设以减少功耗。
仔细检查代码逻辑,确保EnterPowerDown()函数被正确调用。
通过以上调整,可以有效提高系统在掉电模式下的稳定性和唤醒能力。
[本文内容由国芯人工智能辅助生成,仅供参考] P32、P33不是直接接按键到GND,进入省电模式时能确保P10、P11、P12、P13是低电平吗?
问题复现时短接P32或P33到GND试一下
DebugLab 发表于 2025-7-25 14:32
P32、P33不是直接接按键到GND,进入省电模式时能确保P10、P11、P12、P13是低电平吗?
问题复现时短接P32或P ...
已解决,把几个printf打印注释掉了。
说明是串口没正常恢复? ~ 芯芯向荣 ~ 发表于 2025-7-25 15:55
已解决,把几个printf打印注释掉了。
说明是串口没正常恢复?
printf只是输出字符串到缓冲区,还需要等待串口硬件发送完毕才能进入省电模式
这是我的程序,Uart_T_Len在发送完毕后会清零,等待Uart_T_Len为0后再进入省电模式
https://www.stcaimcu.com/thread-16321-1-1.html
盲猜那个AI_USB.H 里面的两个printf没有取消注释, 导致程序卡死
页:
[1]