【安信可A9G專題①】A9G環境在windows上搭建並編譯,串口打印 Hello GPRS

本系列博客學習由 安信可科技 - 官方博客 技術分享,如有疑問請留言或聯繫郵箱。

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 PROJPROJ 清除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] 有問必回覆!
  • 關注“安信可科技”微信公衆號,乾貨多多,第一時間推送!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章