为了验证问题,新建了个工程,只保留串口和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);
}离线
试过,没效果。
试过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)
离线
给你个例程你参考下:/files/members/1043/RTC_Alarm.zip
离线
k455619 wrote:
给你个例程你参考下:/files/members/1043/RTC_Alarm.zip
谢谢。下载看了下,这个是自带例程里关于RTC报警的。那么我试试stm32g431的rtc例程吧。
离线
晕哥 wrote:
某网友回复: 总感觉这么读秒有问题,那就加大delay,1000ms
5000ms都试过。
我试试官方例程吧。也许是我的用法不对。不过我的是硬石的HAL库例程,就是这么用的。
离线
之前是只读时间,现在改成读日期+读时间,可以了。
也不知道原因...
-------------------------------------------
搜到了,函数说明:
@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)
离线
这么设计时是合理的,这里的寄存器是 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)
离线
谢谢,受教了。
那应该是读时间,锁定了影子寄存器,之前一直没有读日期,所以就一直没有解锁,影子数据寄存器数不变。
离线