您尚未登录。

楼主 #1 2019-12-25 16:39:49

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,204
积分: 1140.5

读取stm32g431内部rtc数据,rtc使用的外部晶振,读出来的数不变,调试状态下倒是变,但不是一秒一秒的加。

为了验证问题,新建了个工程,只保留串口和rtc以及一些io。
初始化RTC后,主循环里只保留两句,读取rtc时间,然后将读出来的秒通过串口发出去。
结果问题还是那样,下载后,串口收到的数据不变。如果进入调试状态,倒是可以看到数据变化,但是有时候会几秒内数据都不变,然后一下子跳到几秒后的数据。
用的外部32768晶振,用示波器测量晶振管脚,测不到波形,即使用X10档也不行。搜了一圈,在amobbs上看到有个帖子里回复说32768晶振用示波器测不出来。而且,调试状态下,看RTC相关寄存器BDCR里的HSERDY标志位,是被硬件置位的。

void MX_RTC_Init(void)
{

    /** Initialize RTC Only 
  */
    hrtc.Instance = RTC;
    hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
    hrtc.Init.AsynchPrediv = 127;
    hrtc.Init.SynchPrediv = 255;
    hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
    hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
    hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
    hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
    hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
    if (HAL_RTC_Init(&hrtc) != HAL_OK)
    {
        Error_Handler();
    }
}
    MX_GPIO_Init();
    MX_USART1_UART_Init();
    MX_RTC_Init();
    /* USER CODE BEGIN 2 */
    printf("main while start loop.\r\n");

    /* USER CODE END 2 */

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1)
    {
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */
        HAL_RTC_GetTime(&hrtc, &rtcTime, RTC_FORMAT_BIN);
        printf("seconds of time is: %d\r\n", rtcTime.Seconds);
    }

离线

#2 2019-12-25 17:21:51

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,234
积分: 9197

Re: 读取stm32g431内部rtc数据,rtc使用的外部晶振,读出来的数不变,调试状态下倒是变,但不是一秒一秒的加。

某网友回复: delay个500ms再去读一下试试,然后递减到us看看还正常吗?





离线

楼主 #3 2019-12-25 17:24:45

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,204
积分: 1140.5

Re: 读取stm32g431内部rtc数据,rtc使用的外部晶振,读出来的数不变,调试状态下倒是变,但不是一秒一秒的加。

试过,没效果。
试过0.5秒,5秒,都一样...

    while (1)
    {
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */
        HAL_Delay(100);
        HAL_RTC_GetTime(&hrtc, &rtcTime, RTC_FORMAT_BIN);
        HAL_Delay(100);
        printf("seconds of time is: %d\r\n", rtcTime.Seconds);
    }

最近编辑记录 Gentlepig (2019-12-25 17:26:13)

离线

#4 2019-12-25 17:28:16

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,234
积分: 9197

Re: 读取stm32g431内部rtc数据,rtc使用的外部晶振,读出来的数不变,调试状态下倒是变,但不是一秒一秒的加。

某网友回复: 总感觉这么读秒有问题,那就加大delay,1000ms





离线

#5 2019-12-25 17:28:45

k455619
会员
注册时间: 2018-07-29
已发帖子: 151
积分: 80

Re: 读取stm32g431内部rtc数据,rtc使用的外部晶振,读出来的数不变,调试状态下倒是变,但不是一秒一秒的加。

离线

楼主 #6 2019-12-25 17:37:08

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,204
积分: 1140.5

Re: 读取stm32g431内部rtc数据,rtc使用的外部晶振,读出来的数不变,调试状态下倒是变,但不是一秒一秒的加。

k455619 说:

谢谢。下载看了下,这个是自带例程里关于RTC报警的。那么我试试stm32g431的rtc例程吧。

离线

楼主 #7 2019-12-25 17:38:30

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,204
积分: 1140.5

Re: 读取stm32g431内部rtc数据,rtc使用的外部晶振,读出来的数不变,调试状态下倒是变,但不是一秒一秒的加。

晕哥 说:

某网友回复: 总感觉这么读秒有问题,那就加大delay,1000ms

5000ms都试过。
我试试官方例程吧。也许是我的用法不对。不过我的是硬石的HAL库例程,就是这么用的。

离线

楼主 #8 2019-12-26 11:36:46

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,204
积分: 1140.5

Re: 读取stm32g431内部rtc数据,rtc使用的外部晶振,读出来的数不变,调试状态下倒是变,但不是一秒一秒的加。

之前是只读时间,现在改成读日期+读时间,可以了。
也不知道原因...

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

搜到了,函数说明:
  * @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.

意思好像是读了才更新?

最近编辑记录 Gentlepig (2019-12-26 12:06:51)

离线

#9 2019-12-26 18:13:22

小智
会员
注册时间: 2019-10-16
已发帖子: 109
积分: 86

Re: 读取stm32g431内部rtc数据,rtc使用的外部晶振,读出来的数不变,调试状态下倒是变,但不是一秒一秒的加。

这么设计时是合理的,这里的寄存器是 calendar shadow registers,就是日历的影子寄存器,也就是说日历寄存器的映射,举个例子:你在1月1日的23:59:59读取时间,如果不给你锁存住,你读取时间是23:59:59,这时候秒中断过了,时间变成了1月2日 0:0:0,你读取年月日,读取的时间就是1月2日的23:59:59,造成错误,注意:再三说明:这是 calendar shadow registers,不是真正的日历寄存器,我猜测,你在你读取秒寄存器的那一刻,真正的日历寄存器锁存输出到影子寄存器,在你读取完年月日,那一刻在解开锁存,这是影子寄存器的用法,不是真的寄存器

最近编辑记录 小智 (2019-12-26 18:18:17)

离线

楼主 #10 2019-12-27 08:50:32

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,204
积分: 1140.5

Re: 读取stm32g431内部rtc数据,rtc使用的外部晶振,读出来的数不变,调试状态下倒是变,但不是一秒一秒的加。

谢谢,受教了。
那应该是读时间,锁定了影子寄存器,之前一直没有读日期,所以就一直没有解锁,影子数据寄存器数不变。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn