嵌入式技术论坛
直播中

孙成红

8年用户 1451经验值
私信 关注
[问答]

请教一下用了PM组件以后延时不准的问题?

我的程序只有一个线程,里面的工作很简单,就几句话,就是控制LED灯的翻转,用rt_thread_mdelay(1000)来1000ms翻转一次状态,如果没有开PM组件的情况下,用示波器可以看到是比较准确的1000ms翻转一次,如果开了PM组件,默认进入PM_SLEEP_MODE_DEEP状态,我用外部RTC时钟来109ms唤醒CPU一次,再用示波器观察外部RTC的时钟中断脚,可以看到每到LED线程该恢复工作的那个周期,RTC的中断周期就多加了100ms,见下图。我更改外部RTC的唤醒时钟周期为203ms以后,用示波器看也是同样的情况,每到LED线程该恢复工作的那个周期,RTC的中断周期也同样多加了100ms左右。请问这是什么原因造成的?多谢。。。
1.jpg
2.jpg

回帖(5)

郝埃连

2023-5-11 10:01:37
我把再次使能外置RTC时钟中断的函数放在了idle线程中的rt_system_power_manager()前面,见下图。我感觉时钟周期变长好像是短时间两次进idle线程叠加了周期时间的原因,如果是这样的话,那为什么第一次没有直接进低功耗模式呢?也就是LED线程的那个rt_thread_mdelay后没有进入低功耗模式。
1.jpg
举报

丁冬芹

2023-5-11 10:02:40
这个和低功耗定时器精度相关,你的低功耗定时器是什么样的。唔,你的芯片平台是什么。
如果有可能的话,最好可以有个持续走的计数器进行计数,然后来校正os tick。
举报

孙成红

2023-5-11 10:02:48
多谢老大回复。
不好意思忘了说平台,是STM32F103RE,用的是sunwan大佬的BSP包,说是已经适配好了F1的平台,用的是内部RTC。因为我上面两个示波器的图片是测量的外部RTC的时钟中断的输出,外部RTC的精度还是可以的,大部分周期也是准确的,只是在LED线程延时到时恢复运行的周期,外部RTC的时钟周期就被延长了,所以我就怀疑到底是外部RTC的时钟周期被重复写了,还是时间补偿的有问题。
举报

张宇

2023-5-11 10:02:54
rtc的清中断和设中断不应该在空闲线程中调用,rtc的中断处理中已经做处理了吧!如果需要做处理也应该是在rtc中断处理中做
举报

孙成红

2023-5-11 10:03:03
多谢回复。
我这个idle线程中的清中断和开中断是处理的外部RTC的,因为我是靠外部RTC的时钟中断来唤醒CPU的。我也想过这个放的地方是不是合适,但是我是想让CPU休眠一定的时间就由外部RTC唤醒,所以我就放在idle线程中的rt_system_power_manager()前面了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分