本帖最后由 lee8871 于 2024-12-12 14:45 编辑
我做实验了,Systick确实无法唤醒休眠中的MCU,并且在低功耗休眠时,Systick的时钟不会计数。如此采用定时器计数时,如果设置低功耗休眠则无法工作(通过LED观察)。注释低功耗指令(//SCB->SCR = 4),采用普通休眠模式,则LED工作正常。
这种情况,如果使用SWD进行仿真,还是可以唤醒的;拔掉仿真器正常运行,就不行了。
进一步的,系统定时器采用1秒计时,LPtimer0采用1/8秒循环计时,等待Systick触发,程序这样:
发现Systick仍然无法正确计时,定时器会在休眠时保持休眠之前的状态和计数值,并且在休眠退出后,自动继续计时。
当然,如果上述程序有问题,还请赐教。
void testSystick(uint32 data){
print("测试系统定时器");
blue.on();
if(inited == no){
inited = yes;
xtlInit();
M0P_SYSCTRL->PERI_CLKEN0_f.TICK = 1;//SysTick定时器参考时钟使能。
SysTick->LOAD = 32768;//设置定时器周期为1秒。定时器是自减计数的
}
SysTick->CTRL = 0;
SysTick->VAL = 0;
SysTick->CTRL = 3;//启动定时器,使用xtl时钟源
SCB->SCR = 4;//设置为使用低功耗休眠。实验表明,设置为深度休眠时,SysTick不能唤醒微控制器,程序会卡死在此处。
asm("wfi");//进入休眠
SCB->SCR = 0;
SysTick->CTRL = 0;
print("系统定时器唤醒{4x}", SysTick->VAL);
postTask(test1, 0, eTaskPriority::low);
}
|