biqgqprv 发表于 2025-7-16 15:40:51

8H1K28省电模式请教

第一次接触8H1K28(12M主时钟)的低功耗模式,请教一下大家,开启低功耗后,按键功能异常是怎么回事,具体如下:
1、8个按键,4个外部中断,4个普通IO,均是40ms消抖时长,按键按下LED点亮400ms(消抖及LED点亮的计时均是在定时器0中断中处理)。
2、开启低功耗后(掉电唤醒定时器 100ms唤醒一次),按键无响应,LED不亮;
3、如果把低功耗代码全部注释掉,按键均正常。
{:baoquan:}

void main(void)
{
      u8 key_val;
      System_Init();
      IRCDB = 0x10;
      
      WKTCH = 0x80;//启用掉电定时器
      WKTCL = 0xc7; //100m唤醒
      
      while(1)
      {
               
                Key_Scan();   // 普通按键
               
                if(key_pressed != 0)
                {
                        key_val = key_pressed-1;
                        
                        switch(key_val)
                        {
                              case KEY_IDX_FLOW_DOWN:
                                        RF_DATA_TX(0x05);
                                        break;
                              
                              case KEY_IDX_PWR:
                                        RF_DATA_TX(0x07);
                                        break;                              
                        }
                        key_pressed = 0; //键值清零
                }
                PCON |= 0x02;                // 进入掉电模式
                _nop_(); _nop_();
                _nop_(); _nop_();
                _nop_(); _nop_();
                _nop_(); _nop_();
      }
}

国芯人工智能 发表于 2025-7-16 15:43:00

针对您在使用STC8H1K28芯片时遇到的低功耗模式下按键功能异常的问题,以下是对该问题的专业分析与建议:

首先,从代码逻辑来看,您在主循环中调用了KeyScan()函数进行按键扫描,并在检测到按键按下后执行相应的操作。然而,在进入掉电模式前,您直接将PCON寄存器设置为0x02,从而进入掉电模式。此操作存在关键问题:在进入掉电模式之前,程序并未对中断或定时器进行正确配置,导致系统无法正常唤醒或响应外部事件。

一、低功耗模式原理简述

STC8H1K28支持多种低功耗模式,其中掉电模式(Power Down Mode)是一种深度省电状态,此时CPU和大部分外设停止工作,仅保留部分功能模块(如掉电唤醒定时器)。在此模式下,系统必须通过特定的唤醒源(如掉电定时器、外部中断等)重新启动。

在您的代码中,虽然设置了WKTCH和WKTCL寄存器以启用掉电唤醒定时器,但未对相关中断进行使能或配置。这意味着即使定时器触发了唤醒,系统也无法正确响应,导致按键无法被识别。

二、可能存在的问题点

1. 未使能掉电唤醒中断
   在进入掉电模式前,应确保已开启掉电唤醒中断(WKTIE位),否则系统即使被唤醒,也不会触发中断服务程序,从而导致后续操作无法执行。

2. 未正确处理唤醒后的初始化
   系统从掉电模式唤醒后,需要重新初始化相关外设(如定时器、IO端口等),否则可能会因配置丢失而导致功能异常。

3. 按键扫描逻辑未在中断中执行
   您目前的按键扫描是在主循环中完成的,而一旦进入掉电模式,主循环会被暂停。因此,若未在中断中处理按键逻辑,系统将无法响应按键输入。

4. 消抖逻辑未适配低功耗模式
   消抖和LED控制依赖于定时器中断,但在掉电模式下,如果定时器未正确配置或未在唤醒后重新启动,这些功能将失效。

三、改进建议

1. 配置并使能掉电唤醒中断
   在进入掉电模式前,应确保使能掉电唤醒中断:
   c
   WKTIE = 1;       // 使能掉电唤醒中断
   EA = 1;          // 全局中断使能

2. 在中断服务程序中处理唤醒逻辑
   建议将按键扫描和LED控制逻辑移至中断服务程序中,确保在每次唤醒后都能及时响应按键输入。

3. 唤醒后重新初始化外设
   在唤醒后,需重新配置定时器、IO端口等,确保其处于正常工作状态。

4. 优化按键扫描方式
   可考虑采用外部中断+定时器的方式实现按键消抖,避免依赖主循环中的定时器中断。

四、示例改进代码

c
void main(void)
{
    SystemInit();
    IRCDB = 0x10;

    // 配置掉电唤醒定时器
    WKTCH = 0x80;   // 启用掉电定时器
    WKTCL = 0xC7;   // 100ms唤醒

    // 使能掉电唤醒中断
    WKTIE = 1;
    EA = 1;

    while(1)
    {
      // 主循环可做其他任务,或直接进入低功耗
      PCON |= 0x02;   // 进入掉电模式
      nop(); nop();
      nop(); nop();
      nop(); nop();
      nop(); nop();
    }
}

// 掉电唤醒中断服务程序
void WKTISR(void) interrupt 16
{
    // 清除中断标志
    WKTIF = 0;

    // 重新初始化定时器、IO等
    Timer0Init();

    // 执行按键扫描及LED控制
    KeyScan();
    if (keypressed != 0)
    {
      // 处理按键逻辑
      keypressed = 0;
    }
}

五、总结

您当前的低功耗实现缺乏对中断机制和唤醒流程的完整配置,导致系统在唤醒后无法正常响应按键输入。建议按照上述方法完善中断处理逻辑,并确保唤醒后对外设进行必要的重置与初始化。通过合理设计低功耗模式下的唤醒流程,可以有效提升系统的稳定性和响应能力。

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

biqgqprv 发表于 2025-7-16 16:19:36

WKTIE及WKTIF是在哪个文件定义的,datasheet以及STC8H.H中并未找到。

~ 芯芯向荣 ~ 发表于 2025-7-16 16:30:30

WKTIE及WKTIF是在哪个文件定义的,datasheet以及STC8H.H中并未找到。
另外,主函数中 while里面直接进入低功耗会不会太频繁了,掉电唤醒中断服务程序去扫描按键,如果有按键按下,消抖时长及LED点亮时长可能没处理完就再次进入低功耗了。

梁工 发表于 2025-7-16 17:33:10

使用外中断唤醒吧,两个外中断用于唤醒和扫描按键,4个普通IO做按键输入。
          P1.0P1.1   P1.2   P1.3
INT0    K1   K2      K3   K4
INT1    K5   K6      K7   K8.

睡眠处理:
P1.0~P1.0准双向口输出低电平。
INT0、INT1准双向口输出高电平。
清除INT0、INT1中断标志,允许INT0、INT1中断。
PCON |= 0x02;      // 进入掉电模式
5个NOP;
禁止INT0、INT1中断。
页: [1]
查看完整版本: 8H1K28省电模式请教