HC32L190 SysTick能在低功耗下运行吗?
HC32L190 SysTick可以使用外部低速晶振作为时钟源,那么这个定时器可以在低功耗休眠时期继续工作,并可唤醒MCU吗?这个是ARM定义的系统定时器,可以看到这个定时器可以使用XTL
XTL是外部低速时钟。
可以看到,手册中,关于深度休眠下仍然能工作的外设,没有对SYSCLK的介绍。
那么是不是说,这个定时器可以在低功耗休眠时期继续工作,并可唤醒MCU?
本帖最后由 lee8871 于 2024-12-12 14:48 编辑
Sam131208 发表于 2024-12-12 09:19
HC32L系列估计不适合你这个要求,低功耗定时器在深度睡眠模式下,设定触发有延迟,这个延迟是不确定的 ...
根据你的提醒,我针对休眠时间误差做了实验。没有发现你说的“这个延迟是不确定的(延迟3个lxtl时钟以上),无法精确到1个LXTL时钟。”根据实验现象,使用Lptimer唤醒,定时时间长度确定性正常,误差范围合理。
具体的程序如下:
由此我可以用逻辑分析仪采集输出信号。
逻辑分析仪可以输出这些数据到Excel进行分析:
根据我的分析,定时时间的标准差为8.7uS,从-15uS到正15uS,完美符合32.768KHz晶振的周期(约30uS)。对误差进行统计,误差基本呈线性分布,没有发现集中在特别的值上。
对于32.768KHz晶振而言,这个实验结果是非常合理的,这些误差来自不可避免的定时器开始时刻误差,除非提高32.768KHz的频率,否则理论上无法避免。
具体来说,这个误差的产生原因程序启动定时器的时刻,XTL不可能刚好完成一个周期,而是距离下次信号有随机的小于一周期的时间。
本帖最后由 lee8871 于 2024-12-12 14:45 编辑
bartonalfred 发表于 2024-12-11 19:37
MCU进入低功耗休眠模式时,如果SysTick定时器被配置为使用外部低速晶振,它仍然可以继续工作。 ...我做实验了,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);
}
图里没写明,窃以为SysTick应该就不在这个深度睡眠能唤醒的行列 wubangmi 发表于 2024-12-5 14:04
图里没写明,窃以为SysTick应该就不在这个深度睡眠能唤醒的行列
QAQ
你们也没用过啊~~~~~
这个还挺重要的,搞不好方案整个都要改 这个MCU没用过。别家的ref clock 是MCU主频/8,不能深度睡眠唤醒 lee8871 发表于 2024-12-5 15:17
QAQ
你们也没用过啊~~~~~
这个还挺重要的,搞不好方案整个都要改
你有这MCU 板子?试一下不就知道了? HC32L190系列单片机是具备系统定时器的,并且提供了多种类型的定时器以满足不同的应用需求 在这种模式下,所有时钟关闭,但上电复位和IO状态保持,IO中断有效,所有寄存器、RAM和CPU数据保存状态。 HC32L190的SysTick可以在低功耗模式下运行 SysTick定时器的时钟源可以是系统时钟或低功耗时钟。选择低功耗时钟可以进一步降低功耗。 通常会选择使用低功耗定时器来唤醒芯片,而不是使用SysTick。 在这种模式下,CPU 停止运行,但所有的外设和时钟仍然运行。SysTick 定时器通常会继续运行,因为它依赖于系统时钟。 感谢各位。
我这个板子上没有外部晶振XTL,所以一直用的是内部RCL,这个芯片既然明确标记了XTL,就只能是外部晶振,我就一直没有进行测试。
我新做的PCB上有这个晶振,今天刚刚做好。
我这就实验一下,
我目前需要做的是低功耗无线通信。需要定时器的目标是:
有一个比较匹配中断能唤醒休眠,能够不间断运行,至少24位。
能够不间断运行:
通信需要多个MCU有 【同步时钟】 ,也就是说MCU里要有一个时钟一直运行,不管MCU进入休眠,还是唤醒,都不能影响这个定时器的运行。两个MCU会无线通信进行时间同步,并长期维持时钟一致。一次溢出后,修改溢出周期,从而实现类似比较匹配的功能是不可接受的。开关定时器发生成漏刻,进而导致时钟同步不准确。
比较匹配唤醒:
在需要通信时,要在特定的时刻唤醒。因为多个MCU互相通信要错开,这个通信可能在前述同步定时器匹配任意值的时候发生。
这一业务要求这个低功耗定时器具有比较匹配功能。
至少24位:
同步误差较大时,多个MCU会产生唤醒后等待其他MCU唤醒的现象这会造成耗电增加。所以这个定时器的精度要尽可能高,要使用32.768KHz作为输入频率,并且溢出周期通常在5~60秒。因此使用16位定时器是不够的。
HC32L190的低功耗定时器似乎无法满足这一要求,这些定时器都没有比较匹配。只能使用两个LPTIMER和一个SysTick,分别用于同步时钟和 比较匹配唤醒。
wubangmi 发表于 2024-12-5 14:04
图里没写明,窃以为SysTick应该就不在这个深度睡眠能唤醒的行列
你是对的,这个Systick确实不能在低功耗下工作,并唤醒系统。
根据寄存器的说明,
看来Systick只是采用XTL作为时钟输入,它的工作还是需要依赖PCLK的,在休眠是,PCLK停止,Systick也就停止工作了。
大多数低功耗模式下都不支持 在低功耗模式下,为了最大限度地减少能耗,系统会关闭或降低许多外设的工作频率,包括那些可能产生中断或持续运行的定时器。 SysTick 可能不会运行,因为它可能依赖于被关闭的时钟。 lee8871 发表于 2024-12-8 14:17
你是对的,这个Systick确实不能在低功耗下工作,并唤醒系统。
根据寄存器的说明,
看来Systick只是采用XT ...
分析很合理到位 最低的功耗模式,几乎所有的时钟和电源都会被关闭,SysTick 定时器在这种模式下不会运行。 外设关闭,但主时钟运行。