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

低功耗和唤醒

[复制链接]
已绑定手机

11

主题

17

回帖

141

积分

注册会员

积分
141
发表于 2026-5-15 16:58:45 | 显示全部楼层 |阅读模式
我使用的芯片是STC8H4K64TLCD   需要做低功耗和IO口唤醒   我通过按键下降沿中断唤醒,也就是说在进入低功耗之前需要先将该IO口设置为上拉状态,但是手册上说要省电的话
就要将IO设置为高阻输入并关闭数字输入,那这不是和我按键下降沿中断唤醒冲突吗
截图202605151652404824.jpg
回复

使用道具 举报 送花

已绑定手机

8

主题

395

回帖

1047

积分

金牌会员

积分
1047
发表于 2026-5-15 17:28:12 | 显示全部楼层
建议按键接外部中断INTx用作中断唤醒,设置准双向模式。其它功能扩展的设置全部按默认状态。
回复

使用道具 举报 送花

已绑定手机

11

主题

17

回帖

141

积分

注册会员

积分
141
 楼主| 发表于 2026-5-15 17:38:32 | 显示全部楼层
wul*** 发表于 2026-5-15 17:28
建议按键接外部中断INTx用作中断唤醒,设置准双向模式。其它功能扩展的设置全部按默认状态。 ...

关闭数字输入了还能进入中断吗
我现在就是想通过按键能唤醒 然后做低功耗时候不能因为这个按键功耗增大
回复

使用道具 举报 送花

已绑定手机

8

主题

395

回帖

1047

积分

金牌会员

积分
1047
发表于 2026-5-15 20:23:16 | 显示全部楼层
mppq*** 发表于 2026-5-15 17:38
关闭数字输入了还能进入中断吗
我现在就是想通过按键能唤醒 然后做低功耗时候不能因为这个按键功耗增大 ...

IO口配置工具中4个基本配置就可以适合绝大多数应用场景,当然包括外部中断。所谓高级配置多数情况用不到,默认不开启。既然未使能就没有关闭一说,就当不存在,与外部中断何干?低功耗睡眠主要是应用于电池供电的设备。为了节电,单片机休眠时有可能因端口配置因素,受外围电路的影响导致低功耗电流达不到理想值。所以在休眠前关闭这些配置,减少功耗。唤醒后再恢复相关配置。
测试程序
  1. //一键开/关机(掉电唤醒)
  2. //适合STC15/STC8系列,测试平台STC8H3K48S2开发板
  3. #include <STC8H.H>
  4. #include "intrins.h"
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. sbit key  = P3^2;//S14
  8. uchar Temp;
  9. uchar Key_value; //键值
  10. uint  keyTim;    //按键时长
  11. bit   flag1ms;   //1ms中断标志
  12. bit   on_off;    //开关标志
  13. bit   allow;     //允许关机标志
  14. //初始化单片机端口
  15. void McuInit()
  16. {
  17.         P0M0 = 0x00; P0M1 = 0x00;
  18.         P1M0 = 0x00; P1M1 = 0x00;
  19.         P2M0 = 0x00; P2M1 = 0x00;
  20.         P3M0 = 0x00; P3M1 = 0x00;
  21.         P4M0 = 0x00; P4M1 = 0x00;
  22.         P5M0 = 0x00; P5M1 = 0x00;
  23.         P6M0 = 0x00; P6M1 = 0x00;
  24.         P7M0 = 0x00; P7M1 = 0x00;
  25. }
  26. //关闭单片机端口
  27. void McuSleep()
  28. {
  29.         P0M0 = 0x00; P0M1 = 0xff;
  30.         P1M0 = 0x00; P1M1 = 0xff;
  31.         P2M0 = 0x00; P2M1 = 0xff;
  32.         P3M0 = 0x00; P3M1 = 0xf8;
  33.         P4M0 = 0x00; P4M1 = 0xff;
  34.         P5M0 = 0x00; P5M1 = 0xff;
  35.         P6M0 = 0x00; P6M1 = 0xff;
  36.         P7M0 = 0x00; P7M1 = 0xff;
  37. }
  38. void Timer0_Init()                //1毫秒@11.0592MHz
  39. {
  40.         AUXR |= 0x80;                        //定时器时钟1T模式
  41.         TMOD &= 0xF0;                        //设置定时器模式
  42.         TL0 = 0xCD;                                //设置定时初始值
  43.         TH0 = 0xD4;                                //设置定时初始值
  44.         TF0 = 0;                                //清除TF0标志
  45.         TR0 = 1;                                //定时器0开始计时
  46.         ET0 = 1;                                //使能定时器0中断
  47. }
  48. void Delay20ms(void)        //@11.0592MHz
  49. {
  50.         unsigned char data i, j, k;
  51.         i = 2;
  52.         j = 32;
  53.         k = 60;
  54.         do
  55.         {
  56.                 do
  57.                 {
  58.                         while (--k);
  59.                 } while (--j);
  60.         } while (--i);
  61. }
  62. void key_scan()    //按键扫描函数
  63. {
  64.         if(flag1ms)  //1ms时间标志
  65.         {
  66.                 flag1ms = 0;//1ms时间标志清0
  67.                 if(!key && !on_off)
  68.                 {
  69.                         if(++keyTim>1000)keyTim=1001;//防止溢出
  70.                         if(keyTim==20) //大于20ms小于1s算短按
  71.                         {
  72.                                 Key_value=0x01;
  73.                         }
  74.                         if(keyTim==1000) //达到1s算长按
  75.                         {
  76.                                 Key_value|=0x10;
  77.                         }
  78.                 }
  79.                 else
  80.                 {
  81.                         keyTim=0;        //按键松手keyTim清0
  82.                 }
  83.         }
  84. }
  85. void key_service()//按键服务函数
  86. {//短按等松手响应,长按达1s不论是否松手即响应
  87.         if((keyTim==0||keyTim==1000) && Key_value!=0x00)
  88.         {
  89.                 if(Key_value==0x01)//短按任务
  90.                 {
  91.                         Temp++;
  92.                         P4=~Temp;//演示,LED低电平亮
  93.                 }
  94.                 if(Key_value==0x11)//长按关机
  95.                 {
  96.                         allow=1;//允许休眠
  97.                 }
  98.                 Key_value=0x00;//任务完成后键值清0
  99.         }
  100. }
  101. void Shutdown()//掉电模式函数
  102. {
  103.         if(allow)
  104.         {
  105.                 McuSleep();                //关闭单片机端口
  106.                 //关闭所有在用硬件,减小能耗
  107.                 while(!key);//等待按键松手
  108.                 Delay20ms();//消抖防止误动作
  109.                 EX0 = 1;                //开外部中断
  110.                 PCON = 0x02;//MCU进入掉电模式
  111. /************************************************/
  112.                 _nop_();    //掉电模式被唤醒后,首先执行此语句,然后再进入中断服务程序
  113.                 _nop_();    //中断服务程序执行完再接着此句继续执行
  114.                 while(!key);//等待按键松手,防止按键扫描程序误读
  115.                 Delay20ms();//消抖防止误动作
  116.                 //打开所有在用硬件,恢复正常运行
  117.                 allow=0;                //清0
  118.                 on_off=0;        //开关标志清0
  119.                 McuInit();  //初始化单片机端口
  120.                 P4=~Temp;        //恢复LED显示
  121.         }
  122. }
  123. void main()
  124. {
  125.         McuInit();
  126.         IT0 = 1;//设置INT0的中断类型为下降沿唤醒
  127. //        EX0 = 1;//使能INT0中断
  128.         EA  = 1;//开总中断
  129.         Timer0_Init();//定时器初始化函数
  130.         while (1)
  131.         {
  132.                 key_scan();                //按键扫描函数
  133.                 key_service(); //按键服务函数
  134.                 Shutdown();                //掉电模式函数
  135.         }
  136. }
  137. //INT0中断服务程序
  138. void exint0() interrupt 0
  139. {
  140.         EX0 = 0;                //关外部中断
  141.         on_off=1;//开关标志置1
  142. }
  143. //T0中断服务程序
  144. void interruptTimer0() interrupt 1
  145. {
  146.         flag1ms = 1;    //1ms标志
  147. }
复制代码



回复

使用道具 举报 送花

33

主题

3076

回帖

7160

积分

论坛元老

积分
7160
发表于 2026-5-16 09:01:02 | 显示全部楼层
我觉得这5点你应该按照 if - else if 的形式来判断。 而不是 if - if
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-9-19 21:08 , Processed in 0.072338 second(s), 63 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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