初级会员

- 积分
- 99
- 金钱
- 99
- 注册时间
- 2018-7-1
- 在线时间
- 76 小时
|

楼主 |
发表于 2020-7-23 09:57:40
|
显示全部楼层
我贴一下源代码吧。不是在开发板测试的。用的内部时钟:
* RTC init function */
void MX_RTC_Init(void)
{
// RTC_TimeTypeDef sTime = {0};
// RTC_DateTypeDef sDate = {0};
/** Initialize RTC Only
*/
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = 0x7f;
hrtc.Init.SynchPrediv = 0xff;
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN Check_RTC_BKUP */
/* USER CODE END Check_RTC_BKUP */
/** Initialize RTC and set the Time and Date
*/
#if 0
sTime.Hours = 0x0;
sTime.Minutes = 0x0;
sTime.Seconds = 0x0;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
sDate.WeekDay = RTC_WEEKDAY_THURSDAY;
sDate.Month = RTC_MONTH_JULY;
sDate.Date = 0x16;
sDate.Year = 0x20;
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
#endif
//HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0x32F6);
}
void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
if(rtcHandle->Instance==RTC)
{
/* USER CODE BEGIN RTC_MspInit 0 */
__HAL_RCC_PWR_CLK_ENABLE();//使能电源时钟PWR
HAL_PWR_EnableBkUpAccess();//取消备份区域写保护
/* USER CODE END RTC_MspInit 0 */
/* RTC clock enable */
RCC_OscInitStruct.OscillatorType=RCC_OSCILLATORTYPE_LSI;//LSE配置
RCC_OscInitStruct.PLL.PLLState=RCC_PLL_NONE;
RCC_OscInitStruct.LSIState=RCC_LSI_ON;//RTC使用LSE
HAL_RCC_OscConfig(&RCC_OscInitStruct);
PeriphClkInitStruct.PeriphClockSelection=RCC_PERIPHCLK_RTC;//外设为RTC
PeriphClkInitStruct.RTCClockSelection=RCC_RTCCLKSOURCE_LSI;//RTC时钟源为LSI
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
/* USER CODE BEGIN RTC_MspInit 1 */
/* USER CODE END RTC_MspInit 1 */
}
}
上面是初始化代码:
下面是RTC时钟设置,当有GPS数据进来后 就设置一次:
if((rtc_flag != 1) && ((gpsx.utc.hour !=0) || (gpsx.utc.min != 0)||(gpsx.utc.sec != 0)))
{
#if 0
sTime.Hours = gpsx.utc.hour;
sTime.Minutes = gpsx.utc.min;
sTime.Seconds = gpsx.utc.sec;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
{
}
else
{
printf("sTime.Hours == %d sTime.Minutes == %d sTime.Seconds == %d\r\n",sTime.Hours,sTime.Minutes,sTime.Seconds);
HAL_RTC_GetTime(&hrtc,&RTC_TimeStruct,RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc,&RTC_DateStruct,RTC_FORMAT_BIN);
rtc_flag = ON;
__HAL_RCC_RTC_ENABLE();
}
sDate.WeekDay = gpsx.utc.iweek;
sDate.Month = gpsx.utc.month;
sDate.Date = gpsx.utc.date;
sDate.Year = gpsx.utc.year;
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
#endif
}
另外一个显示线程:一开机就运行 下面两句取数据
HAL_RTC_GetTime(&hrtc,&RTC_TimeStruct,RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc,&RTC_DateStruct,RTC_FORMAT_BIN);
|
|