凡凡的草稿本 发表于 2023-12-6 14:38:59

使用FreeRTOS,单片机RTC就慢了

项目使用单片机:STM32H743IIT6
实时操作系统:FreeRTOS
问题:RTC越走越慢,每小时差2分钟
尝试操作:
1. 裸板程序:每天大概慢5秒
2. 裸板程序:使用精密校准操作后,5天大概差2秒
3. 加上项目FreeRTOS后,每小时大概差2分钟
求助,是不是我某些地方没有理解对,或者哪些操作会将RTC暂停?

eric2013 发表于 2023-12-6 15:29:45

内置RTC是环境热的时候走的快,环境冷后走的慢。

你加入FreeRTOS,是不是功耗大了很多,可以测测,算是一个问题的方向,可以看看。

RTC是独立的硬件,不受FreeRTOS影响的。

TRX 发表于 2023-12-6 17:21:05

spi 通讯使用DMA进行发送,裸机没有问题,但是加上os后,就会无法收发,但是在os的环境下,使用polling模式又是正常的!

TRX 发表于 2023-12-6 17:22:28

spi + dma我使用的是硬汉的驱动,这种情况大概是哪里会有问题呢

凡凡的草稿本 发表于 2023-12-6 17:51:06

eric2013 发表于 2023-12-6 15:29
内置RTC是环境热的时候走的快,环境冷后走的慢。

你加入FreeRTOS,是不是功耗大了很多,可以测测,算是 ...

现在发现规律每到第12分和29分的时候,分钟的参数不增加,很奇怪,打印的变量是直接从RTC获取上来直接打印的,还是有规律的   不理解,之前为了校准RTC加了这两句代码,在裸板测试很好用,加到项目代码就出现偏差了。代码如下:
        //        //校准rtc,实测每24H,快1s.调用Hal函数
    HAL_RTCEx_SetSmoothCalib(&hrtc, RTC_SMOOTHCALIB_PERIOD_32SEC, RTC_SMOOTHCALIB_PLUSPULSES_SET, 20);
//        //本地RTC跑的更快,所以这里需要调慢
    HAL_RTCEx_SetSynchroShift(&hrtc, RTC_SHIFTADD1S_SET, 500);

凡凡的草稿本 发表于 2023-12-6 17:51:27

eric2013 发表于 2023-12-6 15:29
内置RTC是环境热的时候走的快,环境冷后走的慢。

你加入FreeRTOS,是不是功耗大了很多,可以测测,算是 ...

现在发现规律每到第12分和29分的时候,分钟的参数不增加,很奇怪,打印的变量是直接从RTC获取上来直接打印的,还是有规律的   不理解,之前为了校准RTC加了这两句代码,在裸板测试很好用,加到项目代码就出现偏差了。代码如下:
        //        //校准rtc,实测每24H,快1s.调用Hal函数
    HAL_RTCEx_SetSmoothCalib(&hrtc, RTC_SMOOTHCALIB_PERIOD_32SEC, RTC_SMOOTHCALIB_PLUSPULSES_SET, 20);
//        //本地RTC跑的更快,所以这里需要调慢
    HAL_RTCEx_SetSynchroShift(&hrtc, RTC_SHIFTADD1S_SET, 500);

eric2013 发表于 2023-12-7 08:23:44

TRX 发表于 2023-12-6 17:22
spi + dma我使用的是硬汉的驱动,这种情况大概是哪里会有问题呢

OS工程里面main函数里面先不开启OS,直接测试这个SPI DMA正常不。

正常后,再仅开启1个任务测试下。

eric2013 发表于 2023-12-7 08:26:58

凡凡的草稿本 发表于 2023-12-6 17:51
现在发现规律每到第12分和29分的时候,分钟的参数不增加,很奇怪,打印的变量是直接从RTC获取上来直接打 ...

1、这个问题注意了吧。你应该注意了,要不裸机程序也会不正常。
使用STM32H7的RTC依然要先读时间,再读日期,这个老毛病在F4上就有
https://www.armbbs.cn/forum.php?mod=viewthread&tid=89912

2、先不做校准,这种方式测试正常不。



跟着硬汉学 发表于 2023-12-7 09:33:06

凡凡的草稿本 发表于 2023-12-6 17:51
现在发现规律每到第12分和29分的时候,分钟的参数不增加,很奇怪,打印的变量是直接从RTC获取上来直接打 ...

手册中有说,必须在获取时间后获取一下日期,才能解锁时间值!

TRX 发表于 2024-1-13 14:04:18

eric2013 发表于 2023-12-7 08:23
OS工程里面main函数里面先不开启OS,直接测试这个SPI DMA正常不。

正常后,再仅开启1个任务测试下。


最后尝试下来,发现是LVGL的控件内存给的不够了,将内存翻倍后到128k后,一切功能正常了,但是还是不清楚为什么会引起这样的问题:L

eric2013 发表于 2024-1-14 10:04:05

TRX 发表于 2024-1-13 14:04
最后尝试下来,发现是LVGL的控件内存给的不够了,将内存翻倍后到128k后,一切功能正常了,但是还是不清楚 ...

不排除程序里面有其它潜在bug。

一颗大白菜 发表于 2024-2-20 13:00:52

如果想时间准确,直接外挂一个RTC
页: [1]
查看完整版本: 使用FreeRTOS,单片机RTC就慢了