你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
any012 提问时间:2019-12-25 10:46 /
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标志位是被置位的,应该不是晶振的问题。


最佳答案

查看完整内容

要先读时间再读日期,不要先读日期
收藏 评论10 发布时间:2019-12-25 10:46

举报

10个回答
T涛哥T 回答时间: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 ...

要先读时间再读日期,不要先读日期
mylovemcu 回答时间:2019-12-25 11:33:43
这种写法是不是有点问题

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

现在这种while一直循环读取  rtc都不正常了吧  HAL_RTC_GetTime这个函数里是什么写法  
循环一直读  串口一直发这种写法肯定有问题  
STMWoodData 回答时间:2019-12-25 11:52:07
提示: 作者被禁止或删除 内容自动屏蔽
any012 回答时间:2019-12-25 12:18:34
试过延时了,前后各加了0.5秒的延时,现象依旧。
RTC秒中断函数没用过...
我搜的几个例程都是直接用HAL_RTC_GetTime( )这个函数,里面其实就是把TR数据读出来放到时间数据结构体里。
mylovemcu 回答时间:2019-12-25 13:50:50
any012 发表于 2019-12-25 12:18
试过延时了,前后各加了0.5秒的延时,现象依旧。
RTC秒中断函数没用过...
我搜的几个例程都是直接用HAL_RTC ...

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

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

你在看看程序吧  是不是有什么函数没有配置的  
any012 回答时间:2019-12-25 14:15:30
没用过秒中断,看了官方例程,也是调用HAL_RTC_GetTime( )这个函数。
不开秒中断,rtc寄存器数也是走的啊,直接读寄存器里的数就是rtc时间,我是这么理解的。
any012 回答时间: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. }
复制代码



any012 回答时间: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.     }
复制代码
any012 回答时间: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.

意思是好像读了才更新?
butterflyspring 回答时间:2020-1-2 16:03:00
看意思是保证一致性。一般参考例程的顺序用,好多细节就避过去了

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版