本文将介绍如何从零开始在STM32F103开发板上,通过连接ESP8266模组实现WiFi联网,以及使用OneOS高德云服务组件,最终实现根据公网定位当前大概位置,以及获取天气预报。
如果你已经创建了OneOS项目,则可以跳过本节的内容,继续向下阅读。本节描述的是,还没有创建OneOS项目的情况下所需的操作。
以使用码云主线代码为例,使用如下命令下载代码:
git clone https://gitee.com/cmcc-oneos/OneOS.git
从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菜单的添加。
OneOS源码中,预留了projects目录,可以用于创建项目、存放项目相关文件。
按照如下步骤,在OneOS源码基础上创建项目:
退出前,配置界面如下:
project交互命令执行完成后,将会根据开发板的项目模板创建项目,命令行窗口中会看到一些日志输出,projects子目录中将会创建一个名为 stm32f103zet6-atk-elite 的新目录。
这里我使用的是万藕精英STM32F103开发板,因此选择的是stm32f103zet6-atk-elite。
高德开放平台:https://developer.amap.com/
按照如下步骤申请高德API Key:
成功申请到的API Key查看如下图所示:
按照如下步骤配置高德云服务组件:
退出前,配置界面如下所示:
按照如下步骤配置MoLink组件:
退出前,配置界面如下所示:
上一小节中,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设置;
点击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子目录下会部分:
然后,需要修改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配置完成。
CubeMX命令行中,跳转到projects\stm32f103zet6-atk-elite子目录后,使用如下命令生成Keil项目文件:
scons --ide=mdk5
这个命令会以template.uv* 为模板,生成 project.uv* 文件。
使用Keil打开project.uvprojx文件。
可以直接点击“Build”图标进行编译。
由于我用的是 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项目的编译器设置:
这样项目的编译器设置就修改完成了。
再次编译,又有如下报错:
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配置。
解决方法:
由于默认情况下生成OneOS Keil项目是ULINK调试器,而我实际使用的是一个基于CMSIS-DAP的DAPLink调试器,因此需要修改项目的调试器配置。
按照如下步骤,在Keil修改OneOS的调试器配置:
这里需要参考开发板原理图,以及你的调试器实际的引脚情况。将调试器一端连接到PC,另一端连接到开发板的JTAG调试口。
连接好调试器后,就可以烧录了。使用Keil的Download图标,或者F8快捷键,开始烧录。
安信可AT固件: https://docs.ai-thinker.com/固件汇总
版本:v1.7.1.0 AT Firmware
乐鑫官网,支持→相关下载→工具→Flash 下载工具:https://www.espressif.com.cn/zh-hans/support/download/other-tools
为了方便调试和测试,可以打开一些配置项,下面分别介绍。
按照如下步骤配置串口原始数据打印选项:
退出前,配置界面如下图:
启用该选项后,命令行中将会多出如下命令:
按照如下步骤配置高德云服务组件:
退出前,配置如下图:
启用该命令之后,命令行中会多出几个命令:
get_location获取地区码:
get_weather获取实时天气:
get_weather获取预报天气:
测试过程种发现,有时候ESP8266会丢数据,再OneOS QQ群里大佬的建议下,修改了串口的接收缓冲区到2048之后,可以显著降低丢数据的可能性。
设置方法如下图所示:
如果想查看ESP8266模组和STM32F103之间的通信具体内容,可以打开Molink的“打印原始格式AT命令通信数据”选项。具体操作如下:
退出前,配置界面如下图:
启用该选项后,主控芯片与ESP8266模组之间的串口通信原始数据可以显示出来,方便定位问题。