打印
[STM32L4]

rtc时间精度

[复制链接]
284|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yinxiangh|  楼主 | 2023-2-17 23:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
先上代码:
int main(void)
{
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */
  /* MCU Configuration----------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* USER CODE BEGIN Init */
  /* USER CODE END Init */
  /* Configure the system clock */
  SystemClock_Config();
  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_RTC_Init();
  MX_USART1_UART_Init();
  /* Initialize interrupts */
  MX_NVIC_Init();
gUSER_SendSec_Index = 0x00;
  /* USER CODE BEGIN 2 */
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */
  if(gUSER_SendSec_Index == 0x01)
  {
   USER_BackInfo();
   gUSER_SendSec_Index = 0x00;
  }
  USER_Uart_DmaRecv();
  /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
//RTC配置
static void MX_RTC_Init(void)
{
  RTC_TimeTypeDef sTime;
  RTC_DateTypeDef sDate;
    /**Initialize RTC Only
    */
  hrtc.Instance = RTC;
  hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  hrtc.Init.AsynchPrediv = 0;
  hrtc.Init.SynchPrediv = 31999;
  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;
  if (HAL_RTC_Init(&hrtc) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
    /**Initialize RTC and set the Time and Date
    */
  if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x32F2){
  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(__FILE__, __LINE__);
  }
  sDate.WeekDay = RTC_WEEKDAY_MONDAY;
  sDate.Month = RTC_MONTH_JANUARY;
  sDate.Date = 0x1;
  sDate.Year = 0x0;
  if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
    HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0x32F2);
  }
    /**Enable the WakeUp
    */
  if (HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }
}
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc1)
{
gUSER_SendSec_Index = 0x01;
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);
}
//通过串口发送至PC机显示时间
void USER_BackInfo(void)
{
RTC_TimeTypeDef sTime;
  RTC_DateTypeDef sDate;

gUARTSendBuff[0] = '$';
gUARTSendBuff[1] = 'I';
gUARTSendBuff[2] = 'N';
gUARTSendBuff[3] = 'F';
gUARTSendBuff[4] = 'O';
gUARTSendBuff[5] = 0x00;
gUARTSendBuff[6] = 0x0E;
gUARTSendBuff[7] = ID;
gUARTTx_Len = 14;

HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
  HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);


gUARTSendBuff[8] = sDate.Year;
gUARTSendBuff[9] = sDate.Month;
gUARTSendBuff[10] = sDate.Date;
gUARTSendBuff[11] = sTime.Hours;
gUARTSendBuff[12] = sTime.Minutes;
gUARTSendBuff[13] = sTime.Seconds;

USER_Uart_DataSend();
  
}

在PC机上同时显示PC机时间和通过串口收到的时间,才过了3个小时就差了30秒,这个精度很低呀,是我哪里没弄对么?

使用特权

评论回复
沙发
wyjie| | 2023-2-17 23:10 | 只看该作者
可能晶体买的太便宜了。

使用特权

评论回复
板凳
chuxh| | 2023-2-17 23:13 | 只看该作者
可能晶振有问题

使用特权

评论回复
地板
llljh| | 2023-2-17 23:17 | 只看该作者
RTC精度跟时钟源的精度有很大关系。

使用特权

评论回复
5
ousj| | 2023-2-17 23:18 | 只看该作者
虽说 RTC  具有校准功能,  也不能这样差

使用特权

评论回复
6
gongche| | 2023-2-17 23:20 | 只看该作者
检查一下晶振的波形有问题么, 幅度太小了么

使用特权

评论回复
7
dingy| | 2023-2-17 23:22 | 只看该作者
或者太大严重削顶了么

使用特权

评论回复
8
bqyj| | 2023-2-17 23:23 | 只看该作者
RTC 时间的精度确实不是很高. 而这个偏差其实并不来源于 STM32.

使用特权

评论回复
9
dengdc| | 2023-2-17 23:25 | 只看该作者
晶振的频率精度不高

使用特权

评论回复
10
houcs| | 2023-2-17 23:26 | 只看该作者
STM32 后来增加了校准功能来进行修正, 办法是若干次周期后增删一个脉冲(调整计数器).

使用特权

评论回复
11
kangzj| | 2023-2-17 23:29 | 只看该作者
楼主想得到高精度计时, 除了改用高精度晶振, 还可以用好这个校准功能

使用特权

评论回复
12
xxrs| | 2023-2-17 23:31 | 只看该作者
使用外部的RTC电路。

使用特权

评论回复
13
heweibig| | 2023-2-17 23:32 | 只看该作者
是不是外部的晶振有问题?

使用特权

评论回复
14
wuhany| | 2023-2-17 23:33 | 只看该作者
是串口发送的数据有问题吗?

使用特权

评论回复
15
dengdc| | 2023-2-17 23:34 | 只看该作者
使用DS12884试试。

使用特权

评论回复
16
bqyj| | 2023-2-17 23:35 | 只看该作者
是32K的外部晶振吗

使用特权

评论回复
17
ousj| | 2023-2-18 09:56 | 只看该作者
是对比的时间开始设置的一致吗?

使用特权

评论回复
18
yinxiangh|  楼主 | 2023-2-18 10:01 | 只看该作者
换成外部晶振了,目前跑了2个小时了,还是挺准的

使用特权

评论回复
19
chuxh| | 2023-2-18 10:03 | 只看该作者
计算都有问题,手册上说内部低速RC时钟40Khz,实际会在30-60Khz左右

使用特权

评论回复
20
juventus9554| | 2023-2-18 10:04 | 只看该作者
串口发送的数据有问题吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

723

主题

7134

帖子

2

粉丝