野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13252|回复: 6

RTC更新时间值?

[复制链接]
发表于 2016-8-7 19:04:26 | 显示全部楼层 |阅读模式
本帖最后由 CSWZH8 于 2016-8-7 19:09 编辑

STM32的RTC采用的外部晶振还是有误差的,
所以想设计成每隔1天就通过以太网接收新的时间信息,然后更新RTC寄存器。代码如图
首次上电如果检测到RTC没配置,就会按照野火的程序通过串口来配置成功。
RTC正常运行之后,隔一段时间后我要对它通过网络校准
这时他总是停在          RTC_WaitForLastTask();      死等。出不来了,是什么原因呢


RTC更新代码

RTC更新代码
回复

使用道具 举报

发表于 2016-8-7 19:22:52 | 显示全部楼层
看看程序有没有使能备份域时钟
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-7 20:06:16 | 显示全部楼层
随风 发表于 2016-8-7 19:22
看看程序有没有使能备份域时钟

使能了的,是不是需要先修改别的什么东西,然后才能修改计数寄存器?
回复 支持 反对

使用道具 举报

发表于 2016-8-7 20:29:10 | 显示全部楼层
CSWZH8 发表于 2016-8-7 20:06
使能了的,是不是需要先修改别的什么东西,然后才能修改计数寄存器?

就是使能了备份域就可以了
回复 支持 反对

使用道具 举报

发表于 2016-8-16 14:45:26 | 显示全部楼层
兄弟,你最后是怎么弄的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-24 16:05:12 | 显示全部楼层
本帖最后由 CSWZH8 于 2016-8-24 16:10 编辑
xiongxionghuo 发表于 2016-8-16 14:45
兄弟,你最后是怎么弄的

网络接收一个对时字符串TIME:2016Y08M05D06H09M33S,存放在DATA数组中,然后用下面自己写的函数做处理,里面调用的都是野火的RTC程序中的函数
void Time_Adjust_NET(char* DATA,struct rtc_time *SYSTM)
{
                char TIME_RTC[26];

          //u32 T_YEAR,T_MONTH,T_DAY,T_HOUR,T_MIN,T_SEC;
          memcpy(TIME_RTC,DATA,26);
        
          SYSTM->tm_year=ascTnum2(TIME_RTC[7],TIME_RTC[8])+2000;
    SYSTM->tm_mon=ascTnum2(TIME_RTC[10],TIME_RTC[11]);
    SYSTM->tm_mday=ascTnum2(TIME_RTC[13],TIME_RTC[14]);
          SYSTM->tm_hour=ascTnum2(TIME_RTC[16],TIME_RTC[17]);
          SYSTM->tm_min=ascTnum2(TIME_RTC[19],TIME_RTC[20]);
          SYSTM->tm_sec=ascTnum2(TIME_RTC[22],TIME_RTC[23]);
         
          RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
    PWR_BackupAccessCmd(ENABLE);
         

          GregorianDay(SYSTM);

          RTC_WaitForLastTask();

          RTC_SetCounter(mktimev(SYSTM));

          RTC_WaitForLastTask();
                BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
                PWR_BackupAccessCmd(DISABLE);//3y ÄüPWR_CRμÄDBPλ
                printf("网络对时成功   \n");
                Time_Display( RTC_GetCounter(),&systmtime);
               
}

u32 ascTnum2(unsigned char GAO,unsigned char DI)//把两个字符转换为数字
{
        u32 NUM;
  if(GAO>=48&&GAO<=57&&DI>=48&&DI<=57)
        {
                NUM=(GAO-48)*10+(DI-48);
                return NUM;
        }
        else
                return 0;

}

回复 支持 反对

使用道具 举报

发表于 2016-8-28 13:46:52 | 显示全部楼层
CSWZH8 发表于 2016-8-24 16:05
网络接收一个对时字符串TIME:2016Y08M05D06H09M33S,存放在DATA数组中,然后用下面自己写的函数做处理,里 ...

谢谢,参考下
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-29 02:16 , Processed in 0.043076 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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