本系列博客學習由 安信可科技 - 官方博客 技術分享,如有疑問請留言或聯繫郵箱。
文章目錄
A9G 開發環境搭建
一、A9G簡介
A9G 是一個完整的四頻 GSM / GPRS 模塊,它融合 GPRS 和 GPS / BDS 技術,並將其集成在一個緊湊型設計的 SMD 封裝中,大大的節省了客戶開發 GNSS 應用的時間和成本。
A9G 可廣泛應用於各種物聯網場合,適用於家庭自動化、工業無線控制、可穿戴電子產品、 無線位置感知設備、無線定位系統信號以及其它物聯網應用,是物聯網應用的理想解決方案。
A9G 採用 SMD 封裝,可通過標準 SMT 設備實現產品的快速生產,特別適合自動化、大規 模、低成本的現代化生產方式,方便應用於各 種物聯網硬件終端場合。
二、Windows開發環境搭建
1. 注意
重要,請先閱讀
SDK沒有特定的IDE,用戶自己選擇代碼編輯器編輯代碼。
在修改代碼時,一定不能使用windows自帶的記事本和寫字板,請使用更加專業的編輯器(推薦使用如vscode,sublime,atom,eclipse,source insight等,或者其它你熟悉的編輯器。)
比如使用VS Code, 它支持函數跳轉等基本功能(在vscode裏面搜索C/C++插件安裝),多使用搜索功能(側邊欄搜索圖標)會很方便
請修改編輯器設置,文件結尾符號設置爲unix風格((\n)結尾)(設置方法請自行到網絡查找)
如果你是使用git進行克隆,請設置git在pull時不將轉換爲,設置方法參考這裏.
2. 下載工具鏈以及下載調試工具及SDK
1.下載CSDTK4.2:百度雲下載
2.下載SDK
注意: 下載完請檢查platform/csdk文件夾下是否包含debug、release文件夾,沒有說明下載文件不全,請重新下載完整的SDK 如果使用git克隆,因爲工程使用了子模塊,請添加–recursive參數,否則克隆下來的文件不全無法編譯成功
3. 安裝
解壓到某個文件夾,比如C:\CSDTK,路徑請不要帶中文!
運行CSDTk目錄下的config_env_admin.bat文件來設置環境變量
這個腳本做的事情就是新建一個名爲GPRS_CSDTK42_PATH的環境變量,變量值爲CSDTK的目錄路徑。 如果腳本建立失敗也可以自己手動建
4. 編譯
解壓下載到的CSDK爲GPRS_C_SDK文件夾放到某個目錄下,比如C:\GPRS_C_SDK,請使用下劃線(_)而不是減號(-).
進入CSDK文件夾(C:\GPRS_C_SDK),按住shift,在文件夾內空白處鼠標右鍵單擊,選擇cmd打開或者powershell打開,如圖:
使用./build.bat app 或者 build.bat app來編譯工程,測試環境是否可用,如果正常,會出現以下結果:
如果提示NO CSDTK,Please install CSDTK first!,則是環境變量沒有生效(在win7下可能會出現),可以重啓電腦以生效
保證環境可以使用後,就可以在CMD或powershell窗口中使用build.bat腳本來編譯工程,有以下參數:
使用 ./build.bat $PROJ來編譯你的應用模塊,如 ./build.batsh app 則是編譯app目錄下的源碼
使用 ./build.bat demo $PROJ 來編譯demo目錄下的特定例程,比如./build.bat demo gpio
使用 ./build.bat clean PROJ目錄的中間文件
使用 ./build.bat clean all 清除所有中間文件
使用 ./build.bat demo $PROJ release 來生成release版本,比如./build.bat demo gpio release, 如果最後一個參數不是release,則默認是debug版本, debug版本在死機後會停止運行並可以使用GDB調試,而release版本加入了看門狗功能,在死機時會自動重啓系統,所以實際投入使用時請使用release版本以防止出現bug時死機,測試時使用debug版本
比如:
./build.sh demo gpio
進行編譯,編譯會生成一個build目錄,編譯完成會在hex目錄下生成兩個格式爲lod的文件,這就是我們用來下載到開發板的目標文件.
目標文件說明
兩個文件一大一小,在第一次下載時需要下載大文件(_B.lod)即可,第二次和以後爲了減少下載時間都只需要下載小文件(*_flash.lod)即可,更新SDK後需要重新下載大文件.
5. 其它問題
如果遇到問題,請仔細對比文檔,看操作是否有錯,也可以在issue裏找有沒有先例,如果仍然有錯,可以到安信可論壇提問或者github提交issue
方式一:github添加issue
方式二:安信可論壇討論
三、Linux開發環境搭建
1.注意
重要,請先閱讀
SDK沒有特定的IDE,用戶可以選擇代碼編輯器來編輯代碼(例如vscode,sublime,atom,eclipse,Source Insight或其他您熟悉的編輯器。)
請修改編輯器設置。文件符號的末尾設置爲UNIX樣式((\n)結束),文件編碼爲UTF-8.
如果使用git克隆,則將pull處的git設置爲not轉換爲,在這裏設置方法參考。
2.下載工具鏈,調試工具和SDK
下載CSDTK4.2 Linux版本:baidu cloud
下載SDK
或通過git克隆:(需要git clone https://github.com/Ai-Thinker-Open/GPRS_C_SDK.git --recursive注意–recursive,否則編譯文件湖失敗)
檢查C_SDK platform/csdk文件夾,應該有一些文件夾和文件,如果沒有,您可能會以錯誤的方式獲取源代碼,然後再次檢查並下載.
3.安裝
3.1 安裝編譯工具的依賴項
sudo apt install build-essential gcc-multilib g+±multilib libzip-dev zlib1g lib32z1
3.2 安裝coolwatcher的依賴
sudo apt install build-essential libqt4-qt3support itcl3 itk3 iwidgets4
以及最新的ubuntu中的其他兼容庫
sudo apt install libpng12-0 libusb-0.1-4
3.3 CSDTK成立
創建一個項目文件夾,例如 ~/projects
- mkdir ~/projects
解壓縮CSDTK42_Linux.tar.gz到一個文件夾,~/software/CSDTK例如,然後執行setup.sh,第一個參數是CSDTK的位置,第二個參數是項目的位置
cd ~/software
tar -xzvf CSDTK42_Linux.tar.gz
cd CSDTK
./setup.sh ./ ~/projects
3.4 編譯
將下載到GPRS_C_SDK文件夾的CSDK解壓縮到目錄中,例如~/projects/GPRS_C_SDK,請使用下劃線(_)代替減號(-)。
檢查SDK有充分的文件,檢查platform/csdk文件夾,如果沒有debug和release文件夾,你下載了錯誤的SDK文件,請重新下載中發佈頁或克隆的命令git clone https://github.com/Ai-Thinker-Open/GPRS_C_SDK.git --recursive
編譯
cd ~/projects/GPRS_C_SDK
./build.sh demo gpio
如果將GPRS項目放在projects folder(通過命令./setup.sh ./ ~/projects之前設置)中,則可以使用腳本快速進入項目文件夾,如下所示
work GPRS_C_SDK
./build.sh demo gpio
然後,您可以使用./build.sh腳本來構建項目:
./build.sh $PROJ:編譯應用程序模塊,例如:./build.sh app編譯應用程序文件夾的源代碼
./build.sh demo $PROJ:compile demo project,例如:./build.sh demo gpio編譯gpio demo
./build.sh clean $PROJ:清除構建文件 $PROJ
./build.sh clean all:清除所有構建文件
./build.sh demo $PROJ release:build一個發行版本,例如:./build.sh demo gpio release,如果最後一個參數不是release,則默認爲debugversion。GDB在debug版本系統崩潰後可以用來調試錯誤,但是release版本不能,在發行版本中看門狗激活,當系統崩潰時它將自動重啓系統!
例如:
./build.sh demo gpio
build編譯後會生成一個文件夾,該文件夾中有兩個*.lod文件hex,它是目標文件(刻錄到下載板)
關於目標十六進制文件( .lod)
有兩個十六進制文件(_B.lod和*_flash.lod),您必須在第一時間將較大的文件刻錄到開發板,然後可以刻錄一個小文件以減少下載時間。如果您更新SDK版本,則必須下載更大的版本.
4.其他問題
如果遇到問題,請仔細對比文檔,看操作是否有錯,也可以在issue裏找有沒有先例,如果仍然有錯,可以到安信可論壇提問或者github提交issue
方式一:github添加issue
方式二:安信可論壇討論
四、GPRS 下載調試說明
1. 硬件連接
模塊的調試下載接口是HST接口,即引腳HST_RX和HST_TX腳分別連接連接USB轉串口模塊的TX和RX引腳(交叉連接,HST_RX接TX)。
電源可以接鋰電池電壓(即3.8v~4.2v)(VBAT引腳),也可以接5v電源(5v輸入引腳或者USB輸入),需要注意的是,如果使用鋰電池供電,上電後需要按POWER KEY3秒左右讓模塊開機,USB供電則會上電自動開機。 在下載或者調試時要確保已經開機。
2. Linux
安裝依賴
sudo apt install build-essential libqt4-qt3support itcl3 itk3 iwidgets4
創建串口如下鏈接文件,以後你可以在coolwatcher的圖表中有補1中,COM1必須大寫
sudo ln -s /dev/ttyUSB0 comport/COM1
然後雙擊coolwatcher運行軟件
3. 下載步驟
將coolwatcher更新到最新版本(coolwatcher在CSDTK文件夾下)
打開CSDTK/cooltools/coolwatcher.exe
左邊profiles選項選擇8955,右邊需要設置lastcomport爲連接模塊下載調試串口(HST)的端口
點擊Ok
等待連接成功,出現以下界面
如果出現連接失敗的情況,請參考 coolwatcher 無法連接原因部分
如果第一次使用,需要點擊DRY圖標,選擇名字包含8955 ramrun spi32m .lod的文件(在工程platform/ramrun下或者coolwatcher cooltools\chipgen\Modem2G\toolpool\plugins\fastpf\flash_programmers目錄下)。 只需要設置一次,後面都會記住的
點擊下圖中的lod圖標,選擇編譯生成的固件,在工程hex目錄下.lod格式的文件,首次下載下載文件體積較大的.lod格式文件,後面爲了加快下載速度只需要下載體積較小的固件文件即可
點擊 download圖標,進行下載,正常效果如下圖,右下角Command欄會有進度標誌。
五、開始第一份代碼
確保可以編譯代碼、下載固件到GPRS模塊/開發板後,就可以開始瞭解如何寫一份代碼啦~~~~
以下的代碼可以在工程目錄demo/first中找到
作爲第一份代碼,當然是從我們熟悉的hello wold做起呀~~~
所以我們的目標:一個完整的代碼架構,並能不斷間隔打印Hello GPRS即可
1. 目錄
目錄 | 描述 |
---|---|
app | 程序主目錄,應用代碼放在這裏 |
build | 編譯生成的目錄、中間文件 |
demo | 一些例程 |
doc | 相關文檔,Markdown格式 |
hex | 最後產生的可燒錄文件 |
include | SDK頭文件目錄,可以在這裏面找需要的API以及函數、參數註釋 |
init | 系統初始化的目錄,可以不用理會,不建議改動 |
platform | 庫文件等,請確保platform/csdk文件夾不爲空 |
2. 建立文件夾、文件
新建demo/fisrt文件夾,並新建Makefile文件,注意只是首字母大寫,或者全是小寫 填入以下內容:
#Name of the module
LOCAL_NAME := demo/first
#List of submodules which contain code we need to include in the final lib
LOCAL_API_DEPENDS := \
LOCAL_ADD_INCLUDE := include\
include/std_inc \
include/api_inc \
#Set this to any non-null string to signal a module which # generates a binary (must contain a "main" entry point). # If left null, only a library will be generated.
IS_ENTRY_POINT := no
##------------------------------------ #### Add your custom flags here #### ------------------------------------ ##
MYCFLAGS +=
##------------------------------------- #### List all your sources here #### ------------------------------------- ##
C_SRC := ${notdir ${wildcard src/*.c}}
##------------------------------------- ##
##Do Not touch below this line ##
##------------------------------------- ##
include ${SOFT_WORKDIR}/platform/compilation/cust_rules.mk
這裏LOCAL_NAME := demo/first填文件夾路徑,LOCAL_ADD_INCLUDE是包含的頭文件路徑.
新建demo/first/src文件夾,並新建demo_first.c文件.
3. 代碼
代碼可以在工程目錄demo/first/src/demo_first.c中找到
主要要做的事情是:編寫程序入口,並創建主任務,用來接收來自底層的事件,同時建立一個任務,不停打印信息.
3.1. 入口及主任務
程序入口,創建主任務(這裏使用到了操作系統相關的函數,如果沒有接觸過,請不要懼怕,可以先照着做)
#include "stdbool.h"#include "stdint.h"
#include "api_os.h"#include "api_debug.h"#include "api_event.h"
#define MAIN_TASK_STACK_SIZE (2048 * 2)#define MAIN_TASK_PRIORITY 0#define MAIN_TASK_NAME "Main Test Task"
static HANDLE mainTaskHandle = NULL;
void first_Main(void){
mainTaskHandle = OS_CreateTask(MainTask,
NULL, NULL, MAIN_TASK_STACK_SIZE, MAIN_TASK_PRIORITY, 0, 0, MAIN_TASK_NAME);
OS_SetUserMainHandle(&mainTaskHandle);
}
每個程序都有一個入口,這裏的入口是一個函數: void first_Main(void),返回值和參數都是void,下劃線左邊必須是文件夾的名字,這裏是first,下劃線右半邊必須是Main,首字母大寫。
調用OS_CreateTask來創建一個任務,具體參數含義可以見OS部分,這裏先不闡述。調用OS_SetUserMainHandle將剛剛創建的任務指針(句柄)傳給底層,讓底層知道給那個任務發送事件,這個是必須的.
3.2. 主任務處理及打印任務
#define SECOND_TASK_STACK_SIZE (2048 * 2)#define SECOND_TASK_PRIORITY 1#define SECOND_TASK_NAME "Second Test Task"
static HANDLE secondTaskHandle = NULL;
void SecondTask(void *pData){
while(1)
{
Trace(1,"Hello GPRS ");
OS_Sleep(3000);
}
}
void EventDispatch(API_Event_t* pEvent){
switch(pEvent->id)
{
default:
break;
}
}
void MainTask(void *pData){
API_Event_t* event=NULL;
secondTaskHandle = OS_CreateTask(SecondTask,
NULL, NULL, SECOND_TASK_STACK_SIZE, SECOND_TASK_PRIORITY, 0, 0, SECOND_TASK_NAME);
while(1)
{
if(OS_WaitEvent(mainTaskHandle, (void**)&event, OS_TIME_OUT_WAIT_FOREVER))
{
EventDispatch(event);
OS_Free(event->pParam1);
OS_Free(event->pParam2);
OS_Free(event);
}
}
}
主任務MainTask中又新建了一個任務SecondTask,這個任務中做的事情就是每間隔3秒鐘打印一句Hello GPRS,打印信息可以在coolwatcher的tracer工具中看到;
然後主任務阻塞等待來自底層的事件,並在EventDispatch函數中處理,這裏暫時沒有處理任何事件,所有事件可以在api_event.h中找到,每個事件的參數也有註釋
4. 編譯並下載固件看驗證
按照前面的編譯、下載方法下載到開發板運行,打開調試工具可以看到打印的Hello GPRS.
聯繫方式
- 技術支持郵箱:[email protected] 有問必回覆!
- 關注“安信可科技”微信公衆號,乾貨多多,第一時間推送!