【安信可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:CSDTK4.2 提取码:yc11
2.下载SDK

git clone https://github.com/Ai-Thinker-Open/GPRS_C_SDK.git
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 P R O J 清 除 PROJ 清除 PROJPROJ目录的中间文件
使用 ./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
  1. 下载CSDTK4.2 Linux版本
git clone https://github.com/Ai-Thinker-Open/GPRS_CSDTK.git
  1. 下载SDK
git clone https://github.com/Ai-Thinker-Open/GPRS_C_SDK.git
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最后产生的可烧录文件
includeSDK头文件目录,可以在这里面找需要的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.

在这里插入图片描述

联系方式

  • 技术支持邮箱:support@aithinker.com 有问必回复!
  • 关注“安信可科技”微信公众号,干货多多,第一时间推送!
相关推荐