**
SIMCOM-4G模組-A7670C_FASL-SOC二次開發 兩路MQTT
本資料僅僅提供學習使用
兩路MQTT同時使用

文章目錄
- SIMCOM-4G模組-A7670C_FASL-SOC二次開發 兩路MQTT
- 開發準備作業
- 一、環境搭建
- 1) 安裝串口驅動
- 2) 安裝USB程式下載和日志log列印驅動
- 3) AT指令互動埠和串口互動埠,如下圖說明
- 4) 編譯程式和燒錄程式
- 5) Debug日志列印查看
- 6) VS Code軟體安裝及使用
- ① 軟體安裝
- ② 打開工程檔案及編譯工程
- 驅動程式開發
- 一、工程框架創建
- 1) 什么是任務
- 2) 新建工程及創建工程任務框架
- 二、通過串口接收資料和發送資料
- 1) 使用訊息佇列對串口資料進行接收
- ①訊息佇列的官方解釋
- ②使用訊息佇列對串口資料進行接收
- ③使用訊息佇列串口收發實驗現象
- 2) 普通串口資料進行接收
- ①普通串口收發任務函式撰寫
- ②普通串口收發實驗現象
- 3) 串口初始化和串口與訊息佇列聯合講解
- 三、GPIO操作
- 1) API手冊上GPIO埠函式描述
- 2) 呼叫API函式對GPIO初始化以及控制(程式)
- 四、ADC模擬電壓采集
- 1)A7670C 4G模組關于ADC一些官方資訊
- 2)ADC采集任務函式撰寫(程式)
- 3)ADC采集實驗現象
- 五、RTC實時時鐘
- 1)RTC實時時鐘的時間設定和獲取的API函式講解
- ①sAPI_RtcSetAlarm(t_rtc *rtcSetTime):
- ②sAPI_RtcGetAlarm(t_rtc *rtcSetTime):
- ③注意點:
- 2)RTC實時時鐘任務函式撰寫(程式)
- 3)RTC實時時鐘實驗現象
- 六、Flash閃存
- 1) Flash閃存擦除、寫入和讀取的API函式講解
- ① sAPI_EraseFlashSector(unsigned int offset, unsigned int size):
- ② sAPI_WriteFlash(unsigned int offset, char *buff, unsigned int size):
- ③ sAPI_ReadFlash(unsigned int offset, char *buff, unsigned int size):
- ④ 注意點:
- 2) Flash閃存任務函式撰寫(程式)
- 3) Flash閃存讀、寫、擦除實驗現象
- 七、MQTT
- 1) 標準MQTT連接阿里云物聯網平臺呼叫的API函式
- ① sAPI_MqttStart:
- ② sAPI_MqttAccq:
- ③ sAPI_MqttConnect:
- ④ sAPI_MqttSub:
- ⑤ sAPI_MqttTopic:
- ⑥ sAPI_MqttPayload:
- ⑦sAPI_MqttPub:
- 2) 標準MQTT連接阿里云任務函式(程式)
開發準備作業
一、環境搭建
1) 安裝串口驅動
首先,接入串口USB
圖片略,產品機密!
然后在設備管理器上可以看到

然后在上圖的兩個為安裝的驅動設備點擊右鍵選擇更新驅動程式,在彈出的對話框選擇瀏覽我的計算機…選項,然后找到device目錄下選擇UART_TO_USB_Drivers檔案夾下一步安裝即可,


驅動USB串口驅動安裝完成后,如下圖

2) 安裝USB程式下載和日志log列印驅動
首先接入USB
圖片略,產品機密!
然后在設備管理器上可以看到

接下來安裝的步驟和USB串口的安裝步驟是一樣的了,這里就不重復說明了,驅動檔案在drivers目錄下的UART_TO_USB_Drivers檔案夾,
安裝完成后,如下圖

3) AT指令互動埠和串口互動埠,如下圖說明

AT指令互動埠,這里要說明一下,在下圖10可以看到紅色框框的埠,這些埠都是除錯和日志列印使用的,這里不多說了,(可以參考A76xx_Series_Open_SDK_Debug_and_Download_Application_Note_V1.00.06檔案)
而AT指令互動埠不在設備管理器上有顯示,但它在串口除錯助手會顯示出來,如下圖11所示,


可以使用串口除錯助手選擇COM15進行發送AT,它會回傳OK即正常,
4) 編譯程式和燒錄程式
首先先在tools目錄找到python檔案夾下的python安裝包,以它默認的方式安裝好python的環境,
在使用window自帶的cmd命令視窗上進入到SDK更目錄下面,操作說明如下圖

然后在SDK根目錄下的cmd命令列視窗進行編譯 APP 并生成韌體包操作,

上面的命令中要注意“A7670C_FASL”這是芯片型號,用的芯片型號不同要修改回對應的型號名稱,型號可以在硬體芯片上的標簽可以看到或者使用AT指令查看芯片型號(如下圖所示”AT+CGMM”)

注意:如果編譯時更改正確的型號還是不通過,需要找客服提供對應型號的SDK,因為一個SDK對應有好幾個的型號,可能您使用的SDK不包含你使用的芯片型號,
程式燒錄的步驟:首先先找到tools目錄下的download檔案夾里的aboot-tools-2020.12.24-win-x64.exe檔案,該檔案是用來燒錄程式的工具,點擊運行該檔案,里面的設定都為默認即可,安裝完成后如下圖所示

然后進入aboot-tools-2020.12.24-win-x64檔案夾,選擇aboot.exe可執行檔案運行,進入aboot.exe燒錄程式頁面,在“Release package”這一行點擊
這個放大鏡圖示,選擇SDK根目錄的target檔案夾下的SC_A7670C_FASL_16M.zip壓縮檔案(這個就是燒錄時所需的檔案),最后點擊start按鍵進行燒錄,


注意啟動燒錄后先將Power撥動開關打到OFF位,然后在將Power撥動開關打到ON位,最后雙擊POWER_ON按鍵即可正式開始下載燒錄程式,(下圖為燒錄程序)



5) Debug日志列印查看
首先打開Debug日志查看軟體,如下圖


注意,這時要將將4G模組的USB_Dug日志列印埠與電腦連接上,








6) VS Code軟體安裝及使用
敘述:因為使用VS Code這個IDE軟體就不需要像前面說的那樣打開兩個視窗(window的CMD和C撰寫軟體等),VS Code都可以集成好,用起來和MDK差不多,
① 軟體安裝
根據下圖所示檔案路徑打開安裝檔案,

點擊下一步,

選擇我接受協議(A)復選框,然后點擊下一步,

自己自定義一個安裝檔案夾,然后下一步安裝即可,

安裝完成后點擊進入VS Code軟體,安裝漢化包和C編譯庫即可,最后重新啟動軟體,如下圖所示,

② 打開工程檔案及編譯工程
先打開檔案選單欄,并選擇打開檔案夾按鈕,



打開終端,開啟window的cmd視窗,


這里我說明一下,VS Code一開始打開默認的視窗是Power Shell的,改為上圖選擇的即可,然后左邊的終端視窗就會自動到SDK根目錄上,然后工程編譯我就不說了,和在window的cmd操作是一樣的,
驅動程式開發
一、工程框架創建
1) 什么是任務
在OS中任務其實就是執行緒,它是由利用定時間的中斷機制而制造的時間片輪回機制,而這個輪回機制在RTOS和非RTOS是不一樣的,對于RTOS是每一個任務執行的時間都是相同的,實時性很強和對于非RTOS是每一個任務執行的時間是不一定相同的,總而言之就是任務按優先級進行輪回呼度,期間回使用堆疊進行保護現場,
2) 新建工程及創建工程任務框架
首先先建立工程源檔案xxx.c檔案,我這里是在simcom_demo檔案夾下建立的源檔案,如下圖所示

新建了工程檔案后,我們要告訴編譯器我們新建了工程檔案才能進行對我們新建的驅動程式進行編譯操作,而這個編譯腳本叫Makefile,在linux作業系統中基本每一個檔案夾下有要編譯的源檔案就會有Makefile檔案,添加的操作如下圖所示

這里提供一些官方的對Makefile的解釋:一個工程中的源檔案不計其數,其按型別、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規則來指定哪些檔案需要先編譯,哪些檔案需要后編譯,哪些檔案需要重新編譯,甚至于進行更復雜的功能操作,因為 makefile就像一個Shell腳本一樣,也可以執行作業系統的命令,
如果你不想在simcom_demo檔案夾下新建新工程,你可以參考:
A76xx_Series_Open_SDK_用戶開發與DEMO使用指南_V1.00.01.pdf檔案,
如果你的工程很大,要定義很多宏定義、結構體等需要用到自定義頭檔案,那么你可以在\sc_app\simcom_lib\inc目錄下新建頭檔案xxx.h,之后在新建的源檔案添加該頭檔案即可,
好了,工程創建好了,現在撰寫任務框架,如下圖所示

最后將新建的工程主函式添加到真正最開始運行入口的主函式體內,

到這里將整個工程保存->編譯->生成韌體包->燒錄->運行即可,
二、通過串口接收資料和發送資料
1) 使用訊息佇列對串口資料進行接收
①訊息佇列的官方解釋
“訊息”是在兩臺計算機間傳送的資料單位,訊息可以非常簡單,例如只包含文本字串;也可以更復雜,可能包含嵌入物件,訊息被發送到佇列中,“訊息佇列”是在訊息的傳輸程序中保存訊息的容器,訊息佇列管理器在將訊息從它的源中繼到它的目標時充當中間人,佇列的主要目的是提供路由并保證訊息的傳遞;如果發送訊息時接收者不可用,訊息佇列會保留訊息,直到可以成功地傳遞它
②使用訊息佇列對串口資料進行接收
這好處在與直接使用串口接收函式,接收列印資料會存在延時比較大,但是用于訊息佇列存在的延時可以忽略不記,其中我也不知道,親身測驗得出的結論,
撰寫程式步驟,如下圖所示
先定義一個訊息佇列,

其次讓這個定義的訊息佇列先創建起來(程式運行是在主執行函式運行先的),這樣后面運行程式保存的資料才能放入訊息佇列中,不然沒創建佇列沒地方放,

然后定義一個快取變數,目的就是將訊息佇列接收的資料放入快取變數中,

最后就是定義使用訊息佇列接收資料并使用串口列印出來接收到的資料任務和寫使用訊息佇列接收資料并使用串口列印出來接收到的資料任務函式了并在主執行函式中創建這個任務,進行任務調度運行,

這里多說兩句,呼叫sAPI_MsgQRecv函式將接收的訊息佇列資料轉存到自定義訊息佇列optionMsg中,我們取串口資料一定要判斷訊息佇列的id,是我們想要的串口1的資料才將其資料保存到我們定義的快取BUF里面,



③使用訊息佇列串口收發實驗現象

2) 普通串口資料進行接收
①普通串口收發任務函式撰寫
這里就不在重復說怎么定義任務和創建任務了,直接貼任務函式了,

②普通串口收發實驗現象

3) 串口初始化和串口與訊息佇列聯合講解
第一步 串口引數初始化

第二步 撰寫訊息佇列發送訊息的功能函式

第三步 撰寫串口接收的資料存放到訊息佇列中并發送訊息佇列資料

第四步 將串口接收函式這個回呼函式注冊使能

大家會問這里沒使用任務調度這些接收和發送函式,那它們怎么一直輪詢接收串口資料或發送訊息佇列的訊息呢?這里sAPI_UartRegisterCallback這個API函式就是一個任務來的,我們可以看成sAPI_UartRegisterCallback->UartCBFunc->sendMsgToUIDemo,這樣大家就很清晰了,無論是訊息佇列發送訊息函式還是串口接收函式都參與了任務中調度的,
三、GPIO操作
1) API手冊上GPIO埠函式描述

在API手冊上對GPIO介面函式描述中,那么就很清晰知道GPIO的配置操作了,
在學STM32的時候配置GPIO的步驟是:定義配置GPIO的結構體->將配置資訊填入結構體->使用結構體呼叫初始配置函式初始化GPIO->控制GPIO,
然而在這API函式中我們也可以這么使用,配置程序:定義sApi_GpioConfig這個API函式需要的結構體->將配置資料填入結構體->呼叫sApi_GpioConfig這個API函式將填寫好的結構體進行GPIO初始化->最后控制GPIO(如:sAPI_GpioSetValue或者sAPI_GpioGetValue),
2) 呼叫API函式對GPIO初始化以及控制(程式)
這里直接講解GPIO配置及控制的任務函式

這里我只演示了GPIO輸出的demo程式,,
若是配置輸入的話,將配置的方向寫成輸入模式、配置上下拉模式(具體看你硬體)、輸出電平配置為0即可,
若是想使用輸入中斷觸發的話,在上面輸入模式配置之下加多如下圖程式即可,


中斷配置函式作用就是檢測哪個GPIO,以(上升沿、下降沿、雙邊沿)觸發方式觸發中斷,然后進入中斷符合函式進行別的操作,
板子上的燈亮了,圖略
四、ADC模擬電壓采集
1)A7670C 4G模組關于ADC一些官方資訊

2)ADC采集任務函式撰寫(程式)

3)ADC采集實驗現象

五、RTC實時時鐘
1)RTC實時時鐘的時間設定和獲取的API函式講解
①sAPI_RtcSetAlarm(t_rtc *rtcSetTime):
這個API函式是設定RTC時間的,
②sAPI_RtcGetAlarm(t_rtc *rtcSetTime):
這個是API函式獲取RCT時間的,
③注意點:
我們獲取和設定都是通過過t_rtc這個結構體進行操作的,

它是由秒、分、時、日、月、年、周元素構成的,因此要先定義該結構體并將定義的結構體每個元素配置好然后再呼叫API設定RTC時間,
2)RTC實時時鐘任務函式撰寫(程式)
這里我先說一下使用串口輸入選擇運行不同的功能函式結構,如下圖程式:

撰寫程式步驟:如下圖所示
先定義需要呼叫API函式是使用的時間結構體,然后再定義保存時間的快取
設定RTC時間

這里可能會說設定的時間錯誤(如13月),呼叫API會報錯嗎?如下圖我做的實驗:


獲取RTC時間

3)RTC實時時鐘實驗現象

六、Flash閃存
1) Flash閃存擦除、寫入和讀取的API函式講解
① sAPI_EraseFlashSector(unsigned int offset, unsigned int size):
用于擦除Flash的,
② sAPI_WriteFlash(unsigned int offset, char *buff, unsigned int size):
用于資料寫入Flash的,
③ sAPI_ReadFlash(unsigned int offset, char *buff, unsigned int size):
用于讀出Flash資料的,
④ 注意點:
Simcom A7670C_FASL模組的Flash大小是256K,每一個扇區(或者叫塊)是4K的,所以我們對該Flash做讀寫操作的話需要以4位元組對齊,起始地址是0開始的,
2) Flash閃存任務函式撰寫(程式)
擦除Flash閃存資料


讀出Flash閃存資料

3) Flash閃存讀、寫、擦除實驗現象

七、MQTT
1) 標準MQTT連接阿里云物聯網平臺呼叫的API函式
這里API函式的引數我就貼出來了,在代碼中附件說明,
① sAPI_MqttStart:
用于開啟MQTT服務,引數設定-1,無urc結果碼回傳,
② sAPI_MqttAccq:
用于獲取MQTT客戶機,必須在mqtt服務啟動后呼叫,
③ sAPI_MqttConnect:
用于連接MQTT服務器,
④ sAPI_MqttSub:
用于向MQTT服務器訂閱訊息,
⑤ sAPI_MqttTopic:
用于輸入發布訊息的主題,
⑥ sAPI_MqttPayload:
用于輸入發布訊息的訊息體,
⑦sAPI_MqttPub:
用于將訊息發布到MQTT服務器,
2) 標準MQTT連接阿里云任務函式(程式)
第一步:啟動4G模組的MQTT服務,

第二步:將阿里云三要素轉換成標準的MQTT三元組,


第三步:請求MQTT客戶端,注意Simcom A7670C_FASL 4G模組最多允許有兩個MQTT客戶端(分別0和1),也就是可以開啟兩路的MQTT,這里我用的是客戶端1,

第四步:連接MQTT服務器,這里我用的是客戶端1,

第五步:撰寫接收MQTT資料的訊息佇列


第六步:MQTT訂閱主題,這里使用的是客戶端1

第七步:MQTT發布主題,這里使用的是客戶端1
這里我是單獨放在一個執行緒,目的是為了經常上傳資料需要單獨使用一個執行緒,



注意!!!使用兩路MQTT只需要重復二、三、四、六、七步驟即可,第七步的發布主題可以用同一個執行緒,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/328197.html
標籤:其他
下一篇:51單片機與模塊的使用大全教程
