any012 发表于 2019-12-25 10:46:08

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

stm32g431,用外部32768晶振,读取内部rtc时钟。
主循环里基本都屏蔽掉了,串口接收中断和定时器中断也都关了。只剩
MX_RTC_Init();
while(1)
{
    if(HAL_OK == HAL_RTC_GetTime(&hrtc, &rtcTime, RTC_FORMAT_BIN))
      printf("seconde is:%d\r\n", rtcTime.Seconds);
    else
      printf("read rtc time failed.\r\n");
}
结果串口读上来的数一直不变。但进入调试状态,则可以看到内部rtc寄存器的TR寄存器是变化的,rtcTime这个结构体里的数也是变化的。串口收上来的数也变化,但不是一秒一秒的连续变化,而是有时候持续是某个读数,然后跳过了几秒。

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


ljtzsd 发表于 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这个函数里是什么写法
循环一直读串口一直发这种写法肯定有问题

流水源 发表于 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,都没有用中断。
结果还是一样,非调试状态下,串口收上来的数不变;
调试状态下,串口上来的数变化,但有时候会隔几秒才变。

    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);
    }
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();
    }
}


any012 发表于 2019-12-25 17:00:52

加上延时也不起作用。
    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);
    }

any012 发表于 2019-12-26 11:38:31

    HAL_RTC_GetDate(&hrtc, &rtcDate, RTC_FORMAT_BIN);
    HAL_RTC_GetTime(&hrtc, &rtcTime, RTC_FORMAT_BIN);

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

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

搜到了,函数说明:

* @noteYou 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.

意思是好像读了才更新?
页: [1] 2
查看完整版本: 读取内部rtc通过串口发上来,数不变。调试状态下,读数变.