学习休眠唤醒遇到的问题:1无法开启休眠 2舍弃一下功能后能进入休眠但无法唤醒
我这几天开始研究休眠唤醒,先在AI8051U试验箱环境用STC的例子,肯定是一切顺利...................就以为很容易移植接着用最新的STC32G144K246,发现在自己的实验程序下(从485接口读温度湿度显示在I2c0.91寸屏幕上)
先用AiCube生成框架(同时开启了USB-CDC功能)用到定时器0中断、串口中断、开启外部中断0,外部中断1,
结果发现:
IT0 = 1; //INT0 下降沿中断
//IT0 = 0; //INT0 上升,下降沿中断
IT1 = 1; //INT1 下降沿中断
//IT1 = 0; //INT1 上升,下降沿中断
IE0= 0; //外中断0标志位
IE1= 0; //外中断1标志位
EX0 = 1; //INT0 Enable
EX1 = 1; //INT1 Enable
// EX2 = 1; //使能 INT2 下降沿中断
// EX3 = 1; //使能 INT3 下降沿中断
// EX4 = 1; //使能 INT4 下降沿中断
printf("MCU Sleep.\r\n");
PD = 1; //Sleep
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TM1638OPEN(); //打开TM1638
printf("MCU wakeup from P%02X.\r\n", ioIndex)
系统没有在这里:
PD = 1; //Sleep
_nop_();
_nop_();进入休眠?
仔细查资料,也没有发现
尝试先写个简单的程序,就把TM1638挂上来,结果搞多几次,把STC32G144K246小板的电源开关搞坏了
就想着先用“一箭双雕”下载把,结果发现程序可以下载烧录,但是数码管+LED完全没反应,好像芯片不起振............手头只有1块STC32G144K246小板
看看程序很简单啊,干脆先点个LED,结果连LED都点不亮?只好把所有杜邦线拆掉,利用小板上的几颗LED看看怎么啦?
就算点小板上的LED还是不行,冷静想一下,就怀疑“一箭双雕”,换个LINK1D,下载还是很顺利,但板子就是没反应,再找个很久以前的STC自动下载器出来,
利用UART1,也很顺利的不停电下载成功,但是就是没反应,,,,那就想着STC32G144K246牺牲啦?
早知道就用追风剑来实验啦!心疼若干秒后,再想想最后的正常工作配置是,USB-CDC+STC32G144K246小实验板,就是坏了个6脚电源开关,调试程序的时候把USB-CDC
搞丢了,虽然我在P32外接了个开关,但还是要断一下电,嫌麻烦才拿“一箭双雕”出来。。。。。。。 那就试一下回到USB-CDC,马上按住外接P32开关,(板子上没有
P32+电源开关,实在是不好用啊),另一个手插拔USB,还好,USB-CDC顺利出现,接着在USB-CDC环境下继续下载我刚搞的TM1638读取按键和数码管及LED显示,结果很
顺利的就起振了,程序可以跑起来,CDC串口助手也看的到打印的字符串............但是按键的键值读不出来,应该是时序不对,芯片速度差距太大(以前这个M1638是在
STC89C52RC下用的),查一下资料,花点时间,读取键值就正常了,剩下的就是休眠唤醒啦,赶快换块追风剑,太不顺手啦!
换块板在,改一下头文件,引脚,顺利把TM1638挂到追风剑上,其他小功能一切正常。但是还是不能休眠:我把STC官方发追风剑的休眠例子下载
到追风剑上(程序和AI8051U 的几乎一样)一切都OK!
但为什么我的就不行?功能上我首先多了USB-CDC 用了串口打印,但AI8051U 的休眠唤醒也用了串口打印啊?
我先把整个项目文件打包上来:
环境是STC追风剑+LM1638数码管+LED+按键
之所以翻LM1638数码管+LED+按键模块出来,主要是STC32G144K246的INT0 INT1休眠唤醒 是在数码管显示5秒后休眠,按P32(INT0)后唤醒,5秒后又休眠...........
对照一下:
if(++SleepDelay >= 20) //20秒后休眠
{
SleepDelay = 0;
ioIndex = 0 ;
if(INT0 && INT1) //两个中断都是高电平时才进入休眠,下降沿唤醒。
{
SleepDelay = 0;
TM1638Off();//关闭TM1638显示,省电
IT0 = 1; //INT0 下降沿中断
//IT0 = 0; //INT0 上升,下降沿中断
IT1 = 1; //INT1 下降沿中断
//IT1 = 0; //INT1 上升,下降沿中断
IE0= 0; //外中断0标志位
IE1= 0; //外中断1标志位
EX0 = 1; //INT0 Enable
EX1 = 1; //INT1 Enable
// EX2 = 1; //使能 INT2 下降沿中断
// EX3 = 1; //使能 INT3 下降沿中断
// EX4 = 1; //使能 INT4 下降沿中断
printf("MCU Sleep.\r\n");
PD = 1; //Sleep
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TM1638OPEN(); //打开TM1638
printf("MCU wakeup from P%02X.\r\n", ioIndex);
}
}
}
没招了,我先试着把printf("MCU Sleep.\r\n");和printf("MCU wakeup from P%02X.\r\n", ioIndex);屏蔽
把休眠时间设为4秒,结果4秒到了,感觉TM1638有关闭的动作,很快又打开了,
把printf("MCU Sleep.\r\n");和printf("MCU wakeup from P%02X.\r\n", ioIndex);恢复:
4秒后:还是不能进入休眠
检测INT0 && INT1
万用表测量P32 P33都是4.2V,满足条件啊
问题到底在哪里,一时间没有头绪,请给我大侠指点一二。。。万分感谢!!!
另外我发现串口不能关,关了数码管的计时就停止了,好像也不正常...........
关了CDC串口,数码管的计时就停止,但是打开CDC串口,数码管的计时又能从停止的地方接着计数
头大大,反应不过来啦!
其实我最后是进入过一下休眠的,不知道是删除了哪几句,但是进去了休眠,INT0 INT1 又没法唤醒
后来就无法进入休眠了,怎么都不记得是删除了哪几句,好像是printf,
好像还有:
delay_ms(1); //延时1ms
DisplayScan(); //TM1638数码管扫描程序
TM1638_KEYCESH();//按键查看函数
但是我试了几次,都不行了,晕菜啦!
参考这个帖子:
8H8K64U 使用 USB-CDC 不能进入掉电模式,如何解决?
https://www.stcaimcu.com/thread-18471-1-1.html
(出处: 国芯人工智能技术交流网站)
神农鼎 发表于 2026-2-25 22:08
感谢感谢!