找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

STM32通过GSM模块获取网络时间并设置到单片机内部RTC中实现上电自动校准时间

查看数: 12266 | 评论数: 7 | 收藏 7
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2019-6-20 23:52

正文摘要:

        先简单说一下实验目的吧。平时做项目或做一些小作品的时候需要用到时间,时间用的是STM32内部的RTC,在精度要求不是特别高时这样省去接外设时钟模块,省时省力。但我们都知道 ...

回复

ID:435174 发表于 2020-2-5 20:59
本帖最后由 Linux— 于 2020-2-5 21:41 编辑

各位,我又找到了一种方法,数据手册上提到的。封装成函数就是这样的,亲测可用:
函数如下:
  1. u8 Synchro_NTP_Time(void)//同步时间
  2. {   
  3.     printf("\r\n正在同步网络\r\n");
  4.         if(sim900a_send_cmd("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n","OK",100))   //设置网络参数
  5.         {
  6.             printf("设置网络参数失败\r\n");
  7.             return 1;
  8.         }

  9.       if(sim900a_send_cmd("AT+SAPBR=3,1,\"APN\",\"UNIWAP\"\r\n","OK",500))  //设置APN
  10.       {
  11.           printf("设置APN失败\r\n");
  12.           return 2;
  13.       }
  14.        if( sim900a_send_cmd("AT+SAPBR=1,1\r\n","OK",200))//激活网络场景
  15.        {
  16.             printf("激活网络场景失败\r\n");
  17. //           sim900a_send_cmd("AT+CGATT=1\r\n","OK",200);
  18.            return 3;
  19.        }

  20.         if(sim900a_send_cmd("AT+SAPBR=2,1\r\n","OK",600))   //获取分配的ip地址
  21.         {
  22.             printf("获取分配的IP地址失败\r\n");
  23.             return 4;
  24.         }

  25.         if(sim900a_send_cmd("AT+CNTP=\"ntp1.aliyun.com\",32\r\n","OK",200)) //设置NTP服务地址和时区(阿里云的NTP)
  26.         {
  27.             printf("设置NTP服务地址和时区失败\r\n");
  28.             return 5;      
  29.         }

  30.         if(sim900a_send_cmd("AT+CNTP\r\n","CNTP: 1",500))  //开启网络同步
  31.         {
  32.             printf("开启网络同步失败\r\n");
  33.             return 6;     
  34.         }  
  35.         printf("\r\n网络同步成功!\r\n");
  36.         Get_GSM_RTCtime();
  37.         
  38.         return 0;
  39. }


复制代码

只要模块注册到了网络,一下子就同步到网络了,GSM模块内部时间也自动对齐网络时间了。模块有信号能注册到网络的话一秒钟就搞定了,还是很快的。调用的时候可以让它循环执行,若是不成功,设置失败次数达到10次就跳出就好了。若是失败的话估计就是在关闭网络场景那一步,其他的没啥问题。下面是我在串口调试助手显示的内容:
  1. AT
  2. OK
  3. AT+CPIN?
  4. READY
  5. GSM模块自检成功
  6. AT+CCLK?
  7. CCLK: "04/01/01,00:00:05+0
  8. 获取SIM900A内部时间日期中...
  9. AT+CCLK?
  10. CCLK?

  11. +CCLK: "04/01/01,00:00:05+0
  12. 模块返回时间数据:CCLK?

  13. +CCLK: "04/01/01,00:00:05+08"

  14. OK

  15. SMS Ready
  16. AT+CCLK?

  17. +CCLK: "04/01/01,00:00:05+08"

  18. OK

  19. 数据转换成功

  20. GSM内部时间:2004年01月01日00时00分05秒
  21. 系统初始化完毕!

  22. 进入同步网络模式

  23. 正在同步网络
  24. AT+SAPBR=3,1,"CONTYPE","GPRS"
  25. OK
  26. AT+SAPBR=3,1,"APN","UNIWAP"
  27. OK
  28. AT+SAPBR=1,1
  29. OK
  30. AT+SAPBR=2,1
  31. OK
  32. AT+CNTP="ntp1.aliyun.com",32
  33. OK
  34. AT+CNTP
  35. CNTP: 1

  36. 网络同步成功!
  37. AT+CCLK?
  38. CCLK: "20/02/05,20
  39. 获取SIM900A内部时间日期中...
  40. AT+CCLK?
  41. CCLK?

  42. +CCLK: "20/02/05,20
  43. 模块返回时间数据:CCLK?

  44. +CCLK: "20/02/05,20:33:05+08"

  45. OK
  46. AT+CCLK?

  47. +CCLK: "20/02/05,20:33:05+08"

  48. OK

  49. 数据转换成功

  50. GSM内部时间:2020年02月05日20时33分05秒
复制代码


可以看到模块刚开机初始化完成时内部时间是2004年01月01日00时00分05秒,同步网络后时间自动更新到当前时间:2020年02月05日20时33分05秒 了。有兴趣的各位不妨试试。相关的截图和NTP同步的手册截图请看博客https://blog.csdn.net/qq_36112455/article/details/92798026。因为这里的我不懂怎么在评论添加图片。
ID:435174 发表于 2020-1-23 23:40
Linux— 发表于 2020-1-3 00:18
从SIM卡获取妥妥的,服务器不稳。 AT指令集你去查一下  AT+CCLK?

现在回头看了下,其实用服务器那种方式还是很稳的,只需要小小改动一下,在void Get_Sever_Time(void)函数下把所有USART2_RX_BUF改成AT_RecvBuffer就好了,克服了上文说的那些缺点,今晚测试过好多次了,没有失败过,每次都成功。而且连接服务器的速度其实是跟信号有关的,之前那个地方信号太弱了,导致连接速度比较慢,在信号好的地方一下子就连上了。还有,AT+CCLK?只是获取模块的内部时间,断电重新上电后还是要从网络获取时间同步进去的,不然也是不准的。此外,获取网络时间和日期也可以用GPRS基站定位,从返回的字符串中把时间数据解析出来就行了。这个方法我也测过了,是能用的,但对信号强度要求更高,不然网络没配置好的话也是定位不到进而获取不了数据的。

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

ID:435174 发表于 2020-1-23 23:30
lis。ss 发表于 2019-10-27 17:54
"TCP","time.nist.gov","13"  发完后回来数据是   IIII  这样的,怎么回事?,之前成功过

现在回头看了下,你这个问题是串口2中断接收没处理好造成的。如果不想改中断服务函数的话就在void Get_Sever_Time(void)函数下把所有USART2_RX_BUF改成AT_RecvBuffer可以解决此问题,而且再也不会出现上文提到的那些确定,我今晚用SIM800C测过好几遍了,没问题,很好用。你可以试下。
ID:435174 发表于 2020-1-3 00:18
qq1182560902 发表于 2019-12-30 13:34
获取时间不稳定吗??SIM卡或者时间是怎么做的?

从SIM卡获取妥妥的,服务器不稳。 AT指令集你去查一下  AT+CCLK?
ID:613800 发表于 2019-12-30 13:34
获取时间不稳定吗??SIM卡或者时间是怎么做的?
ID:435174 发表于 2019-10-31 21:09
lis。ss 发表于 2019-10-27 17:54
"TCP","time.nist.gov","13"  发完后回来数据是   IIII  这样的,怎么回事?,之前成功过

别用服务器的方式获取了,不稳定不可靠,老是莫名其妙出现奇奇怪怪的问题。用我说的第二种方法直接从SIM卡获取时间吧
ID:355468 发表于 2019-10-27 17:54
"TCP","time.nist.gov","13"  发完后回来数据是   IIII  这样的,怎么回事?,之前成功过

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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