wuzhengmin 发表于 2026-2-25 21:05:22

学习休眠唤醒遇到的问题: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_();进入休眠?


wuzhengmin 发表于 2026-2-25 21:38:19

仔细查资料,也没有发现

尝试先写个简单的程序,就把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 的休眠唤醒也用了串口打印啊?




wuzhengmin 发表于 2026-2-25 21:44:59

我先把整个项目文件打包上来:


环境是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);       
                }
            }
      }       

wuzhengmin 发表于 2026-2-25 21:54:10

没招了,我先试着把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秒后:还是不能进入休眠



wuzhengmin 发表于 2026-2-25 21:56:21

检测INT0 && INT1

万用表测量P32 P33都是4.2V,满足条件啊

问题到底在哪里,一时间没有头绪,请给我大侠指点一二。。。万分感谢!!!

另外我发现串口不能关,关了数码管的计时就停止了,好像也不正常...........

关了CDC串口,数码管的计时就停止,但是打开CDC串口,数码管的计时又能从停止的地方接着计数


头大大,反应不过来啦!

wuzhengmin 发表于 2026-2-25 22:05:15

其实我最后是进入过一下休眠的,不知道是删除了哪几句,但是进去了休眠,INT0 INT1 又没法唤醒

后来就无法进入休眠了,怎么都不记得是删除了哪几句,好像是printf,

好像还有:

delay_ms(1);    //延时1ms
                DisplayScan(); //TM1638数码管扫描程序
                TM1638_KEYCESH();//按键查看函数

但是我试了几次,都不行了,晕菜啦!

神农鼎 发表于 2026-2-25 22:08:44





芯LYS 发表于 2026-2-26 09:00:29


乘风飞扬 发表于 2026-2-26 10:19:15

参考这个帖子:

8H8K64U 使用 USB-CDC 不能进入掉电模式,如何解决?
https://www.stcaimcu.com/thread-18471-1-1.html
(出处: 国芯人工智能技术交流网站)

wuzhengmin 发表于 2026-2-26 10:36:55

神农鼎 发表于 2026-2-25 22:08


感谢感谢!
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 学习休眠唤醒遇到的问题:1无法开启休眠 2舍弃一下功能后能进入休眠但无法唤醒