esp8266 阿里云 arduino_NUCLEO-G071RB通过WiFi与NB连接阿里云

开箱体验

试用背景

去年年初,有新项目要让移动式容器设备的监控数据上云,选型时主要考虑三个系列STM32L0、STM32G0和STM8。最初有意向选用STM32L052RB,主要是为了满足低功耗需求。恰逢G0系列上市,价格亲民,性能却要高很多,但顾虑G0推出不久,生态不够成熟,项目周期又赶得紧,综合考虑,最终采用STM8。但用过之后,发现STM8不适合这个项目,最尴尬的,就是AD采样不准和主频太低,16MHz主频下,无法实现快速的IO翻转。

2019年底,电堂发起了G0试用活动,申请到一块,用来完善一下这个移动式容器设备监控数据上云的项目。配合移远的BC28模块,STM32G0+BC28,实现数据上云。

开箱检验

NUCLEO-64的板子,外形尺寸都差不多,如图。

071971b02f3aaa407ba30c36ae4d6cc8.png
▲ 开发板外观

ac64284d6d4f0fe7a9622f08c9700119.png
▲ 开发板外观

报告组成

之前做过G4的试用,流程是先使用后整理报告,整理报告的时候又重新看了一遍当时设计的手稿,消耗时间长,且要点容易遗忘。本次优化一下试用流程,一边使用,一边记录,把最原始的体验记录下来,以免时间一过,又忘了干净。

试用分为两部分: NUCLEO-G071RB + IOT-AT3080V1.0 + X-NUCLEO-IKS01A2连接阿里云; NUCLEO-G071RB + BC28 + X-NUCLEO-IKS01A2连接阿里云。为什么采用这样的方式,前面学习过L4连接阿里云IoT的教程,当时是在NUCLEO-L4R5ZI上调试的,想先把相应的工程移植到G0上来,实现上行链路打通,之后再将WiFi模块替换为BC28,这样调试起来也会方便。

试用过程

NUCLEO-G071RB通过WiFi连接阿里云

项目的软件框架、IAR工程及文件结构与L4的Demo类似,只是底层将L4的HAL改成了G0的HAL。

一、MCU外设的使用

使用的外设包括:与WIFI扩展板的接口、与传感器扩展板的接口、虚拟串口接口、USER按键接口和LED等。下面将NUCLEO-L4R5ZI接口与NUCLEO-G071RB接口做一个对比展示,方便后续移植时对比参考。

1、与WIFI扩展板的接口

80ee6c543fa5a346927569094b83b9d8.png

2、与传感器扩展板接口定义

215b4d40525c7878e52ffbe4de756913.png

3、虚拟串口接口

4fd1f63bb9d72981fae6ecd62245f716.png

4、按键与LED灯

c16240f33a03e1f42f8c56ae09dff334.png

同时,Systick提供系统延时,并未Paho协议栈提供Timer。

二、使用CubeMx生成原始工程

CubeMx生成原始工程的过程不详述,按照2.1.1的外设配置,配置对应的引脚、接口即可。系统主频配置为64MHz,TIM2_PWM控制灯以0.5s间隔闪烁,故预分频为:1280-1;分频后计数时钟为50KHz,自动重载寄存器值为50000-1,捕获/比较寄存器值为25000。配置界面如下:

b4bfc4f75537e307f9e111eeb4b0c982.png
▲ TIM2配置界面

三、软件移植与调试

移植Paho MQTT协议栈、移植mbedtls,调试温湿度传感器,适配Paho MQTT的过程在L4的教程中有详细描述,从L4上将代码移植到G0上,主要是Flash读写有写不一样。L4是双bank的Flash,Flash的操作较麻烦,相对而言,G0的操作要简单很多,参考SDK中的Flash例程修改flash_l4R.c文件,(路径:STM32Cube_FW_G0_V1.3.0ProjectsNUCLEO-G071RBExamplesFLASHFLASH_EraseProgram),主要是修改FLASH_unlock_erase()函数和FLASH_get_bank()函数,修改后,编译无误。

下载调试过程,没有想象中那么顺畅,输入wifi信息时,一切正常,连接wifi也正常,但输入三元组信息,一直报错:

Error erasing at 0x08018000

调试①:Wifi信息用默认的,软件执行到三元组保存的位置,仍然同样的错误。数据是保存的同一个位置的,应该不是Flash函数读写的问题。

调试②:注释掉net_if_init()函数中wifi信息获取相关代码,即不运行wifi信息获取及wifi初始化过程,只运行三元组信息保存的过程,保存正确;

调试③:重新开启wifi初始化过程,用已经设置正确的参数配网、连接阿里云,软件运行正常;可以在云端看到上报的数据。

这进一步证明三元组保存的相关函数,是没有问题的,但为何加上wifi配置相关的代码后,会影响三元组信息保存呢,单步调试发现,当运行到EMW3080_GetVersionInfo()函数的*temp=0时,FLASH的SR寄存器的BIT CFGBSY就会置位,进一步排查发现,执行完temp = strstr(Token, ",")后,没有查到到“,”,temp为0x00,此时给地址0x00的位置赋值,导致FLASH的SR寄存器的BIT CFGBSY置位。

8d0ace5b0d3bfd1d2840232df09988f0.png

617f6b3b31ebade8587b4b7cc37f41fb.png

解决方法:判定temp值,如果不为空,才执行赋值操作,如下图示:

861648404a537f1a5d28a15aec9158ad.png

问题到这里已经完美解决了,指针跑飞,导致运行异常。那为什么在L4的板子上没有出现这个问题呢?(具体的表现:执行完EMW3080_GetVersionInfo()函数后,三元组信息及后续的Flash保存操作都无法完成,因为CFGBSY一直为1)

分析L4和G0的HAL_FLASHEx_Erase()→FLASH_WaitForLastOperation(),有如此的不同:

ce2064c3021f8fe01149a5f37754645d.png

6768354abec6f2c63c8833a998612cda.png
▲ G0和L4在处理擦除函数时的不同

L4没有CFGBSY位,仿真发现,当执行*temp=0语句时,FLASH状态寄存器并没有发生变化,但这并不能说L4就是没有问题的,给地址为0x00000000的位置写数据0,可能会带来不可预期的结果。

四、Demo演示与现象

正常运行的效果截图,包括云平台日志和终端日志截图。

811b741da05412792cfa7210aa656428.png
▲ 整体效果图

终端日志:

56f32985da3d265060bea391355803c7.png

云端日志:

4133115e3fda06a0eda7d9436ac06e2b.png
▲ 正常数据上报

终端日志:

779580d8fd93d6356480861410ffe037.png

云端日志:

7bad6f488bab337a736638a96f31194b.png
▲ 报警数据上报

终端日志

20996e9505f27ebe903851c1fec088c2.png

云端日志:

f204e78fb3a1325114469d3a745b1b6d.png
▲ 报警数据上报

终端日志:

d5ff4d719c66953b419983ab1c320caa.png

云端日志:

6b61d5a0bf8426295e8717659d32d67a.png
▲ 温度报警门限设置

NUCLEO-G071RB通过NB连接阿里云

在NUCLEO-G071RB通过WiFi连接阿里云基础上,修改网络设备层的相关配置,将WIFI改为NB模组(BC28),外设和CubeMx的原始工程都之相似。

一、软件移植与调试

有NUCLEO-G071RB通过WiFi连接阿里云的基础后,移植过程相对来说简单。Demo运行时,每5s的数据上报是正常的,但是温度异常报警上传后,会导致软件跑飞,分析程序发现,软件是在发送完报警信息,再发送下一条正常上报信息时,发送不成功,触发重新连接,重新连接三次失败后软件跑飞。

重连的机制是有问题的,就算是重连失败,程序也不应该跑飞;经查实,发现网络层操作了一个零指针,增加了防护机制;

导致数据发送失败是跑飞的原因,为何数据会在发送完一条异常报警信息后,在下一次的正常数据帧中报错?我在L4的程序上运行,是正常的,问题肯定是由G0导致的。

742a14a148493015d71f2b0abf17e0ab.png

软件上排查了一大圈,排查的过程就不描述了,最终定位到,在发送完异常报警帧后,NB模块重启了,BC28这个模块有个特点,必须发送AT+CFUN=1后才能响应后续的联网指令,因而网络一直连接不成功。

比较坑的是,买完BC28模组后,在官网上并没有下载到原理图,因而不清楚各个引脚的分配布局(Arduino接口的UART、供电是固定的,所以调试还是没有问题的),找店家询问也一直没有响应,最终,通过前项目的FAE拿到了原理图,发现用于报警状态指示的LED灯(PA5),连接到了Arduino接口的D13上,而在BC28的板子上,D13是RESET引脚,当发送完报警信息后,会控制LED状态变化,此时就相当于复位了BC28!禁用掉点灯相关操作,问题解决。

关于这个调试,前后忙活了两个礼拜(当然只有下班和周末零碎的时间弄),开始一直怀疑是软件移植带来的bug,拼命的查软件问题,弄错了方向。

二、Demo演示与现象

714484a90a0cc67d6b0b8f38eb43d52b.png
▲ 整体效果图

Demo运行效果,云平台日志与NUCLEO-G071RB通过WiFi连接阿里云相似,终端日志如下:

4eef1a4253875ee7df8c08334a45466e.png
▲ 正常数据上报

c6e3b164823f907439418932db75f503.png
▲ 报警数据上报

总结

整体说来,本次试用还算比较顺利,除了移植3080B、BC28外,还尝试移植了ESP8266的驱动,STM32G0无论是速度还是外设资源,都要比8位机强大的多。将云连接移植到G0上实现还是有意义的,G0比其他系列更有性价比,也能跑起Paho等轻量级的协议栈。在以后的应用中,采用G0上云的方案会更有用武之地。

点击链接观看更多相关课程:

电堂科技​c.51diantang.com

571e62b6e4ffafa5e0044247a3209a80.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“云上金融,智创未来” 腾讯“云+未来”峰会金融专场在广州举行

5月24日,腾讯“云未来“峰会金融专场在广州举行。来自央行、腾讯公司以及银行、证券、保险、互金公司等腾讯金融云的合作伙伴代表以及行业专家,共同分享了智慧金融、企业数字化转型、腾讯金融云业务布局以及与合作伙伴取得的最新成绩等话题。活动现场&am…

Spark算子reduceByKey深度解析

原文地址:http://blog.csdn.net/qq_23660243/article/details/51435257 -------------------------------------------- 最近经常使用到reduceByKey这个算子,懵逼的时间占据多数,所以沉下心来翻墙上国外的帖子仔细过了一遍,发现一…

绕固定轴分解_3轴 / 5轴 / 3+2到底是什么......??

一、 什么是32定位加工在一个三轴铣削程序执行时,使用五轴机床的两个旋转轴将切削刀具固定在一个倾斜的位置,32加工技术的名字也由此而来,这也叫做定位五轴机床,因为第四个轴和第五个轴是用来确定在固定位置上刀具的方向&#xff…

启动spark shell

spark集群安装教程:http://blog.csdn.net/zengmingen/article/details/72123717 启动spark shell. 在spark安装目录bin文件夹下 ./spark-shell --master spark://nbdo1:7077 --executor-memory 2g --total-executor-cores 2 参数说明: --master spark…

python发送excel文件_Python操作Excel, 开发和调用接口,发送邮件

接口开发: importflaskimporttoolsimportjson,redisimportrandom server flask.Flask(__name__)#新建一个服务,把当前这个python文件当做一个服务 ip 118.24.3.40passwordHK139bc&*r redis.Redis(hostip,passwordpassword,port6379,db10, decode_res…

go conn 读取byte数组后是否要_【技术推荐】正向角度看Go逆向

Go语言具有开发效率高,运行速度快,跨平台等优点,因此正越来越多的被攻击者所使用,其生成的是可直接运行的二进制文件,因此对它的分析类似于普通C语言可执行文件分析,但是又有所不同,本文将会使用…

Confluence 6 选择一个外部数据库

2019独角兽企业重金招聘Python工程师标准>>> 注意: 选择一个合适的数据库通常需要花费很多时间。同时 Confluence 自带的 XML 数据备份和恢复功能通常也不适合合并和备份有大量数据的数据库。如果你想在系统运行后进行数据合并,你通常需要使用…

python爬取内容乱码_python爬取html中文乱码

环境: python3.6 爬取代码: import requests url https://www.dygod.net/html/tv/hytv/ req requests.get(url) print(req.text) 爬取结果: / _-如上,title内容出现乱码,自己感觉应该是编码的问题,但是不…

前端每日实战:34# 视频演示如何用纯 CSS 创作在文本前后穿梭的边框

效果预览 按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。 https://codepen.io/comehope/pen/qYepNv 可交互视频教程 此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。 请用 chrome, safari, edge 打开观看。…

spark shell中编写WordCount程序

启动hdfs 略http://blog.csdn.net/zengmingen/article/details/53006541 启动spark 略安装:http://blog.csdn.net/zengmingen/article/details/72123717 spark-shell:http://blog.csdn.net/zengmingen/article/details/72162821准备数据 vi wordcount.t…

mysql计算机二级选择题题库_全国计算机二级mysql数据库选择题及答案

全国计算机二级mysql数据库选择题及答案选择题是全国计算机二级mysql考试里的送分题,下面小编为大家带来了全国计算机二级mysql数据库选择题及答案,欢迎大家阅读!全国计算机二级mysql数据库选择题及答案1) 函数 max( ) 表明这是一个什么函数?…

git add 撤销_更科学地管理你的项目,Git 简明教程(二)

修改文件内容上回说到,我们已经成功创建并提交了一个 README.md 文件到 FirstGit 版本库中1、修改文件现在我们更改 README.md 内容2、查看版本库状态该文件夹内右键运行 Git Bash Here执行命令 git statusGit 提示我们的改动还没有 commit,并且它给出了…

Eclipse中Copy Qualified Name复制类全名解决办法

原文链接:http://www.cnblogs.com/zyh1994/p/6393550.html ----------------------------------------------------------------------------------------------- Eclipse中 用Copy Qualified Name复制类全名时 总是这样的/struts1/src/me/edu/HelloAction.java很不…

gitlab 删除分支_如何删除gitlab上默认受保护的master主分支

今天开发在检查代码的时候,发现master分支有问题,现在准备删除此主分支,并且重新提交正确的代码,不过在删除时发现,master分支不能被删除。ps:主分支一般都是线上分支,需要开发确认后并且做好备…

NodeJs 安装

进入官网下载,zip 安装包 https://nodejs.org/en/download/ 解压 配置环境变量到安装目录 cmd 测试 node -v npm -v

SSH秘钥登录服务器

一、查看本机 ssh 公钥,生成公钥 1.通过命令窗口 a. 打开你的 git bash 窗口 b. 进入 .ssh 目录:cd ~/.ssh c. 找到 id_rsa.pub 文件:ls d. 查看公钥:cat id_rsa.pub 或者 vim id_rsa.pub git–查看本机 ssh 公钥&#xff0c…

mysql存入mtr数据_mysql mtr写入数据

selenium 打开浏览器import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebE ...Win8.1安装Visual Studio 2015提示需要KB2919355http://www.microsoft.com/zh-cn/download/details.aspx?id42335 安装说明: 1.若要…

diff git 代码实现_Git 自救指南:这些坑你都跳得出吗?

每天都会写架构师文章,Java技术文章天天更新,感兴趣的点个关注再走呗!Git 虽然因其分布式管理方式,不完全依赖网络,良好的分支策略,容易部署等优点,已经成为最受欢迎的源代码管理方式。但是一分…

Angular CLI 安装

安装Angular 官网的教程,因为国内网络环境原因,访问不了服务器,导致安装失败。 1、先安装NodeJs 安装教程:http://blog.csdn.net/zengmingen/article/details/72650484 2、通过NodeJs中的模块npm 命令行安装 CLI 2.1、设置npm的…

go 写文件_「go」 项目多个文件编程

golang 学习的时候很多sample 讲的都是一个文件的go 文件怎么写,但是现实中不可能所有的实现都写到一个文件里面,按照功能的不同,要么拆分成不同的文件,要么拆分成不同的文件。下面有些个人的经验分享下,如果有问题请指…