找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4620|回复: 4
收起左侧

STC8G1K16的PD(掉电)模式用外部中断正常唤醒,但IDLE模式却无法唤醒[已解决]

[复制链接]
ID:853816 发表于 2021-6-29 13:28 | 显示全部楼层 |阅读模式
这是我的代码(改自STC8G手册6.5.8 “使用T0/T1/T2/T3/T4 中断唤醒MCU”例程):
  1. #include "STC8.H"
  2. #include "intrins.h"
  3. void INT0_Isr() interrupt 0
  4. {
  5.         _nop_();
  6.         _nop_();
  7. }
  8. void INT1_Isr() interrupt 2
  9. {
  10.         P11 = 0;
  11.         _nop_();
  12.         _nop_();
  13.         //PCON |=  0x01 ;          //MCU 进入 IDL 模式   问题在这里这里这里这里这里这里这里这里这里
  14.         PCON |=  0x02 ;          //MCU 进入 掉电 模式
  15.         _nop_();
  16.         _nop_();
  17. }
  18. void main()
  19. {
  20.         P1M1 &= ~(1<<1);
  21.         P1M0 |= (1<<1); //设置为推挽输出
  22.         IT0 = 1; //使能 INT0 下降沿中断
  23.         EX0 = 1; //使能 INT0 中断
  24.         IT1 = 1; //使能 INT1 下降沿中断
  25.         EX1 = 1; //使能 INT1 中断
  26.         EA = 1;
  27.         P11 = 0;
  28.         //PCON |=  0x01 ;          //MCU 进入 IDL 模式  还有这里这里这里这里这里这里这里这里
  29.         PCON |=  0x02 ;          //MCU 进入 掉电 模式
  30.         _nop_();
  31.         _nop_();
  32.         while (1)
  33.         {
  34.                 P11 = !P11;               
  35.         }
复制代码
我的电路是:
两个按键分别连到P32(按键1)和P33(按键2),示波器连到P11。

当我使用掉电模式(PCON |=  0x02)时:
刚通电,P11输出低。此时是低功耗(掉电)模式。
按下按键1,P11开始输出方波。此时是正常工作模式。
按下按键2,P11输出低。此时是低功耗(掉电)模式。
再按下按键1,P11继续输出方波。
再按下按键2,P11输出低
……
总之使用掉电模式的时候一切看起来都挺正常。


当我使用IDLE模式(PCON |=  0x01)时:
刚通电,P11输出低。此时是低功耗(掉电)模式。正常。
按下按键1,P11开始输出方波。此时是正常工作模式。正常。
按下按键2,P11输出低。此时是低功耗(掉电)模式。正常。
再按下按键1,P11依然输出低。不仅没有输出,电源的电流和刚才低功耗模式下也没有变化。
再按下按键2,没变化
……
除了这两行代码别的什么都没变。总之,换到IDLE模式后,只有上电后第一次能用INT0正常唤醒,第二次就不能。

手册6.4“系统电源管理”说明:
PD:掉电模式控制位
0:无影响
1:单片机进入掉电模式,CPU 以及全部外设均停止工作。唤醒后硬件自动清零。
IDL:IDLE(空闲)模式控制位
0:无影响
1:单片机进入 IDLE 模式,只有 CPU 停止工作,其他外设依然在运行。唤醒后硬件自动清零

网上也查过了,大部分资料说的内容都差不多,摘取一个讲的比较详细的:
空闲模式是指只有单片机不工作的状态。此时CPU无时钟停止工作,但是外部中断、外部低压检测电路、定时器、A/D转换、串行口等仍正常运行。在空闲模式下,RAM、堆栈指针(SP)、程序计数器(PC)、程序状态字(PSW)、累加器(A)等寄存器都保持原有数据。I/O口保持着空闲模式被激活前那一刻的逻辑状态。此时单片机所有的外围设备都能正常运行,当任何一个中断产生时,它们都可以将单片机唤醒,单片机被唤醒后,CPU将继续执行进入空闲模式语句的下一条指令。
怎样退出空闲模式?
a.中断:任何一个中断的产生都会引起IDL/PCON.0被硬件清除,从而退出空闲模式;
b.外部RST引脚复位:将复位脚拉高,产生复位。再将RST脚拉低,结束复位,单片机从用户程序的0000H处开始正常工作

休眠模式(又叫掉电模式、停机模式)
当单片机进入掉电模式时,外部晶振停振、CPU、定时器、串行口全部停止工作,只有外部中断继续工作。使单片机进入休眠模式的指令将成为休眠前单片机执行的最后一条指令,进入休眠模式后,芯片中程序未涉及到的数据存储器和特殊功能寄存器中的数据都将保持原值。可由外部中断低电平触发或由下降沿触发中断或者硬件复位模式换醒单片机,需要注意的是,使用中断唤醒单片机时,程序从原来停止处继续运行,当使用硬件复位唤醒单片机时,程序将从头开始执行。
怎样退出休眠模式?
a.可将CPU从休眠模式唤醒的外部管脚有:外部中断0、外部中断1、定时器0、定时器1、RxD、PWM0/PCA0/P3.7、PWM2/PCA2/P2.0、PWM3/PCA3/P2.4

按这个说法外部中断应该可以在两个模式下都唤醒的啊?为啥会有这样的问题呢?


更新:采用了4楼Y_G_G 坛友 建议的方法,不要在中断函数内进入省电模式,而是在中断函数中操作一个标志位,在主函数中检测这个标志位进入省电模式。问题已解决。

回复

使用道具 举报

ID:123289 发表于 2021-6-29 16:52 | 显示全部楼层
楼主很用功,分析很到位,验证方式也很清晰、简洁。是块好料子。
IDL:仅切断CPU的CLK。
PD:不仅切断CPU的CLK,还切断其它使用系统时钟的内部硬件设备的CLK,如定时器、串口、AD……。
如果,仅仅是以上这一点点程序运行,这时的IDL与PD的功能一样,因为不涉及其它内部硬件。
也就是说,我的看法与您完全一致。帮不上忙了。
建议一下:在IDL语句之后,将NOP增加到24个。再试试是否同样?

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:401564 发表于 2021-6-29 21:17 | 显示全部楼层
对于省电模式,STC并没有多少的说明,但实际上,它的原理应该是和掉电差不多的,不同的是:省电模式只有CPU停止工作,其它外设是正常工作的
个人分析是这样的:因为你在中断中进入了省电模式,CPU马上就停止了工作,但中断还是在工作的,所以,程序实际上是一直停留在中断中的,因为CPU停止工作了,那就没法中断返回了

省电模式和掉电模式是这样工作的:一进入该模式之后,CPU停止工作(掉电模式外设也会停止工作),所有的IO保持进入模式前的状态,电平不变
那么,唤醒之后,程序是马上进入唤醒的中断程序,执行完中断程序之后再返回执行
//PCON |=  0x01 ;        
  PCON |=  0x02 ;
的下一条语句.
所以,我觉得你不应该在中断中进入掉电或者省电模式,要在主程序中进入,一定要中断控制的话,也是中断控制一个标志位,再由主程序检测标志位要不要进入掉电/省电模式

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:853816 发表于 2021-6-30 10:28 | 显示全部楼层
yzwzfyz 发表于 2021-6-29 16:52
楼主很用功,分析很到位,验证方式也很清晰、简洁。是块好料子。
IDL:仅切断CPU的CLK。
PD:不仅切断CPU ...

试了一下,没变化,和之前还是一样。这类多加nop操作的原理是什么呢?是不是多加几个延时确保相应的数值被写到寄存器里面了?
回复

使用道具 举报

ID:853816 发表于 2021-6-30 10:29 | 显示全部楼层
Y_G_G 发表于 2021-6-29 21:17
对于省电模式,STC并没有多少的说明,但实际上,它的原理应该是和掉电差不多的,不同的是:省电模式只有CPU停止 ...

谢谢,采用了您建议的方法,问题解决了。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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