芯LYS 发表于 2026-2-26 09:00
感谢您!
乘风飞扬 发表于 2026-2-26 10:19
参考这个帖子:
8H8K64U 使用 USB-CDC 不能进入掉电模式,如何解决?
谢谢啦,我好好学习一下!
在各位大侠指导下,有进展:
乘风***大侠还给了以前网友的贴子,还有例子程序:
我跟着改了一下:
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 的电平,是高电平............
继续查找问题.....................
先把理论搞清楚,复习一下:
跟着普中科技看一下视频课程:
https://www.bilibili.com/video/BV1L66FB4ETP?vd_source=484958d035ff6069a7290316f313d954&spm_id_from=333.788.videopod.episodes&p=78
首先是相关寄存器:
我们先学习省点模式:
PD:主时钟停振/省电模式控制位
0:无影响
1:单片机进入主时钟停振/省电模式,CPU以及全部外设均停止工作。唤醒后硬件自动清零。
注:
省电模式/主时钟停振模式,俗称掉电模式
仅主时钟停止振荡,依赖主时钟工作的CPU/及大部分外设功能模块,无时钟无法继续工作,耗电的这部分功能模块工作被暂停后,MCU 几乎没有功耗。
不依赖主时钟工作的低功耗外设可继续工作,如:
RTC 如选择的是外部 32768RTC 晶振,RTC 会继续正常工作,RTC工作,仅需要1.5uA 的电流。
段码LCD,如需要继续工作,功耗也极低,不含屏的功耗,也仅需1.5uA.
另外一个模式只停CPU:
IDL:IDLE(空闲)模式控制位
0:无影响
1:单片机进入IDLE模式,只有CPU停止工作,其他外设依然在运行。唤醒后硬件自动清零
有提醒哦:
【特别注意】
Ai8051U系列单片机进入主时钟停振/省电模式前,必须根据工作频率正确设置IAP_TPS寄存器
(若工作频率为12MHz,则需要将IAP-TPS设置为12;若工作频率为24MHz,则需要将IAP-TPS设置为24,其他频率以此类推)。
单片机从主时钟停振/省电模式唤醒后,硬件会自动对主时钟恢复起振,当主时钟开始起振后,硬件会自动等待一定的主时钟震荡周期数,这个等待的主时钟震荡周期数由IRCDB寄存器进行设置,直到主时钟最后稳定。主时钟稳定后,在开始运行用户程序前,还需要对内部的FLASH程序存储器进行唤醒,FLASH唤醒的等待时间基准是1us,要产生1us的时间基准,软件必须根据主时钟的工作频率正确设置IAP_TPS寄存器。
强烈建议用户在进行系统初始化时对IAP_TPS进行初始化。
唤醒源:
普中科技本次视频的实验:
可以偷懒直接用AiCube:
P2.0设置为推完输出 使能上啦电阻
P3.2设置为高阻输入,使能上啦电阻,IO中断允许且下降沿使能STOP 唤醒
记得使能CLK时钟,P2 P3管脚
LED是在P2口
按键是在P3口
P3.2高阻输入模式使能上拉电阻I/O口中断选择下降沿 ,使能STOP唤醒
P3.2高阻输入模式使能上拉电阻I/O口中断选择下降沿 ,使能STOP唤醒
P3.2高阻输入模式使能上拉电阻I/O口中断选择下降沿 ,使能STOP唤醒
函数很简洁
i%50 == 0 的意思是500个ms
因为转1圈就是10ms
之前要宏定义:
//<<AICUBE USER GLOBAL DEFINE BEGIN>>
//在此添加用户全局变量定义、用户宏定义以及函数声明
#define LED1P20
//<<AICUBE_USER_GLOBAL_DEFINE_END>>