找回密码
 立即注册
查看: 103|回复: 4

8H1K28省电模式请教

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-07-25 14:12:29
已绑定手机

2

主题

3

回帖

24

积分

新手上路

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


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_();
        }
}

回复

使用道具 举报 送花

3

主题

2105

回帖

1058

积分

等待验证会员

积分
1058
发表于 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. 配置并使能掉电唤醒中断  
   在进入掉电模式前,应确保使能掉电唤醒中断:
  
  1. c
  2.    WKTIE = 1;       // 使能掉电唤醒中断
  3.    EA = 1;          // 全局中断使能
复制代码

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

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

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

四、示例改进代码
  1. c
  2. void main(void)
  3. {
  4.     SystemInit();
  5.     IRCDB = 0x10;
  6.     // 配置掉电唤醒定时器
  7.     WKTCH = 0x80;     // 启用掉电定时器
  8.     WKTCL = 0xC7;     // 100ms唤醒
  9.     // 使能掉电唤醒中断
  10.     WKTIE = 1;
  11.     EA = 1;
  12.     while(1)
  13.     {
  14.         // 主循环可做其他任务,或直接进入低功耗
  15.         PCON |= 0x02;     // 进入掉电模式
  16.         nop(); nop();
  17.         nop(); nop();
  18.         nop(); nop();
  19.         nop(); nop();
  20.     }
  21. }
  22. // 掉电唤醒中断服务程序
  23. void WKTISR(void) interrupt 16
  24. {
  25.     // 清除中断标志
  26.     WKTIF = 0;
  27.     // 重新初始化定时器、IO等
  28.     Timer0Init();
  29.     // 执行按键扫描及LED控制
  30.     KeyScan();
  31.     if (keypressed != 0)
  32.     {
  33.         // 处理按键逻辑
  34.         keypressed = 0;
  35.     }
  36. }
复制代码

五、总结

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

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-07-25 14:12:29
已绑定手机

2

主题

3

回帖

24

积分

新手上路

积分
24
发表于 2025-7-16 16:19:36 | 显示全部楼层
WKTIE及WKTIF是在哪个文件定义的,datasheet以及STC8H.H中并未找到。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-07-25 14:12:29
已绑定手机

2

主题

3

回帖

24

积分

新手上路

积分
24
发表于 2025-7-16 16:30:30 | 显示全部楼层
WKTIE及WKTIF是在哪个文件定义的,datasheet以及STC8H.H中并未找到。
另外,主函数中 while里面直接进入低功耗会不会太频繁了,掉电唤醒中断服务程序去扫描按键,如果有按键按下,消抖时长及LED点亮时长可能没处理完就再次进入低功耗了。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:138
  • 最近打卡:2025-08-01 10:37:02

76

主题

6574

回帖

1万

积分

超级版主

积分
13645
发表于 2025-7-16 17:33:10 | 显示全部楼层
使用外中断唤醒吧,两个外中断用于唤醒和扫描按键,4个普通IO做按键输入。
          P1.0  P1.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中断。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-1 19:51 , Processed in 0.136749 second(s), 67 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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