为了验证问题,新建了个工程,只保留串口和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)
离线
离线
谢谢。下载看了下,这个是自带例程里关于RTC报警的。那么我试试stm32g431的rtc例程吧。
离线
某网友回复: 总感觉这么读秒有问题,那就加大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)
离线
谢谢,受教了。
那应该是读时间,锁定了影子寄存器,之前一直没有读日期,所以就一直没有解锁,影子数据寄存器数不变。
离线