OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3145|回复: 13

求助一下,F7的HAL库RTC,重新设置时间,返回成功后。但是获取时间还是上次设置好的时间,并没有更新。

[复制链接]

36

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2018-7-1
在线时间
76 小时
发表于 2020-7-16 15:39:44 | 显示全部楼层 |阅读模式
30金钱
        HAL_RTC_GetTime(&hrtc,&RTC_TimeStruct,RTC_FORMAT_BIN);
        HAL_RTC_GetDate(&hrtc,&RTC_DateStruct,RTC_FORMAT_BIN);
获取时间接口 按照这样获取。
用的是  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)
            {
            }
来设置时间,设置完后启动定时器。
__HAL_RCC_RTC_ENABLE();求助 经常设置后 返回成功,但是用的缺是上次设置的时间。




最佳答案

查看完整内容[请看2#楼]

没问题,就是不对而已
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-7-16 15:39:45 | 显示全部楼层
Hatcher36029135 发表于 2020-7-22 08:28
有的 如果在没有设置前就开始读取会有问题吗?有可能是这个问题导致的

没问题,就是不对而已
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-7-16 23:13:06 | 显示全部楼层
参考我们例程
回复

使用道具 举报

36

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2018-7-1
在线时间
76 小时
 楼主| 发表于 2020-7-17 00:27:42 | 显示全部楼层

参考了原子哥 你们是初始化的时候就设置一次RTC。我尝试中途设置,设置成功,但是GET时间的时候并没有 用最新的时间进行计时
回复

使用道具 举报

36

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2018-7-1
在线时间
76 小时
 楼主| 发表于 2020-7-17 00:29:03 | 显示全部楼层

参考了原子哥,我是在循环读取RTC的过程中, 中间尝试设置新的时间。例程是开机就设置了 中间设置好像也不行
回复

使用道具 举报

11

主题

2148

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4911
金钱
4911
注册时间
2015-1-10
在线时间
615 小时
发表于 2020-7-17 09:39:52 | 显示全部楼层
Hatcher36029135 发表于 2020-7-17 00:29
参考了原子哥,我是在循环读取RTC的过程中, 中间尝试设置新的时间。例程是开机就设置了 中间设置好像也 ...

先读日期,再读时间,然后再读日期,这样试试
        RTC_GetDate(RTC_Format_BIN, &RTC_DateStructure);       
        RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure);
        RTC_GetDate(RTC_Format_BIN, &RTC_DateStructure);
回复

使用道具 举报

36

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2018-7-1
在线时间
76 小时
 楼主| 发表于 2020-7-20 12:00:05 | 显示全部楼层
阿侑kevin 发表于 2020-7-17 09:39
先读日期,再读时间,然后再读日期,这样试试
        RTC_GetDate(RTC_Format_BIN, &RTC_DateStructure);       
        R ...

好的 我是线程里面每1秒读取一个一次RTC
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-7-21 02:04:39 | 显示全部楼层
Hatcher36029135 发表于 2020-7-17 00:27
参考了原子哥 你们是初始化的时候就设置一次RTC。我尝试中途设置,设置成功,但是GET时间的时候并没有 用 ...

我们例程不会无法设置,有我们开发板么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

36

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2018-7-1
在线时间
76 小时
 楼主| 发表于 2020-7-22 08:28:36 | 显示全部楼层
正点原子 发表于 2020-7-21 02:04
我们例程不会无法设置,有我们开发板么?

有的 如果在没有设置前就开始读取会有问题吗?有可能是这个问题导致的
回复

使用道具 举报

36

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2018-7-1
在线时间
76 小时
 楼主| 发表于 2020-7-23 09:05:17 | 显示全部楼层
正点原子 发表于 2020-7-23 02:21
没问题,就是不对而已

我在尝试一下 我现在的情况是。开机还没设置时间就先取了RTC的数值,
回复

使用道具 举报

36

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
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);
回复

使用道具 举报

36

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2018-7-1
在线时间
76 小时
 楼主| 发表于 2020-7-23 10:20:08 | 显示全部楼层
正点原子 发表于 2020-7-23 02:21
没问题,就是不对而已

sTime.Hours == 2 sTime.Minutes == 18 sTime.Seconds == 19
sTime.Hours == 2 sTime.Minutes == 12 sTime.Seconds == 13
sTime.Hours == 2 sTime.Minutes == 12 sTime.Seconds == 13
sTime.Hours == 2 sTime.Minutes == 12 sTime.Seconds == 14

现在打印发现设置成功后 一瞬间是能读出出正确时间的,但是继续往后读。就是上次保持的时间。。
回复

使用道具 举报

36

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2018-7-1
在线时间
76 小时
 楼主| 发表于 2020-7-23 10:35:17 | 显示全部楼层
而且时间还会错乱 鬼鬼
回复

使用道具 举报

5

主题

152

帖子

0

精华

高级会员

Rank: 4

积分
777
金钱
777
注册时间
2016-7-15
在线时间
119 小时
发表于 2020-7-23 10:41:08 | 显示全部楼层
鬼鬼~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 17:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表