**
SIMCOM-4G模组-A7670C_FASL-SOC二次开发 两路MQTT
看不清的同学:
指南文档
本资料仅仅提供学习使用
两路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只需要重复二、三、四、六、七步骤即可,第七步的发布主题可以用同一个线程。