【STM32F103精英板】使用ESP8266模组和OneOS高德云服务组件实现IP定位和天气预报

本文将介绍如何从零开始在STM32F103开发板上,通过连接ESP8266模组实现WiFi联网,以及使用OneOS高德云服务组件,最终实现根据公网定位当前大概位置,以及获取天气预报。

一、创建项目

如果你已经创建了OneOS项目,则可以跳过本节的内容,继续向下阅读。本节描述的是,还没有创建OneOS项目的情况下所需的操作。

1.1 下载OneOS代码

以使用码云主线代码为例,使用如下命令下载代码:

git clone https://gitee.com/cmcc-oneos/OneOS.git

1.2 安装OneOS-Cube

从OneOS官网,下载中心→工具下载页面:https://os.iot.10086.cn/download/tool

下载OneOS-Cube。

下载完成后,参考官网开发文档→OneOS-Cube环境搭建,完成OneOS Cube鼠标右键菜单添加:

https://os.iot.10086.cn/doc/quick_start/setup_env/oneos_cube.html

或者解压OneOS-Cube压缩包后,直接右击鼠标使用管理员权限运行“_添加右键菜单@以管理员身份运行.bat”,也可以完成鼠标邮件OneOS Cube菜单的添加。

1.3 创建OneOS项目

OneOS源码中,预留了projects目录,可以用于创建项目、存放项目相关文件。

按照如下步骤,在OneOS源码基础上创建项目:

  1. 在OneOS源码的projects子目录,鼠标右键“OneOS Cube”,打开命令行窗口;
  2. 在命令行窗口中,输入project.bat命令并回车,开始创建项目界面;
  3. 在创建项目界面中,上下移动光标到SUB MODEL回车,进入开发板选择菜单;
  4. 在开发板选择菜单中,上下移动光标选择stm32f103zet6-atk-elite,按空格选中;
  5. 按S保存开发板配置,按ESC退出开发板选择界面;

退出前,配置界面如下:

【STM32F103精英板】使用ESP8266模组和OneOS高德云服务组件实现IP定位和天气预报_第1张图片

project交互命令执行完成后,将会根据开发板的项目模板创建项目,命令行窗口中会看到一些日志输出,projects子目录中将会创建一个名为 stm32f103zet6-atk-elite 的新目录。

这里我使用的是万藕精英STM32F103开发板,因此选择的是stm32f103zet6-atk-elite。

二、配置项目

2.1 申请高德API Key

高德开放平台:https://developer.amap.com/

按照如下步骤申请高德API Key:

  1. 注册高德开发者账号;
  2. 在控制台→应用管理页面,创建新应用;
  3. 在应用管理页面,为刚刚创建的应用添加Key;

成功申请到的API Key查看如下图所示:

【STM32F103精英板】使用ESP8266模组和OneOS高德云服务组件实现IP定位和天气预报_第2张图片

2.2 配置高德云服务组件

按照如下步骤配置高德云服务组件:

  1. 跳转到stm32f103zet6-atk-elite 子目录下,输入 menuconfig 命令并回车,打开项目配置界面;
  2. 进入 (Top) → Components→ Cloud→ Amap 配置界面;
  3. 空格 amap-web-service: Amap web service component,打开高德云服务组件配置;
  4. 移动光标到 Config Amap web service API Key,回车弹出文本框填入刚刚申请的API KEY;
  5. 移动光标到 Enable Amap IP location test command,空格启用IP定位服务测试命令;
  6. 移动光标到 Enable Amap weather info test command,空格启用天气服务测试命令;
  7. 按S键保存配置,弹出保存路径框,不用修改,保持 .config;
  8. 按Q键退出;

退出前,配置界面如下所示:

【STM32F103精英板】使用ESP8266模组和OneOS高德云服务组件实现IP定位和天气预报_第3张图片

2.3 配置MoLink组件

按照如下步骤配置MoLink组件:

  1. 继续输入menuconfig命令,打开项目配置界面;
  2. 进入 (Top) → Components→ Network→ Molink 配置界面;
  3. 按空格,打开Enable IoT modules suport配置,下方会多出几条配置项;
  4. 继续进入 Modules → WiFi Modules Support 配置界面;
    1. 空格打开ESP8266 打开配置后,进入ESP8266 Config配置界面;
    2. 光标默认在 Enable ESP8266 Module Object Auto Create,空格启用该选项;
      1. 下方会多出一个选中的 Enable ESP8266 Module Auto Connect 选项;
      2. 这样会在启动时,自动创建module,并根据配置连接WiFi热点;
    3. 移动光标到 ESP8266 Interface Device Name,回车,修改为uart3
    4. 移动光标到 ESP8266 Interface Device Rate,回车,修改为9600;
    5. 移动光标到 ESP8266 Connect AP SSID,回车,输入实际热点名称,例如test;
    6. 移动光标到 ESP8266 Connect AP Password,回车,输入实际的热点密码,例如12345678;
    7. 移动光标到 Enable ESP8266 Module BSD Socket Operates,空格选中;
  5. 按S保存,Q退出;

退出前,配置界面如下所示:

【STM32F103精英板】使用ESP8266模组和OneOS高德云服务组件实现IP定位和天气预报_第4张图片

2.4 配置开发板UART3及相关DMA通道

上一小节中,ESP8266设备选择**配置为uart3。**这是因为万藕精英版STM32F103开发板的uart2默认连接的是RS485串口,不方便连接ESP8266模组。但OneOS项目模板默认没有启用UART3设备,本小节介绍如何为开发板配置UART3设备。

这里假设你已经安装了STM32 CubeMX、Beyond Compare,并且掌握了两个软件的基本操作。

首先,我们要用CubeMX启用UART3功能相关的引脚(可以开发板原理图和芯片手册,选择合适的引脚),以及相关的DMA通道。

按照如下步骤操作,启用开发板UART3及相关的DMA通道:

  1. 双击打开projects\stm32f103zet6-atk-elite\board\CubeMX_Config子目录的CubeMX_Config.ioc文件(如果成功安装了CubeMX的话,会自当使用CubeMX打开该文件)。

  2. 弹框提示有新的STM32Cube固件库可用,不用管他,点Continue继续;

  3. 在Pinout View中,找到PB10,点击,弹出下拉菜单中,选中UART3_TX;

  4. 类似的,将PB11选为UART3_RX,如下图所示;

    【STM32F103精英板】使用ESP8266模组和OneOS高德云服务组件实现IP定位和天气预报_第5张图片

  5. 展开左侧Connectivity菜单,点UART3,中间显示UART配置;

  6. Mode选择Asynchronous;

  7. Configuration中,点击DMA Settings页签,再点Add添加一条DMA设置;

    1. Select下拉选择UART3_RX,其他不用修改,如下图所示;

    【STM32F103精英板】使用ESP8266模组和OneOS高德云服务组件实现IP定位和天气预报_第6张图片

  8. 点击NVIC Settings页签,勾选USART3 global interrupt的Enabled选项,如下图所示;

    【STM32F103精英板】使用ESP8266模组和OneOS高德云服务组件实现IP定位和天气预报_第7张图片

  9. 点击顶栏Project Manager页,点击左侧Code Generator中,勾选Add necessary library files as reference in the toolchain project configuration file;

  10. 点右上角GENERATE CODE,开始生成代码;

  11. 代码生成完成后,弹出对话框,点Close关闭,继续关闭CubeMX;

这里CubeMX修改配置、生成代码之后,CubeMX_Config子目录下会部分:

  • 多出一个MDK-ARM,OneOS项目用不到,不用关注;
  • Src子目录中的部分文件会更新,可以通过git status查看是哪些文件,使用 git diff 查看变更情况;

然后,需要修改projects\stm32f103zet6-atk-elite\board\peripherals.c文件,添加uart3和dma_usart3_rx的HAL设备定义。

具体添加的代码内容如下(和uart2、hdma_usart2_rx类似):

extern UART_HandleTypeDef huart3;
OS_HAL_DEVICE_DEFINE("UART_HandleTypeDef", "uart3", huart3);

extern DMA_HandleTypeDef hdma_usart3_rx;
OS_HAL_DEVICE_DEFINE("DMA_HandleTypeDef", "dma_usart3_rx", hdma_usart3_rx);

至此,UART3及相关DMA配置完成。

三、编译项目

3.1 生成Keil项目

CubeMX命令行中,跳转到projects\stm32f103zet6-atk-elite子目录后,使用如下命令生成Keil项目文件:

scons --ide=mdk5

这个命令会以template.uv* 为模板,生成 project.uv* 文件。

3.2 编译Keil项目

使用Keil打开project.uvprojx文件。

可以直接点击“Build”图标进行编译。

3.3 修改编译器设置

由于我用的是 Keil μVision V5.37.0.0 ,里面带的编译器是 armclang V6.18,直接编译有如下报错:

Build started: Project: project
*** Target 'oneos' uses ARM-Compiler 'Default Compiler Version 5' which is not available.
*** Please review the installed ARM Compiler Versions:
   'Manage Project Items - Folders/Extensions' to manage ARM Compiler Versions.
   'Options for Target - Target' to select an ARM Compiler Version for the target.
*** Build aborted.
Build Time Elapsed:  00:00:01

因此需要修改编译器配置。

按照如下步骤,在Keil中修改OneOS项目的编译器设置:

  1. 左侧Project视图里,鼠标右键oneos,弹出“Options for Target ‘oneos’”界面;
  2. Target标签页,ARM Compiler选择“Use default compiler version 6”;
  3. 点击中间的OK按钮,确认修改;

这样项目的编译器设置就修改完成了。

3.4 解决编译问题

再次编译,又有如下报错:

Build started: Project: project
*** Using Compiler 'V6.18', folder: 'd:\Keil_v5\ARM\ARMCLANG\Bin'
Build target 'oneos'
ArmClang: error: unsupported option '--gnu'; did you mean '-fgnu'?
compiling http_application_api.c...
ArmClang: error: unsupported option '--gnu'; did you mean '-fgnu'?
compiling http_client.c...
ArmClang: error: unsupported option '--gnu'; did you mean '-fgnu'?
compiling http_form_data.c...
ArmClang: error: unsupported option '--gnu'; did you mean '-fgnu'?
compiling http_oneos_wrapper.c...
".\build\keil\Obj\project.axf" - 4 Error(s), 0 Warning(s).
Target not created.
Build Time Elapsed:  00:00:05

简单直接的解决方法是,使用文本编辑器打开project.uvprojx文件,找到 --gnu 所在行之后,整行删除,保存即可;

更好的解决方法是,在项目中用grep搜索到 --gnu 所在的SConscript文件,将其删除;

再次编译,又有如下报错:

Build started: Project: project
*** Using Compiler 'V6.18', folder: 'd:\Keil_v5\ARM\ARMCLANG\Bin'
Build target 'oneos'
compiling http_application_api.c...
../../components/net/protocols/http/httpclient-v1.1.0/oneos/http_oneos_wrapper.c(31): error: "SHELL_TASK_STACK_SIZE need more than 7168 bytes if use httpclient components in shell"
#error "SHELL_TASK_STACK_SIZE need more than 7168 bytes if use httpclient components in shell"
 ^
1 error generated.
compiling http_oneos_wrapper.c...
compiling http_form_data.c...
compiling http_client.c...
".\build\keil\Obj\project.axf" - 1 Error(s), 0 Warning(s).
Target not created.
Build Time Elapsed:  00:00:07

提示SHELL_TASK_STACK_SIZE太小了,这次需要修改SHELL_TASK_STACK_SIZE配置。

解决方法:

  1. 使用menuconfig命令,打开配置界面;
  2. 按/键,输入SHELL_TASK_STACK_SIZE,搜索该配置项,回车;
  3. 正常应该可以找到,位于 (Top) → Components → Shell 层级;
  4. 修改该配置值为8192,回车确认;
  5. 按S保存,Q退出;

四、下载固件

4.1 修改调试器设置

由于默认情况下生成OneOS Keil项目是ULINK调试器,而我实际使用的是一个基于CMSIS-DAP的DAPLink调试器,因此需要修改项目的调试器配置。

按照如下步骤,在Keil修改OneOS的调试器配置:

  1. 左侧Project视图里,鼠标右键oneos,弹出“Options for Target ‘oneos’”界面;
  2. Debug标签页,Use下拉菜单选择“CMSIS-DAP Debugger”(根据实际使用的选择);
  3. 为了方便调试,最好开启下载后自动复位功能:
    1. 点刚刚Use下拉右侧的Settings按钮,弹出CMSIS-DAP Cortex-M Target Driver Setup界面;
    2. Flash Download标签页,勾选“Reset and Run”,点击OK保存配置;
  4. 点击OK保存配置;

4.2 连接调试器

这里需要参考开发板原理图,以及你的调试器实际的引脚情况。将调试器一端连接到PC,另一端连接到开发板的JTAG调试口。

4.3 下载到开发板

连接好调试器后,就可以烧录了。使用Keil的Download图标,或者F8快捷键,开始烧录。

五、准备模组

5.1 模组固件下载

安信可AT固件: https://docs.ai-thinker.com/固件汇总

版本:v1.7.1.0 AT Firmware

5.2 模组固件烧录

乐鑫官网,支持→相关下载→工具→Flash 下载工具:https://www.espressif.com.cn/zh-hans/support/download/other-tools

六、调试与测试

为了方便调试和测试,可以打开一些配置项,下面分别介绍。

6.1 使能网络调试命令(ifconfig、ping)

按照如下步骤配置串口原始数据打印选项:

  1. stm32f103zet6-atk-elite 子目录,输入 menuconfig 命令并回车,打开项目配置界面;
  2. 进入 (Top) → Components→ Network→ Molink→ Enable IoT modules support → Tools 配置页;
  3. 移动光标到 Enable AT module network debug functions,空格选中;
  4. 按S保存,按Q退出;

退出前,配置界面如下图:

【STM32F103精英板】使用ESP8266模组和OneOS高德云服务组件实现IP定位和天气预报_第8张图片

启用该选项后,命令行中将会多出如下命令:

  • ifconfig命令,可用于查看当前网络状态;
  • ping命令,可用于测试与目标主机之间是否可达;

6.2 使能高德云服务测试命令

按照如下步骤配置高德云服务组件:

  1. stm32f103zet6-atk-elite 子目录,输入 menuconfig 命令并回车,打开项目配置界面;
  2. 进入 (Top) → Components→ Cloud→ Amap 配置界面;
  3. 移动光标到 Enable Amap IP location test command,空格启用IP定位服务测试命令;
  4. 移动光标到 Enable Amap weather info test command,空格启用天气服务测试命令;
  5. 按S键保存配置,按Q键退出;

退出前,配置如下图:

【STM32F103精英板】使用ESP8266模组和OneOS高德云服务组件实现IP定位和天气预报_第9张图片

启用该命令之后,命令行中会多出几个命令:

  • get_location命令,可以用于测试高德IP定位功能;
  • get_weather命令,可以用于测试高德天气服务功能;

get_location获取地区码:

【STM32F103精英板】使用ESP8266模组和OneOS高德云服务组件实现IP定位和天气预报_第10张图片

get_weather获取实时天气:

【STM32F103精英板】使用ESP8266模组和OneOS高德云服务组件实现IP定位和天气预报_第11张图片

get_weather获取预报天气:

【STM32F103精英板】使用ESP8266模组和OneOS高德云服务组件实现IP定位和天气预报_第12张图片

6.3 设置串口驱动的接收缓冲区大小

测试过程种发现,有时候ESP8266会丢数据,再OneOS QQ群里大佬的建议下,修改了串口的接收缓冲区到2048之后,可以显著降低丢数据的可能性。
设置方法如下图所示:
【STM32F103精英板】使用ESP8266模组和OneOS高德云服务组件实现IP定位和天气预报_第13张图片

6.4 使能打印原始格式AT命令通信数据

如果想查看ESP8266模组和STM32F103之间的通信具体内容,可以打开Molink的“打印原始格式AT命令通信数据”选项。具体操作如下:

  1. stm32f103zet6-atk-elite 子目录,输入 menuconfig 命令并回车,打开项目配置界面;
  2. 进入 (Top) → Components→ Network→ Molink→ Enable IoT modules support → Parser 配置页;
  3. 移动光标到 Enable print RAW format AT command communication data,空格选中;
  4. 按S保存,按Q退出;

退出前,配置界面如下图:

【STM32F103精英板】使用ESP8266模组和OneOS高德云服务组件实现IP定位和天气预报_第14张图片

启用该选项后,主控芯片与ESP8266模组之间的串口通信原始数据可以显示出来,方便定位问题。

你可能感兴趣的:(STM32,stm32,ESP8266,OneOS,高德天气,高德定位)