打印
[技术问答]

低功耗定时器正在计数的过程中重新计时

[复制链接]
2131|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Sam131208|  楼主 | 2024-11-20 15:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   如题,低功耗定时器正在计数的过程中,需要重新计时,此时修改:

M0P_LPTIMER0->CR_f.TR = 0;
                for(timeout = 1000; (timeout > 0) && !M0P_LPTIMER0->CR_f.WT_FLAG; timeout--);
                M0P_LPTIMER0->ARR_f.ARR = preload;
                M0P_LPTIMER0->CR_f.TR = 1;
按照HC32L136的资料,preload必须小于0xfffb.  当我计时6个时钟的时候,preload = 0xfffa, 中断正常。但是测量输出波形,发现实际是9个时钟,额外多了3个时钟。  进一步测试: 输出一组方波, 高脉宽20个脉冲,低脉宽8个时钟。测试输出波形,高脉宽为23个时钟, 低脉宽为11个时钟。
  
  请问, 低功耗定时器 从写入ARR到装载成功,内部花费了3个时钟周期?

使用特权

评论回复
沙发
wubangmi| | 2024-11-20 16:04 | 只看该作者
资料上说LPTIM用的是非PCLK时钟时,此时LPTIM是异步时钟。也就是说并不能一个PCLK就能把ARR值写入,而是需要一个LPTIM的异步时钟才能确保写入。假如此时PCLK是4M的话,而异步时钟此时是32.768K,按照理论来说需要10多个PCLK时钟周期才能正确写入,而你实测需要3个CLK就写完了,这也算是比较正常了。

建议LPTIM用PCLK看看,需要几个PCLK时钟周期能正常写入。理论上应该一个CLK就能正常写入了。

使用特权

评论回复
板凳
Sam131208|  楼主 | 2024-11-20 16:33 | 只看该作者
wubangmi 发表于 2024-11-20 16:04
资料上说LPTIM用的是非PCLK时钟时,此时LPTIM是异步时钟。也就是说并不能一个PCLK就能把ARR值写入,而是需 ...

    你好,以上指的均是XTL低频时钟(1000000/32768us). 如果是PCLK时钟的话,就没有必要提出来了。大概也很难测试到定时器有延迟。

使用特权

评论回复
地板
Sam131208|  楼主 | 2024-11-21 09:02 | 只看该作者
本帖最后由 Sam131208 于 2024-11-21 09:04 编辑

    大概可以 确定了, LPTIM 在 WT_FLAG == 1 时写入ARR, 还需要等待3个XTL低频时钟,ARR才起作用。  LPTIM 写入的ARR 不大于 0xfffc时(LPTIM 的中断写入),可以可靠的进入中断。 考虑到非LPTIM 中断写入时的临界问题,ARR 不应该大于0xfffb。
    所以,LPTIM 的定时最小值是 (0xffff-0xfffb + 1)+ 3 = 8 (xtl clock).
    如果以LPTIM 作为软定时器,最小定时时间还要加上额外的附加时间。实测在24MHZ系统时钟下,在最简单的软定时器任务下,11个XTL时钟就是最小的定时了。小于这个,会出现意外的定时时间。

使用特权

评论回复
5
xionghaoyun| | 2024-11-21 11:38 | 只看该作者
学习一下

使用特权

评论回复
6
Sam131208|  楼主 | 2024-11-22 14:13 | 只看该作者
本帖最后由 Sam131208 于 2024-11-22 14:17 编辑

    再次补充一个关于LPTIM 的bug,当启用DeepSleep的时候,完全无法确定,写入ARR后 还需要等待多少个XTL低频时钟,ARR才起作用。
    测试条件:  利用LPTIM 定时输出占空比不是50%的波形,比如正脉宽24个时钟, 负脉宽8个时钟。在Sleep睡眠模式下,可以可靠输出正确波形。 在DeepSleep睡眠模式下,大多数情况下正脉宽变为5个时钟,负脉宽为8个时钟,偶尔正脉宽为24个时钟。
    据此推测,DeepSleep睡眠下,写入的ARR会延迟3个以上XTL时钟。实测3~16个xtl时钟,完全随机的。可能是决定于写入ARR后,是否有被其它事务延迟了进入到DeepSleep状态,越早进入DeepSleep,ARR延迟起作用的时钟需求越多。

使用特权

评论回复
7
cen9ce| | 2024-12-17 22:40 | 只看该作者
根据您提供的信息和代码片段,当您使用低功耗定时器并尝试重新计时时,似乎存在一些问题导致实际计时与实际预期不符。

使用特权

评论回复
8
b5z1giu| | 2024-12-19 07:11 | 只看该作者
关于您提到的定时器从写入ARR到装载成功是否花费了3个时钟周期的问题,这取决于具体的硬件实现和定时器配置。不同的微控制器和定时器可能有不同的加载机制和时间延迟。

使用特权

评论回复
9
ex7s4| | 2024-12-19 08:33 | 只看该作者
正如您猜测的,写入ARR值后到定时器实际开始计数之间可能存在延迟。这可能是导致额外时钟周期的原因。您可以查阅HC32L136的数据手册或参考手册,了解定时器的具体加载时间和行为。

使用特权

评论回复
10
g0d5xs| | 2024-12-19 10:30 | 只看该作者
当定时器达到设定的ARR值时,会触发中断。在中断服务程序中可能存在一些延迟或额外的操作,这可能导致计时的准确性受到影响。确保中断服务程序尽可能简单且快速执行,以减少这种影响。

使用特权

评论回复
11
lix1yr| | 2024-12-19 11:22 | 只看该作者
确保您使用的时钟源是稳定的,并且时钟频率与您的预期相符。任何时钟源的偏差都可能导致计时不准确。

使用特权

评论回复
12
lamanius| | 2024-12-19 12:52 | 只看该作者
您的代码逻辑可能在重新计时过程中存在时序问题。确保在修改定时器的值和状态之前,定时器已经停止计数(通过将TR设置为0),并且在修改完成后立即重新启动(通过将TR设置为1)。

使用特权

评论回复
13
kaif2n9j| | 2024-12-19 14:55 | 只看该作者
仔细检查数据手册中关于定时器的描述和时序要求。

使用特权

评论回复
14
liu96jp| | 2024-12-19 17:16 | 只看该作者
使用示波器或逻辑分析仪来观察定时器的实际行为,以确认是否存在额外的时钟周期或延迟。

使用特权

评论回复
15
q1ngt12| | 2024-12-19 18:36 | 只看该作者
优化中断服务程序,确保它快速且准确地执行。

使用特权

评论回复
16
p0gon9y| | 2024-12-19 20:01 | 只看该作者
考虑使用外部定时器或计数器来验证MCU内部定时器的准确性。

使用特权

评论回复
17
慢动作| | 2025-1-31 11:54 | 只看该作者
输出一组方波, 高脉宽20个脉冲,低脉宽8个时钟。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

128

帖子

1

粉丝