搜索
查看: 3571|回复: 10

[已解决] 读取内部rtc通过串口发上来,数不变。调试状态下,读数变.

[复制链接]

该用户从未签到

76

主题

759

帖子

17

蝴蝶豆

论坛元老

最后登录
2022-5-20
发表于 2019-12-25 10:46:08 | 显示全部楼层 |阅读模式
9ST金币
stm32g431,用外部32768晶振,读取内部rtc时钟。
主循环里基本都屏蔽掉了,串口接收中断和定时器中断也都关了。只剩
  1. MX_RTC_Init();
  2. while(1)
  3. {
  4.     if(HAL_OK == HAL_RTC_GetTime(&hrtc, &rtcTime, RTC_FORMAT_BIN))
  5.         printf("seconde is:%d\r\n", rtcTime.Seconds);
  6.     else
  7.         printf("read rtc time failed.\r\n");
  8. }
复制代码

结果串口读上来的数一直不变。但进入调试状态,则可以看到内部rtc寄存器的TR寄存器是变化的,rtcTime这个结构体里的数也是变化的。串口收上来的数也变化,但不是一秒一秒的连续变化,而是有时候持续是某个读数,然后跳过了几秒。

也怀疑过晶振的问题,因为用示波器探头测量晶振管脚,观测不到波形。后来网上搜了下,说是32768负载能力较弱,不容易测到。
但既然调试状态下TR寄存器有变化,而且RCC相关寄存器里的LSERDY标志位是被置位的,应该不是晶振的问题。


最佳答案

查看完整内容

要先读时间再读日期,不要先读日期
回复

使用道具 举报

该用户从未签到

1

主题

33

帖子

0

蝴蝶豆

高级会员

最后登录
2021-4-23
发表于 2019-12-25 10:46:09 | 显示全部楼层
any012 发表于 2019-12-26 11:38
HAL_RTC_GetDate(&hrtc, &rtcDate, RTC_FORMAT_BIN);
    HAL_RTC_GetTime(&hrtc, &rtcTime, RTC_FORMA ...

要先读时间再读日期,不要先读日期
回复

使用道具 举报

该用户从未签到

14

主题

736

帖子

256

蝴蝶豆

论坛元老

最后登录
2021-4-20
发表于 2019-12-25 11:33:43 | 显示全部楼层
这种写法是不是有点问题

RTC本身有秒中断函数   进入秒中断函数以后调用串口2发送数据就可以了

现在这种while一直循环读取  rtc都不正常了吧  HAL_RTC_GetTime这个函数里是什么写法  
循环一直读  串口一直发这种写法肯定有问题  
回复

使用道具 举报

该用户从未签到

10

主题

1665

帖子

65

蝴蝶豆

论坛元老

最后登录
2021-5-10
发表于 2019-12-25 11:52:07 | 显示全部楼层
你读得太快,太频繁了。延时一下都好一些。
回复

使用道具 举报

该用户从未签到

76

主题

759

帖子

17

蝴蝶豆

论坛元老

最后登录
2022-5-20
 楼主| 发表于 2019-12-25 12:18:34 | 显示全部楼层
试过延时了,前后各加了0.5秒的延时,现象依旧。
RTC秒中断函数没用过...
我搜的几个例程都是直接用HAL_RTC_GetTime( )这个函数,里面其实就是把TR数据读出来放到时间数据结构体里。
回复

使用道具 举报

该用户从未签到

14

主题

736

帖子

256

蝴蝶豆

论坛元老

最后登录
2021-4-20
发表于 2019-12-25 13:50:50 | 显示全部楼层
any012 发表于 2019-12-25 12:18
试过延时了,前后各加了0.5秒的延时,现象依旧。
RTC秒中断函数没用过...
我搜的几个例程都是直接用HAL_RTC ...

秒中断没用过?  那你这个时间是怎么变化的?

RTC只是定时时钟  产生秒中断以后再中断里进行时间处理    产生的时钟

你在看看程序吧  是不是有什么函数没有配置的  
回复

使用道具 举报

该用户从未签到

76

主题

759

帖子

17

蝴蝶豆

论坛元老

最后登录
2022-5-20
 楼主| 发表于 2019-12-25 14:15:30 | 显示全部楼层
没用过秒中断,看了官方例程,也是调用HAL_RTC_GetTime( )这个函数。
不开秒中断,rtc寄存器数也是走的啊,直接读寄存器里的数就是rtc时间,我是这么理解的。
回复

使用道具 举报

该用户从未签到

76

主题

759

帖子

17

蝴蝶豆

论坛元老

最后登录
2022-5-20
 楼主| 发表于 2019-12-25 16:14:42 | 显示全部楼层
又新建了个工程,只使能串口和rtc,都没有用中断。
结果还是一样,非调试状态下,串口收上来的数不变;
调试状态下,串口上来的数变化,但有时候会隔几秒才变。

  1.     MX_GPIO_Init();
  2.     MX_USART1_UART_Init();
  3.     MX_RTC_Init();
  4.     /* USER CODE BEGIN 2 */
  5.     printf("main while start loop.\r\n");

  6.     /* USER CODE END 2 */

  7.     /* Infinite loop */
  8.     /* USER CODE BEGIN WHILE */
  9.     while (1)
  10.     {
  11.         /* USER CODE END WHILE */

  12.         /* USER CODE BEGIN 3 */
  13.         HAL_RTC_GetTime(&hrtc, &rtcTime, RTC_FORMAT_BIN);
  14.         printf("seconds of time is: %d\r\n", rtcTime.Seconds);
  15.     }
复制代码
  1. void MX_RTC_Init(void)
  2. {

  3.     /** Initialize RTC Only
  4.   */
  5.     hrtc.Instance = RTC;
  6.     hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  7.     hrtc.Init.AsynchPrediv = 127;
  8.     hrtc.Init.SynchPrediv = 255;
  9.     hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  10.     hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
  11.     hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  12.     hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  13.     hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
  14.     if (HAL_RTC_Init(&hrtc) != HAL_OK)
  15.     {
  16.         Error_Handler();
  17.     }
  18. }
复制代码



回复

使用道具 举报

该用户从未签到

76

主题

759

帖子

17

蝴蝶豆

论坛元老

最后登录
2022-5-20
 楼主| 发表于 2019-12-25 17:00:52 | 显示全部楼层
加上延时也不起作用。
  1.     while (1)
  2.     {
  3.         /* USER CODE END WHILE */

  4.         /* USER CODE BEGIN 3 */
  5.         HAL_Delay(100);
  6.         HAL_RTC_GetTime(&hrtc, &rtcTime, RTC_FORMAT_BIN);
  7.         HAL_Delay(100);
  8.         printf("seconds of time is: %d\r\n", rtcTime.Seconds);
  9.     }
复制代码
回复

使用道具 举报

该用户从未签到

76

主题

759

帖子

17

蝴蝶豆

论坛元老

最后登录
2022-5-20
 楼主| 发表于 2019-12-26 11:38:31 | 显示全部楼层
    HAL_RTC_GetDate(&hrtc, &rtcDate, RTC_FORMAT_BIN);
    HAL_RTC_GetTime(&hrtc, &rtcTime, RTC_FORMAT_BIN);

之前只是读时间,所以出错了。改成读日期+读时间,就可以了。但不知道为什么那样不行,为什么这样行?

--------------------------------------------------------------

搜到了,函数说明:

  * @note  You must call HAL_RTC_GetDate() after HAL_RTC_GetTime() to unlock the values in the higher-order calendar shadow registers to ensure consistency between the time and date values.
    Reading RTC current time locks the values in calendar shadow registers until Current date is read to ensure consistency between the time and date values.

意思是好像读了才更新?
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-29 20:34 , Processed in 0.201653 second(s), 38 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表