[技术问答] HC32L190 SysTick能在低功耗下运行吗?

[复制链接]
 楼主| lee8871 发表于 2024-12-5 11:59 | 显示全部楼层 |阅读模式
HC32L190 SysTick可以使用外部低速晶振作为时钟源,那么这个定时器可以在低功耗休眠时期继续工作,并可唤醒MCU吗?
992146751236c61a7a.png
这个是ARM定义的系统定时器,可以看到这个定时器可以使用XTL
25341675123aeec139.png
XTL是外部低速时钟。
33791675123d4e9c7e.png

可以看到,手册中,关于深度休眠下仍然能工作的外设,没有对SYSCLK的介绍。
6763567512482218f0.png
那么是不是说,这个定时器可以在低功耗休眠时期继续工作,并可唤醒MCU?
 楼主| lee8871 发表于 2024-12-12 13:19 | 显示全部楼层
本帖最后由 lee8871 于 2024-12-12 14:48 编辑
Sam131208 发表于 2024-12-12 09:19
HC32L系列估计不适合你这个要求,低功耗定时器在深度睡眠模式下,设定触发有延迟,这个延迟是不确定的 ...

根据你的提醒,我针对休眠时间误差做了实验。没有发现你说的这个延迟是不确定的(延迟3个lxtl时钟以上),无法精确到1个LXTL时钟。根据实验现象,使用Lptimer唤醒,定时时间长度确定性正常,误差范围合理。
具体的程序如下:
17956675a6d71de26e.png
由此我可以用逻辑分析仪采集输出信号。
33629675a6d953a6e5.png
逻辑分析仪可以输出这些数据到Excel进行分析:
36505675a6dc0add33.png
根据我的分析,定时时间的标准差为8.7uS,从-15uS到正15uS,完美符合32.768KHz晶振的周期(约30uS)。对误差进行统计,误差基本呈线性分布,没有发现集中在特别的值上。
24084675a6f09dd81b.png

对于32.768KHz晶振而言,这个实验结果是非常合理的,这些误差来自不可避免的定时器开始时刻误差,除非提高32.768KHz的频率,否则理论上无法避免。
具体来说,这个误差的产生原因程序启动定时器的时刻,XTL不可能刚好完成一个周期,而是距离下次信号有随机的小于一周期的时间。



 楼主| 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工作正常。
29396675a744738a28.png
这种情况,如果使用SWD进行仿真,还是可以唤醒的;拔掉仿真器正常运行,就不行了。
进一步的,系统定时器采用1秒计时,LPtimer0采用1/8秒循环计时,等待Systick触发,程序这样:
36258675a84ac1634b.png
发现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);
}










wubangmi 发表于 2024-12-5 14:04 | 显示全部楼层
图里没写明,窃以为SysTick应该就不在这个深度睡眠能唤醒的行列
 楼主| lee8871 发表于 2024-12-5 15:17 | 显示全部楼层
wubangmi 发表于 2024-12-5 14:04
图里没写明,窃以为SysTick应该就不在这个深度睡眠能唤醒的行列

QAQ
你们也没用过啊~~~~~
这个还挺重要的,搞不好方案整个都要改
xch 发表于 2024-12-6 10:55 | 显示全部楼层
这个MCU没用过。别家的ref clock 是MCU主频/8,不能深度睡眠唤醒
xch 发表于 2024-12-6 11:02 | 显示全部楼层
lee8871 发表于 2024-12-5 15:17
QAQ
你们也没用过啊~~~~~
这个还挺重要的,搞不好方案整个都要改

你有这MCU 板子?试一下不就知道了?
xiaoyaodz 发表于 2024-12-6 20:51 | 显示全部楼层
HC32L190系列单片机是具备系统定时器的,并且提供了多种类型的定时器以满足不同的应用需求
lzmm 发表于 2024-12-6 21:44 | 显示全部楼层
在这种模式下,所有时钟关闭,但上电复位和IO状态保持,IO中断有效,所有寄存器、RAM和CPU数据保存状态。
backlugin 发表于 2024-12-6 23:25 | 显示全部楼层
HC32L190的SysTick可以在低功耗模式下运行
sesefadou 发表于 2024-12-7 02:28 | 显示全部楼层
SysTick定时器的时钟源可以是系统时钟或低功耗时钟。选择低功耗时钟可以进一步降低功耗。
burgessmaggie 发表于 2024-12-7 05:41 | 显示全部楼层
通常会选择使用低功耗定时器来唤醒芯片,而不是使用SysTick。
tabmone 发表于 2024-12-7 08:45 | 显示全部楼层
在这种模式下,CPU 停止运行,但所有的外设和时钟仍然运行。SysTick 定时器通常会继续运行,因为它依赖于系统时钟。
 楼主| lee8871 发表于 2024-12-7 18:27 | 显示全部楼层
感谢各位。
我这个板子上没有外部晶振XTL,所以一直用的是内部RCL,这个芯片既然明确标记了XTL,就只能是外部晶振,我就一直没有进行测试。
我新做的PCB上有这个晶振,今天刚刚做好。
我这就实验一下,

 楼主| lee8871 发表于 2024-12-7 19:11 | 显示全部楼层
我目前需要做的是低功耗无线通信。需要定时器的目标是:
有一个比较匹配中断能唤醒休眠,能够不间断运行,至少24位。
能够不间断运行:
通信需要多个MCU有 【同步时钟】 ,也就是说MCU里要有一个时钟一直运行,不管MCU进入休眠,还是唤醒,都不能影响这个定时器的运行。两个MCU会无线通信进行时间同步,并长期维持时钟一致。一次溢出后,修改溢出周期,从而实现类似比较匹配的功能是不可接受的。开关定时器发生成漏刻,进而导致时钟同步不准确。
比较匹配唤醒:
在需要通信时,要在特定的时刻唤醒。因为多个MCU互相通信要错开,这个通信可能在前述同步定时器匹配任意值的时候发生。
这一业务要求这个低功耗定时器具有比较匹配功能。
至少24位:
同步误差较大时,多个MCU会产生唤醒后等待其他MCU唤醒的现象这会造成耗电增加。所以这个定时器的精度要尽可能高,要使用32.768KHz作为输入频率,并且溢出周期通常在5~60秒。因此使用16位定时器是不够的。

HC32L190的低功耗定时器似乎无法满足这一要求,这些定时器都没有比较匹配。只能使用两个LPTIMER和一个SysTick,分别用于  同步时钟  和 比较匹配唤醒。




 楼主| lee8871 发表于 2024-12-8 14:17 | 显示全部楼层
wubangmi 发表于 2024-12-5 14:04
图里没写明,窃以为SysTick应该就不在这个深度睡眠能唤醒的行列

你是对的,这个Systick确实不能在低功耗下工作,并唤醒系统。
根据寄存器的说明, 916416755288deb199.png
看来Systick只是采用XTL作为时钟输入,它的工作还是需要依赖PCLK的,在休眠是,PCLK停止,Systick也就停止工作了。


caigang13 发表于 2024-12-9 08:47 来自手机 | 显示全部楼层
大多数低功耗模式下都不支持
uptown 发表于 2024-12-9 09:27 | 显示全部楼层
在低功耗模式下,为了最大限度地减少能耗,系统会关闭或降低许多外设的工作频率,包括那些可能产生中断或持续运行的定时器。
pixhw 发表于 2024-12-9 12:30 | 显示全部楼层
SysTick 可能不会运行,因为它可能依赖于被关闭的时钟。
yang377156216 发表于 2024-12-9 13:29 | 显示全部楼层
lee8871 发表于 2024-12-8 14:17
你是对的,这个Systick确实不能在低功耗下工作,并唤醒系统。
根据寄存器的说明,
看来Systick只是采用XT ...

分析很合理到位
deliahouse887 发表于 2024-12-9 15:31 | 显示全部楼层
最低的功耗模式,几乎所有的时钟和电源都会被关闭,SysTick 定时器在这种模式下不会运行。
pmp 发表于 2024-12-10 13:03 | 显示全部楼层
外设关闭,但主时钟运行。              
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

60

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部