wuzhengmin 发表于 2026-2-26 10:37:20

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


感谢您!

wuzhengmin 发表于 2026-2-26 10:38:10

乘风飞扬 发表于 2026-2-26 10:19
参考这个帖子:

8H8K64U 使用 USB-CDC 不能进入掉电模式,如何解决?


谢谢啦,我好好学习一下!

wuzhengmin 发表于 2026-2-26 12:46:16



在各位大侠指导下,有进展:
   
乘风***大侠还给了以前网友的贴子,还有例子程序:


我跟着改了一下:


          if(++SleepDelay >= 5)   //5秒后休眠
            {
                SleepDelay = 0;
                                ioIndex = 0 ;
                if(INT0 && INT1)    //两个中断都是高电平时才进入休眠,下降沿唤醒。
                {
                                                SleepDelay = 0;
                                                TM1638Off();//关闭TM1638显示,省电

                                                IE0= 0;       //外中断0标志位
                                                IE1= 0;       //外中断1标志位
                                                EX0 = 1;      //INT0 Enable
                                                EX1 = 1;      //INT1 Enable

                                                IT0 = 1;      //INT0 下降沿中断      
                                                //IT0 = 0;      //INT0 上升,下降沿中断
                                                IT1 = 1;      //INT1 下降沿中断      
                                                //IT1 = 0;      //INT1 上升,下降沿中断

                                                //EX2 = 1;      //使能 INT2 下降沿中断
                                                //EX3 = 1;      //使能 INT3 下降沿中断
                                                //EX4 = 1;      //使能 INT4 下降沿中断

                                                printf_usb("MCU Sleep.\r\n");//printf_usb能在串口助手打印出来

                                                delay_ms(1);    //延时1ms,保证MCU Sleep.能传输的到串口
                                                usb_uninit();

                                                PD = 1;   //Sleep成功进入,但不能唤醒

                                                _nop_();
                                                _nop_();
                                                _nop_();
                                                _nop_();
                                                _nop_();
                                                _nop_();
                                                _nop_();
                                                _nop_();

                                               
                                                P3IE = 0xFF; //恢复数字输入
                                                usb_init();
                                                TM1638OPEN();   //打开TM1638
                                                printf_usb("MCU wakeup from P%02X.\r\n", ioIndex);       
                }
            }

结果如下:1 顺利的进入休眠,同时TM1638Off()也顺利执行,数码管关闭了


但是不能唤醒,检查P32 P33 的电平,是高电平............


继续查找问题.....................

wuzhengmin 发表于 2026-2-26 17:57:11

先把理论搞清楚,复习一下:

跟着普中科技看一下视频课程:

https://www.bilibili.com/video/BV1L66FB4ETP?vd_source=484958d035ff6069a7290316f313d954&spm_id_from=333.788.videopod.episodes&p=78

wuzhengmin 发表于 2026-2-26 18:01:10

首先是相关寄存器:

wuzhengmin 发表于 2026-2-26 18:04:25

我们先学习省点模式:

PD:主时钟停振/省电模式控制位
0:无影响
1:单片机进入主时钟停振/省电模式,CPU以及全部外设均停止工作。唤醒后硬件自动清零。
注:
省电模式/主时钟停振模式,俗称掉电模式
仅主时钟停止振荡,依赖主时钟工作的CPU/及大部分外设功能模块,无时钟无法继续工作,耗电的这部分功能模块工作被暂停后,MCU 几乎没有功耗。
不依赖主时钟工作的低功耗外设可继续工作,如:
RTC 如选择的是外部 32768RTC 晶振,RTC 会继续正常工作,RTC工作,仅需要1.5uA 的电流。
段码LCD,如需要继续工作,功耗也极低,不含屏的功耗,也仅需1.5uA.

另外一个模式只停CPU:

IDL:IDLE(空闲)模式控制位
0:无影响
1:单片机进入IDLE模式,只有CPU停止工作,其他外设依然在运行。唤醒后硬件自动清零

wuzhengmin 发表于 2026-2-26 18:07:28

有提醒哦:

【特别注意】
Ai8051U系列单片机进入主时钟停振/省电模式前,必须根据工作频率正确设置IAP_TPS寄存器
(若工作频率为12MHz,则需要将IAP-TPS设置为12;若工作频率为24MHz,则需要将IAP-TPS设置为24,其他频率以此类推)。
单片机从主时钟停振/省电模式唤醒后,硬件会自动对主时钟恢复起振,当主时钟开始起振后,硬件会自动等待一定的主时钟震荡周期数,这个等待的主时钟震荡周期数由IRCDB寄存器进行设置,直到主时钟最后稳定。主时钟稳定后,在开始运行用户程序前,还需要对内部的FLASH程序存储器进行唤醒,FLASH唤醒的等待时间基准是1us,要产生1us的时间基准,软件必须根据主时钟的工作频率正确设置IAP_TPS寄存器。
强烈建议用户在进行系统初始化时对IAP_TPS进行初始化。

唤醒源:

wuzhengmin 发表于 2026-2-26 18:15:59

普中科技本次视频的实验:

可以偷懒直接用AiCube:

P2.0设置为推完输出 使能上啦电阻

P3.2设置为高阻输入,使能上啦电阻,IO中断允许且下降沿使能STOP 唤醒

wuzhengmin 发表于 2026-2-26 18:22:31

记得使能CLK时钟,P2 P3管脚

LED是在P2口

按键是在P3口

P3.2高阻输入模式使能上拉电阻I/O口中断选择下降沿 ,使能STOP唤醒

P3.2高阻输入模式使能上拉电阻I/O口中断选择下降沿 ,使能STOP唤醒

P3.2高阻输入模式使能上拉电阻I/O口中断选择下降沿 ,使能STOP唤醒

wuzhengmin 发表于 2026-2-26 18:46:13

函数很简洁

i%50 == 0 的意思是500个ms

因为转1圈就是10ms

之前要宏定义:

//<<AICUBE USER GLOBAL DEFINE BEGIN>>
//在此添加用户全局变量定义、用户宏定义以及函数声明
#define LED1P20
//<<AICUBE_USER_GLOBAL_DEFINE_END>>
页: 1 [2] 3 4 5 6 7 8 9 10 11
查看完整版本: 学习休眠唤醒遇到的问题:1无法开启休眠 2舍弃一下功能后能进入休眠但无法唤醒