本文将介绍如何从零开始在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源码基础上创建项目:
- 在OneOS源码的projects子目录,鼠标右键“OneOS Cube”,打开命令行窗口;
- 在命令行窗口中,输入project.bat命令并回车,开始创建项目界面;
- 在创建项目界面中,上下移动光标到SUB MODEL回车,进入开发板选择菜单;
- 在开发板选择菜单中,上下移动光标选择stm32f103zet6-atk-elite,按空格选中;
- 按S保存开发板配置,按ESC退出开发板选择界面;
退出前,配置界面如下:
project交互命令执行完成后,将会根据开发板的项目模板创建项目,命令行窗口中会看到一些日志输出,projects子目录中将会创建一个名为 stm32f103zet6-atk-elite 的新目录。
这里我使用的是万藕精英STM32F103开发板,因此选择的是stm32f103zet6-atk-elite。
二、配置项目
2.1 申请高德API Key
高德开放平台:https://developer.amap.com/
按照如下步骤申请高德API Key:
- 注册高德开发者账号;
- 在控制台→应用管理页面,创建新应用;
- 在应用管理页面,为刚刚创建的应用添加Key;
成功申请到的API Key查看如下图所示:
2.2 配置高德云服务组件
按照如下步骤配置高德云服务组件:
- 跳转到stm32f103zet6-atk-elite 子目录下,输入 menuconfig 命令并回车,打开项目配置界面;
- 进入 (Top) → Components→ Cloud→ Amap 配置界面;
- 空格 amap-web-service: Amap web service component,打开高德云服务组件配置;
- 移动光标到 Config Amap web service API Key,回车弹出文本框填入刚刚申请的API KEY;
- 移动光标到 Enable Amap IP location test command,空格启用IP定位服务测试命令;
- 移动光标到 Enable Amap weather info test command,空格启用天气服务测试命令;
- 按S键保存配置,弹出保存路径框,不用修改,保持 .config;
- 按Q键退出;
退出前,配置界面如下所示:
2.3 配置MoLink组件
按照如下步骤配置MoLink组件:
- 继续输入menuconfig命令,打开项目配置界面;
- 进入 (Top) → Components→ Network→ Molink 配置界面;
- 按空格,打开Enable IoT modules suport配置,下方会多出几条配置项;
- 继续进入 Modules → WiFi Modules Support 配置界面;
- 空格打开ESP8266 打开配置后,进入ESP8266 Config配置界面;
- 光标默认在 Enable ESP8266 Module Object Auto Create,空格启用该选项;
- 下方会多出一个选中的 Enable ESP8266 Module Auto Connect 选项;
- 这样会在启动时,自动创建module,并根据配置连接WiFi热点;
- 移动光标到 ESP8266 Interface Device Name,回车,修改为uart3;
- 移动光标到 ESP8266 Interface Device Rate,回车,修改为9600;
- 移动光标到 ESP8266 Connect AP SSID,回车,输入实际热点名称,例如test;
- 移动光标到 ESP8266 Connect AP Password,回车,输入实际的热点密码,例如12345678;
- 移动光标到 Enable ESP8266 Module BSD Socket Operates,空格选中;
- 按S保存,Q退出;
退出前,配置界面如下所示:
2.4 配置开发板UART3及相关DMA通道
上一小节中,ESP8266设备选择**配置为uart3。**这是因为万藕精英版STM32F103开发板的uart2默认连接的是RS485串口,不方便连接ESP8266模组。但OneOS项目模板默认没有启用UART3设备,本小节介绍如何为开发板配置UART3设备。
这里假设你已经安装了STM32 CubeMX、Beyond Compare,并且掌握了两个软件的基本操作。
首先,我们要用CubeMX启用UART3功能相关的引脚(可以开发板原理图和芯片手册,选择合适的引脚),以及相关的DMA通道。
按照如下步骤操作,启用开发板UART3及相关的DMA通道:
-
双击打开projects\stm32f103zet6-atk-elite\board\CubeMX_Config子目录的CubeMX_Config.ioc文件(如果成功安装了CubeMX的话,会自当使用CubeMX打开该文件)。
-
弹框提示有新的STM32Cube固件库可用,不用管他,点Continue继续;
-
在Pinout View中,找到PB10,点击,弹出下拉菜单中,选中UART3_TX;
-
类似的,将PB11选为UART3_RX,如下图所示;
-
展开左侧Connectivity菜单,点UART3,中间显示UART配置;
-
Mode选择Asynchronous;
-
Configuration中,点击DMA Settings页签,再点Add添加一条DMA设置;
- Select下拉选择UART3_RX,其他不用修改,如下图所示;
-
点击NVIC Settings页签,勾选USART3 global interrupt的Enabled选项,如下图所示;
-
点击顶栏Project Manager页,点击左侧Code Generator中,勾选Add necessary library files as reference in the toolchain project configuration file;
-
点右上角GENERATE CODE,开始生成代码;
-
代码生成完成后,弹出对话框,点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项目的编译器设置:
- 左侧Project视图里,鼠标右键oneos,弹出“Options for Target ‘oneos’”界面;
- Target标签页,ARM Compiler选择“Use default compiler version 6”;
- 点击中间的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配置。
解决方法:
- 使用menuconfig命令,打开配置界面;
- 按/键,输入SHELL_TASK_STACK_SIZE,搜索该配置项,回车;
- 正常应该可以找到,位于 (Top) → Components → Shell 层级;
- 修改该配置值为8192,回车确认;
- 按S保存,Q退出;
四、下载固件
4.1 修改调试器设置
由于默认情况下生成OneOS Keil项目是ULINK调试器,而我实际使用的是一个基于CMSIS-DAP的DAPLink调试器,因此需要修改项目的调试器配置。
按照如下步骤,在Keil修改OneOS的调试器配置:
- 左侧Project视图里,鼠标右键oneos,弹出“Options for Target ‘oneos’”界面;
- Debug标签页,Use下拉菜单选择“CMSIS-DAP Debugger”(根据实际使用的选择);
- 为了方便调试,最好开启下载后自动复位功能:
- 点刚刚Use下拉右侧的Settings按钮,弹出CMSIS-DAP Cortex-M Target Driver Setup界面;
- Flash Download标签页,勾选“Reset and Run”,点击OK保存配置;
- 点击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)
按照如下步骤配置串口原始数据打印选项:
- stm32f103zet6-atk-elite 子目录,输入 menuconfig 命令并回车,打开项目配置界面;
- 进入 (Top) → Components→ Network→ Molink→ Enable IoT modules support → Tools 配置页;
- 移动光标到 Enable AT module network debug functions,空格选中;
- 按S保存,按Q退出;
退出前,配置界面如下图:
启用该选项后,命令行中将会多出如下命令:
- ifconfig命令,可用于查看当前网络状态;
- ping命令,可用于测试与目标主机之间是否可达;
6.2 使能高德云服务测试命令
按照如下步骤配置高德云服务组件:
- stm32f103zet6-atk-elite 子目录,输入 menuconfig 命令并回车,打开项目配置界面;
- 进入 (Top) → Components→ Cloud→ Amap 配置界面;
- 移动光标到 Enable Amap IP location test command,空格启用IP定位服务测试命令;
- 移动光标到 Enable Amap weather info test command,空格启用天气服务测试命令;
- 按S键保存配置,按Q键退出;
退出前,配置如下图:
启用该命令之后,命令行中会多出几个命令:
- get_location命令,可以用于测试高德IP定位功能;
- get_weather命令,可以用于测试高德天气服务功能;
get_location获取地区码:
get_weather获取实时天气:
get_weather获取预报天气:
6.3 设置串口驱动的接收缓冲区大小
测试过程种发现,有时候ESP8266会丢数据,再OneOS QQ群里大佬的建议下,修改了串口的接收缓冲区到2048之后,可以显著降低丢数据的可能性。
设置方法如下图所示:
6.4 使能打印原始格式AT命令通信数据
如果想查看ESP8266模组和STM32F103之间的通信具体内容,可以打开Molink的“打印原始格式AT命令通信数据”选项。具体操作如下:
- stm32f103zet6-atk-elite 子目录,输入 menuconfig 命令并回车,打开项目配置界面;
- 进入 (Top) → Components→ Network→ Molink→ Enable IoT modules support → Parser 配置页;
- 移动光标到 Enable print RAW format AT command communication data,空格选中;
- 按S保存,按Q退出;
退出前,配置界面如下图:
启用该选项后,主控芯片与ESP8266模组之间的串口通信原始数据可以显示出来,方便定位问题。