STM32 HAL库+ESP8266+机智云

前言

最近在项目中需要使用云平台对接,于是在网上查找了一些资料,发现机智云是一个不错的选择,网上的资料多,而且可以根据mcu生成通信协议代码,仅需要将生成的代码移植到开发好的项目中,即可实现上云。
不过在实际开发中,仍然遇到了一些问题,所以在此处将我的开发心得记录下来。

网上的教程多为20年21年的,与现在的版本有些微差异,机智云生成的模版也和当时的有所不同。
本教程写于2023年11月30日

硬件准备

  • STM32F1x :机智云提供的模版为F103C8,我使用的是F103RC,实际移植中没有任何问题
  • ESP8266 :我使用的是安信可的ESP12F芯片,大家也可以使用其他的ESP01S芯片,只是烧录时有一定的区别,在烧录章节会提到
  • CUBEMX:本文使用的是HAL库开发,机智云提供的103C8模版为基于cubemx创建的hal库代码,如果要使用标准库,选择“其他平台”生成代码即可。
  • USB转TTL:我使用的是CH340,用于烧录机智云固件时,将模块与电脑连接。这里最好选用带有串口的下载器使用,因为烧写固件时,需要用到多个VCC和GND。
  • 串口调试助手:这里推荐使用SSCOM,我一般选择使用XCOM,但是在本项目开发过程中,模块会发送多包数据,XCOM v2.0没有分包功能,使用过程中会很混乱,所以建议使用SSCOM

在这里插入图片描述
在这里插入图片描述

烧录固件

模块选择

我手中有两款ESP8266模块,两块都是安信可的芯片,大家也可以选择非安信可芯片进行尝试。第一块为ESP12F芯片,flash大小为32Mbit,第二块为ESP01S,flash大小为8Mbit。如果想要使用贴片封装,可以选择第一块芯片,如果是直插式选择第二块芯片。
两款芯片的引脚和使用方式没有任何区别,不过在烧录固件时,第二款芯片需要连接EN角,第一款则不用

在这里插入图片描述

在这里插入图片描述

硬件连线

在这里插入图片描述

USB转TTLESP8266
TXRX
RXTX
VCCVCC
GNDGND
GNDIO_0

使用第一块芯片ESP12F只需接入上述引脚即可
如果使用第二块芯片ESP01S,还需接入EN使能

USB转TTLESP8266
TXRX
RXTX
VCCVCC
GNDGND
GNDIO_0
VCCEN

下载固件

进入机智云官网->点击开发者中心->点击下载中心
固件下载地址

在这里插入图片描述
选择GAgent for ESP8266 下载,

下载好后,解压文件
在这里插入图片描述
解压好后会看到上图中的文件,通过记事本打开readme,可以看到各个文件的作用
在这里插入图片描述
简单点说,名字中带有combine的文件是打包好后的文件,我们只需要根据模块选择对应的combine包即可,我手中的安信可ESP12F模块flash为32Mbit
在这里插入图片描述

下载烧录软件

下载好固件之后,还需要将固件烧录到ESP8266上,这里使用乐鑫官网提供的flash烧录工具flash_download_tool_3_9_5
在这里插入图片描述

双击打开烧录软件,会先出现黑框,等待一会儿,会出现中间的白色框
在这里插入图片描述
点击OK,即可进入烧录界面
在这里插入图片描述
根据上图进行选择并烧录固件,除了第一步和第四步需要根据自己的模块进行选择,其他都不变。我手中的两块模块一个是32Mbit,一个是8Mbit。如果烧录到最后显示失败,建议更换其他flash大小的固件包和SPI MODE,多进行尝试烧录。
注意:如果点击start后,黑色框中显示case OK 后一直在输出…。可以不用在意,重新打开软件或者插拔一下模块即可。
在这里插入图片描述
固件烧录完成后,即可开始进行MCU代码的创建、移植和编写

创建机智云客户端

在创建和移植代码前,我们需要先确定机智云需要显示和控制的相关任务。比如项目需要控制一个LED灯亮灭,需要监控温湿度数据,那么我们就需要先创建一个能控制led灯和显示温湿度数据的页面
打开机智云官网->点击开发者中心并登录
点击创建产品
在这里插入图片描述

这里可以任意选择,我选择的是自定义方案

在这里插入图片描述
输入产品名称,数据传输方式选择定长,然后点击创建

在这里插入图片描述
创建完成后,新建数据点,这里的数据点其实就是刚才说的需要在控制端显示的任务
在这里插入图片描述
输入相应的信息,我们需要控制LED灯,所以读写类型选择可写,数据类型是指我们发送到MCU的值是什么类型,这里选择布尔型即可

在这里插入图片描述
再次点击新建数据点
在这里插入图片描述
我们只需要读取温湿度传感器的值,所以读写类型选择只读,数据类型选择数值和数值范围,以及数值的分辨率

注意:该步骤的前提是项目已经开发完成,所需要的功能都已确定,否则后续任意更改,都需要重新移植代码
创建完成后,我们可以进行虚拟设备调试,查看控制端是否和我们想要的一致
在这里插入图片描述
点击虚拟设备,下载机智云demo APP然后扫码即可关联上手机,我们可以通过手机app控制LED灯的开关,同时web端此时为一个虚拟设备,可以调整温湿度的值,在手机上进行查看
保持虚拟设备网页端,手机app扫码后即可看到有虚拟设备

在这里插入图片描述
点击设备,然后控制LED开关,此时可以在网页端看到虚拟设备进行了响应
同时,在虚拟设备上控制温湿度传感器的值,也会发送到手机app端

在这里插入图片描述
在这里插入图片描述
注意:此时手机app端的该设备为网页端的虚拟设备,仅仅是作为调试UI使用。之后移植完成代码后,会与ESP8266连接,此时会出现一个新的设备信息来控制MCU

生成代码

确认无误后,即可生成MCU代码,移植代码后,即可通过手机app端与设备进行通信
在这里插入图片描述
点击MCU开发,选择硬件平台。
首先,确认项目的开发方式是标准库还是HAL 库,如果是标准库,只能选择其他平台。我使用的是HAL库,同时也是F1x的板子,所以我选择F103C8。输入PS码后即可点击生成项目代码。
标准库的移植,网上已经有很多的教程了。此处我就只展示HAL库的代码移植。

生成后,将模版例程下载下来
在这里插入图片描述

代码移植

下载解压后,可以看到生成的代码就是一个基于cubemx的项目工程
如果你手上的板子正好是F103c8,那么可以选择将工程代码移植过来

如果要移植到其他型号的开发板,第一步,将模版工程文件夹中Gizwits、Utils、Hal三个文件夹拷贝到自己的项目工程中
在这里插入图片描述
打开自己的keil项目工程,将三个文件夹中的文件添加进工程中去,HAL文件夹下只需要用到HAL_KEY.c,HAL_FLASH.c可以不添加,你也可以不用拷贝HAL文件夹,只拷贝HAL_KEY.c和HAL_KEY.h即可

在这里插入图片描述
添加好后,记得添加头文件路径,编译一下。
注意:机智云代码需要用到两个串口和一个定时器,串口至少需要一个。模版中USART1用于打印信息,USART2用于MCU与ESP8266通信,定时器TIM2进行1s的计时
如果不需要打印信息,USART1可以不用设置,不会影响到功能实现。USART2波特率必须设置为9600,并开启中断。定时器TIM2计时1s,并开启中断
这里的串口和定时器可以根据自己项目的实际资源情况进行更改,比如可以将USART2打印数据,USART3用与和ESP8266进行通信,定时器也可以选择TIM7进行1s的计时
现在打开项目工程的CUBEMX,设置串口和定时器,这里可以同时将模版工程中的cubemx配置打开,对比着模版中串口和定时器的配置,对项目工程进行修改。

在这里插入图片描述
串口配置上面已经说得很清楚了,定时器的配置需要根据板子的频率,设置为1s计时即可。比如我的板子是72MHz,预分频系数为7200-1,计时周期为10-1。设置好后,记得打开定时器中断。

除了上面说到的两个串口和定时器,为了实际演示,我在这里还设置了两个LED灯和两个按键。
按键的作用是为了设置ESP8266的模式,这和前文中的HAL_KEY.c有关,个人建议还是需要配置两个按键,如果不需要按键的话,可以屏蔽掉代码中按键相关的部分,不会影响功能的运行。

在这里插入图片描述

修改串口和定时器

配置好后,点击生成代码,在keil里面编译一下
由于我更改了定时器和串口,我们从模版工程中拷贝过来的文件会显示报错。
找到报错的地方。具体更改的有USART1改为USART3 TIM2改为TIM7
所以将gizwits_product.c中的TIM2改为TIM7 USART1改为USART3
在这里插入图片描述
在这里插入图片描述

初始化

修改好之后,我们要想正常使用,还需要在main函数中去初始化和调用相应的函数
打开模版工程,查看main.c中的代码。
机智云生成的项目模版是basic的,外设文件不会单独生成.c和.h文件
所以模版中main.c里面有一些声明和外设初始化,我的工程一般都是advanced,所以模版中有些东西不必添加到自己项目里
在这里插入图片描述

需要将下图中标志的部分添加到自己项目的main.c中,比如头文件
同时一些函数声明变量声明不必添加
在这里插入图片描述
添加完头文件后,往下翻可以看到/* USER CODE BEGIN 0 /到/ USER CODE END 0 /之间有按键KEY的相关初始化代码,将这部分复制到自己的项目工程中去。如果你不使用按键,可以不必添加
在这里插入图片描述
再往下看就是main函数内的内容,将中断初始化函数和机智云代码的初始化函数添加到自己工程的main函数中
这里的中断初始化函数MX_NVIC_Init();在模版工程main函数的下方可以找到,找到之后可以放在按键初始化函数的下面也就是/
USER CODE BEGIN 0 /到/ USER CODE END 0 */之间

在这里插入图片描述
gizwitsSetMode(WIFI_AIRLINK_MODE);函数用于在上电时将esp8266设置为AIRLINK模式,此处建议屏蔽掉,不然每次单片机复位时,需要重新配网。
屏蔽掉后,可以使用按键进入为airlink模式
在这里插入图片描述
初始化完毕之后,还需要在while循环中调用两个函数
这两个函数用于发送和接受消息

在这里插入图片描述

自定义数据传输

到此,整个工程代码已经移植完毕,但是现在的代码只是一个框架,我们还没有去写接收处理函数和发送函数
其实这两个函数,在上面的代码中已经完成,我们只需要在相关的代码中填写上我们需要传输的数据即可

打开gizwits_product.c 找到gizwitsEventProcess函数,在里面可以看到我们编写的LED任务,根据提示,写上LED灯的控制代码

gizwitsEventProcess函数就是用来作为接收数据并处理的函数,我们在制作客户端时,只添加了LED这个控制任务,所以这里只有这一个任务。如果想要添加任务,则需要重新生成模版代码,并重新移植。所以代码移植的前提一定是项目已经完成。
在这里插入图片描述
再往下翻可以看到userHandle函数,这里就是我们要发送的数据,比如我要发送aht10监测的值,将变量赋值进去即可
下方userInit用于设置初始值
在这里插入图片描述

实际展示

代码移植到此结束,接下来就是连接好硬件,打开串口调试助手SSCOM查看是否成功
打开串口调试助手,复位mcu时,会看到固件的软件版本信息,这一步显示成功,说明串口打印没有问题,然后会每隔1s打印一包数据,这一步成功说明mcu与esp8266通信没有问题
长按KEY2,进入airlink模式,此时进行手机配网操作

机智云配网操作

请添加图片描述
配网成功后,手机app端会出现一个局域网在线的设备,且串口调试助手上会出现RSSI的字样,如果配置成功,那么后面的数字不为0,为0说明配网失败
注意:这里要多试几次,不要气馁,我也不是每次都能配网成功

效果

机智云实际演示

总结

遇到的问题

  • 将代码添加进工程之后,代码跑不起来,进调试模式查看代码启动后会死在BEAB BKPT 0xAB这里,其原因是因为代码中将printf函数重定义到USART上了。
    解决方法为勾选上MicroLIB
    在这里插入图片描述
  • 不要忘记在main,c中编写和调用中断初始化函数
  • 配网时,只能选择2.4G频段的WiFi网络

整个代码移植完成后,难度并不大,需要注意的地方一个是固件烧录,如果烧录不成功就多烧录几次。然后移植代码后要记得勾选MicroLIB,否则程序跑不起来。再一个就是main函数中要进行中断初始化。

修改后的工程地址
https://download.csdn.net/download/qq_51967985/88583852?spm=1001.2014.3001.5503

  • 22
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

注意沈题!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值