lee8871 发表于 2024-12-12 13:19

本帖最后由 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 13:22

wangdezhi 发表于 2024-12-12 11:21
这需要查阅具体的MCU手册

手册明确说了一些外设不能休眠时运行,不包括Systick,手册明确说了一些外设能休眠时运行,同样不包括Systick,



adolphcocker 发表于 2024-12-12 13:22

查阅 HC32L190 的官方技术手册或参考设计指南

lee8871 发表于 2024-12-12 13:30

本帖最后由 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);
}









lee8871 发表于 2024-12-12 13:32

lee8871 发表于 2024-12-12 13:22
手册明确说了一些外设不能休眠时运行,不包括Systick,手册明确说了一些外设能休眠时运行,同样不包括Sys ...

另外,以外发现,SWD能在休眠时工作,或者说,SWD会阻止深度休眠发生。

bartonalfred 发表于 2024-12-12 13:50

SysTick定时器在深度睡眠模式下的行为,技术文档中并未明确说明其可以在该模式下继续工作并唤醒MCU。

lee8871 发表于 2024-12-12 14:05

bartonalfred 发表于 2024-12-12 13:50
SysTick定时器在深度睡眠模式下的行为,技术文档中并未明确说明其可以在该模式下继续工作并唤醒MCU。 ...

具体在哪?请给我截个图,我实在是太瞎没看到。

ccook11 发表于 2024-12-12 14:18

不能确定 SysTick 在休眠模式下一定可以正常运行.

mickit 发表于 2024-12-12 14:38

在进入低功耗模式前,需要确保SysTick中断使能,以便在定时器到期时唤醒CPU。

modesty3jonah 发表于 2024-12-12 15:07

SysTick定时器作为一个重要的系统定时器,通常用于操作系统的时基和定时任务,但在低功耗模式下,它可能会被关闭以避免不必要的能耗。

jonas222 发表于 2024-12-12 15:30

SysTick定时器是Cortex-M内核的一个标准组件,用于产生系统滴答定时中断。

jkl21 发表于 2024-12-12 15:53

SysTick定时器的配置需要在进入低功耗模式前完成,以确保在唤醒后能够正常工作。

理想阳 发表于 2024-12-12 17:06

系统可能无法运行,因为它可能依赖于已关闭的时钟。

AutoMotor 发表于 2024-12-14 18:15

hc32l190的系统可以在低功耗模式下运行

digit0 发表于 2024-12-15 14:28

外围设备关闭,但主时钟正在运行。,

Sam131208 发表于 2024-12-16 08:39

lee8871 发表于 2024-12-12 13:19
根据你的提醒,我针对休眠时间误差做了实验。没有发现你说的“这个延迟是不确定的(延迟3个lxtl时钟以上) ...

    你的测试是正确的,当你使用lptimer产生固定的定时周期,这不会产生误差,除了第一次周期外。
但是,如果你试图在定时时间到达后,设置不同的触发时间,你才可以观察到这个延迟。
    这个延迟的产生发生在,代码写入寄存器后,MCU不会立即写入到真正的比较器ARR, 在睡眠模式下,固定为3个LXTL, 深度睡眠模式下,则为不固定,会附加数个LXTL周期。

V853 发表于 2024-12-16 18:36

注册进入低功耗模式所需的设置,同时确保这些设置不会影响systetick的运行。

明日视界 发表于 2024-12-18 19:43

不在低功耗模式下工作。,

单芯多芯 发表于 2024-12-19 18:54

所有时钟关闭,system tick自然无法运行,因为system tick的正常运行依赖于系统时钟。

AIsignel 发表于 2024-12-21 11:27

我不确定,系统。它将在睡眠模式下正常工作。
页: 1 2 [3] 4
查看完整版本: HC32L190 SysTick能在低功耗下运行吗?