找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

STM32通過GSM模塊獲取網(wǎng)絡(luò)時間并設(shè)置到單片機(jī)內(nèi)部RTC中實現(xiàn)上電自動校準(zhǔn)時間

查看數(shù): 12104 | 評論數(shù): 7 | 收藏 7
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2019-6-20 23:52

正文摘要:

        先簡單說一下實驗?zāi)康陌。平時做項目或做一些小作品的時候需要用到時間,時間用的是STM32內(nèi)部的RTC,在精度要求不是特別高時這樣省去接外設(shè)時鐘模塊,省時省力。但我們都知道 ...

回復(fù)

ID:435174 發(fā)表于 2020-2-5 20:59
本帖最后由 Linux— 于 2020-2-5 21:41 編輯

各位,我又找到了一種方法,數(shù)據(jù)手冊上提到的。封裝成函數(shù)就是這樣的,親測可用:
函數(shù)如下:
  1. u8 Synchro_NTP_Time(void)//同步時間
  2. {   
  3.     printf("\r\n正在同步網(wǎng)絡(luò)\r\n");
  4.         if(sim900a_send_cmd("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n","OK",100))   //設(shè)置網(wǎng)絡(luò)參數(shù)
  5.         {
  6.             printf("設(shè)置網(wǎng)絡(luò)參數(shù)失敗\r\n");
  7.             return 1;
  8.         }

  9.       if(sim900a_send_cmd("AT+SAPBR=3,1,\"APN\",\"UNIWAP\"\r\n","OK",500))  //設(shè)置APN
  10.       {
  11.           printf("設(shè)置APN失敗\r\n");
  12.           return 2;
  13.       }
  14.        if( sim900a_send_cmd("AT+SAPBR=1,1\r\n","OK",200))//激活網(wǎng)絡(luò)場景
  15.        {
  16.             printf("激活網(wǎng)絡(luò)場景失敗\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)) //設(shè)置NTP服務(wù)地址和時區(qū)(阿里云的NTP)
  26.         {
  27.             printf("設(shè)置NTP服務(wù)地址和時區(qū)失敗\r\n");
  28.             return 5;      
  29.         }

  30.         if(sim900a_send_cmd("AT+CNTP\r\n","CNTP: 1",500))  //開啟網(wǎng)絡(luò)同步
  31.         {
  32.             printf("開啟網(wǎng)絡(luò)同步失敗\r\n");
  33.             return 6;     
  34.         }  
  35.         printf("\r\n網(wǎng)絡(luò)同步成功!\r\n");
  36.         Get_GSM_RTCtime();
  37.         
  38.         return 0;
  39. }


復(fù)制代碼

只要模塊注冊到了網(wǎng)絡(luò),一下子就同步到網(wǎng)絡(luò)了,GSM模塊內(nèi)部時間也自動對齊網(wǎng)絡(luò)時間了。模塊有信號能注冊到網(wǎng)絡(luò)的話一秒鐘就搞定了,還是很快的。調(diào)用的時候可以讓它循環(huán)執(zhí)行,若是不成功,設(shè)置失敗次數(shù)達(dá)到10次就跳出就好了。若是失敗的話估計就是在關(guān)閉網(wǎng)絡(luò)場景那一步,其他的沒啥問題。下面是我在串口調(diào)試助手顯示的內(nèi)容:
  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內(nèi)部時間日期中...
  9. AT+CCLK?
  10. CCLK?

  11. +CCLK: "04/01/01,00:00:05+0
  12. 模塊返回時間數(shù)據(jù):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. 數(shù)據(jù)轉(zhuǎn)換成功

  20. GSM內(nèi)部時間:2004年01月01日00時00分05秒
  21. 系統(tǒng)初始化完畢!

  22. 進(jìn)入同步網(wǎng)絡(luò)模式

  23. 正在同步網(wǎng)絡(luò)
  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. 網(wǎng)絡(luò)同步成功!
  37. AT+CCLK?
  38. CCLK: "20/02/05,20
  39. 獲取SIM900A內(nèi)部時間日期中...
  40. AT+CCLK?
  41. CCLK?

  42. +CCLK: "20/02/05,20
  43. 模塊返回時間數(shù)據(jù):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. 數(shù)據(jù)轉(zhuǎn)換成功

  50. GSM內(nèi)部時間:2020年02月05日20時33分05秒
復(fù)制代碼


可以看到模塊剛開機(jī)初始化完成時內(nèi)部時間是2004年01月01日00時00分05秒,同步網(wǎng)絡(luò)后時間自動更新到當(dāng)前時間:2020年02月05日20時33分05秒 了。有興趣的各位不妨試試。相關(guān)的截圖和NTP同步的手冊截圖請看博客https://blog.csdn.net/qq_36112455/article/details/92798026。因為這里的我不懂怎么在評論添加圖片。
ID:435174 發(fā)表于 2020-1-23 23:40
Linux— 發(fā)表于 2020-1-3 00:18
從SIM卡獲取妥妥的,服務(wù)器不穩(wěn)。 AT指令集你去查一下  AT+CCLK?

現(xiàn)在回頭看了下,其實用服務(wù)器那種方式還是很穩(wěn)的,只需要小小改動一下,在void Get_Sever_Time(void)函數(shù)下把所有USART2_RX_BUF改成AT_RecvBuffer就好了,克服了上文說的那些缺點,今晚測試過好多次了,沒有失敗過,每次都成功。而且連接服務(wù)器的速度其實是跟信號有關(guān)的,之前那個地方信號太弱了,導(dǎo)致連接速度比較慢,在信號好的地方一下子就連上了。還有,AT+CCLK?只是獲取模塊的內(nèi)部時間,斷電重新上電后還是要從網(wǎng)絡(luò)獲取時間同步進(jìn)去的,不然也是不準(zhǔn)的。此外,獲取網(wǎng)絡(luò)時間和日期也可以用GPRS基站定位,從返回的字符串中把時間數(shù)據(jù)解析出來就行了。這個方法我也測過了,是能用的,但對信號強(qiáng)度要求更高,不然網(wǎng)絡(luò)沒配置好的話也是定位不到進(jìn)而獲取不了數(shù)據(jù)的。

評分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 回帖助人的獎勵!

查看全部評分

ID:435174 發(fā)表于 2020-1-23 23:30
lis。ss 發(fā)表于 2019-10-27 17:54
"TCP","time.nist.gov","13"  發(fā)完后回來數(shù)據(jù)是   IIII  這樣的,怎么回事?,之前成功過

現(xiàn)在回頭看了下,你這個問題是串口2中斷接收沒處理好造成的。如果不想改中斷服務(wù)函數(shù)的話就在void Get_Sever_Time(void)函數(shù)下把所有USART2_RX_BUF改成AT_RecvBuffer可以解決此問題,而且再也不會出現(xiàn)上文提到的那些確定,我今晚用SIM800C測過好幾遍了,沒問題,很好用。你可以試下。
ID:435174 發(fā)表于 2020-1-3 00:18
qq1182560902 發(fā)表于 2019-12-30 13:34
獲取時間不穩(wěn)定嗎??SIM卡或者時間是怎么做的?

從SIM卡獲取妥妥的,服務(wù)器不穩(wěn)。 AT指令集你去查一下  AT+CCLK?
ID:613800 發(fā)表于 2019-12-30 13:34
獲取時間不穩(wěn)定嗎??SIM卡或者時間是怎么做的?
ID:435174 發(fā)表于 2019-10-31 21:09
lis。ss 發(fā)表于 2019-10-27 17:54
"TCP","time.nist.gov","13"  發(fā)完后回來數(shù)據(jù)是   IIII  這樣的,怎么回事?,之前成功過

別用服務(wù)器的方式獲取了,不穩(wěn)定不可靠,老是莫名其妙出現(xiàn)奇奇怪怪的問題。用我說的第二種方法直接從SIM卡獲取時間吧
ID:355468 發(fā)表于 2019-10-27 17:54
"TCP","time.nist.gov","13"  發(fā)完后回來數(shù)據(jù)是   IIII  這樣的,怎么回事?,之前成功過

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表