STM32 HAL库标准库+ESP8266+机智云

前言

最近在项目中需要云平台对接,前面使用的是阿里云物理平台,具体开发可以看看我的这个文章:手把手教会使用阿里云平台,不过好像没有可以在手机很方便打开连接的,所以我在网上找到一些资料,发现机智云是一个不错的平台,网上的资料很多,而且很方便,可以根据MCU生成代码,代码可以直接使用,其他型号仅需稍微移植一下即可使用,对于新手而言非常友好,在实际开发移植中,还是会遇到很多问题,网上的教程(比如某站的视频)都是多为20和21年的,和现在的机智云平台自动生成的代码还有很多区别的,现在我将我一直成功的开发心得记录下来!手把手教会大家移植!

本教程写于2024年2月20日

资料下载

通过网盘分享的文件:手把手连接使用机智云教程资料
链接: https://pan.baidu.com/s/1BWFQf6hFIx4T99hTkBtlaQ?pwd=74mv 提取码: 74mv 
--来自百度网盘超级会员v4的分享

一、硬件准备

1.1、主要材料准备

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

1.2、ESP8266固件烧录

硬件连线:

RST不用接都可以!

固件下载方式:esp8266固件下载                    

进入机智云官网->点击开发者中心->点击下载中心:

解压后得到: 然后使用烧录软件烧录即可:按照前面的要求接好线,选择esp8266打开设备管理器查看com口:最后点击开始即可

温馨提示:如果点击开始后,进度条一直卡着不动,拔插一下esp8266的3.3V即可

二、创建机智云客户端

在创建客户端之前,我们需要先明确好我们的项目哪些地方需要用到机智云(比如,LED开关灯,温湿度上传,二氧化碳浓度上传。。。。等等),这里我先演示一个最简单的(开关灯),后面再逐步强化。

打开机智云官网 -> 点击开发者中心并登录 -> 点击创建产品:这里可以随便选择,我选择的是自定义方案:

数据传输选择定长,然后点击创建创建完成后,新建数据点,这里的数据点其实就是需要远程的任务输入相应的信息,我们需要控制LED灯,所以读写类型选择可写,数据类型是指我们发送到MCU的值是什么类型,这里选择布尔型即可这里我们就已经完成了项目的功能确认了,然后我们点击虚拟设备,可以提前查看我们的客户端界面是什么样子的

使用手机下载机智云APP后点击左上角扫描电脑左上方的二维码:然后查看

2.1、代码下载

注意:此时手机app端的该设备为网页端的虚拟设备仅仅是作为调试UI使用。之后移植完成代码后,会与ESP8266连接,此时会出现一个新的设备信息来控制MCU,确认后,就可以去生成代码了点击MCU开发,选择硬件平台。
首先,确认项目的开发方式是标准库还是HAL 库,如果是标准库,只能选择其他平台。我使用的是HAL库,同时也是F1x的板子,所以我选择F103C8。输入PS码后即可点击生成项目代码。生成后下载下来使用即可!

后面如果需要加其他数据或者需要控制其他东西的话都是需要重新生成代码的!

三、分析下载下来的代码

下载下来后我们先简单观察里面的代码的基本功能和配置:                                                               我们打开下载下来的代码如果是F103C8型号就是可以直接使用的,如果不是我后面也会详细说移植步骤!我们打开里面的CubeMX工程可以发现:使用机智云需要一个定时器ms级别的中断和两个串口,一个打印信息,一个连接esp8266,还有两个按键(非必要),然后我们点开keil工程,查看main函数里面到底有什么,使用了什么:

/* Initialize interrupts */
    MX_NVIC_Init();//中断优先级配置

    /* USER CODE BEGIN 2 */
    timerInit();//开启定时器中断
    uartInit();//开启串口2接收中断

    userInit();//初始化数据(比如,LED)
    gizwitsInit();//机智云初始化
    keyInit();//按键初始化
		
    GIZWITS_LOG("MCU Init Success , SoftVersion = %s\r\n",SOFTWARE_VERSION);//打印数据
    /* USER CODE END 2 */
#ifdef OTA_ENABLE    
    Pro_D2W_Ask_Module_Reboot();
#endif
    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1)
    {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
        userHandle();//数据上传
        gizwitsHandle((dataPoint_t *)&currentDataPoint);//任务处理(比如:开关LED)
    }
    /* USER CODE END 3 */

我们可以使用CH340连接串口1,esp8266连接串口2,查看按键的打印信息:发现按键设置长短按,分别用来设置esp8266的工作模式,移植后的代码的串口发送函数已经包装成了GIZWITS_LOG 

#define GIZWITS_LOG printf                          ///<Run log print



  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
 
  return ch;
}

想要熟悉使用机智云代码就必须会使用两个函数:

userHandle();//数据上传
gizwitsHandle((dataPoint_t *)&currentDataPoint);//任务处理(比如:开关LED)

 userHandle();//数据上传

 gizwitsHandle((dataPoint_t *)&currentDataPoint);//任务处理(比如:开关LED):点击跳转定义

点击进入箭头这个函数: 基本了解了代码的最基本的功能后,后续移植也会更得心应手。

四、直接使用下载下来的代码

4.1、修改代码点亮LED

下载的代码中只定义了一个定时器、两个串口、两个按键,其他就没有配置了,我们这里自己个他配置一个LED的GPIO口,用于模拟灯:

修改1:

static void MX_GPIO_Init(void)
{

    GPIO_InitTypeDef GPIO_InitStruct;

    /* GPIO Ports Clock Enable */
    __HAL_RCC_GPIOD_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();

    /*Configure GPIO pin : KEY1_Pin */
    GPIO_InitStruct.Pin = KEY1_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);

    /*Configure GPIO pin : KEY2_Pin */
    GPIO_InitStruct.Pin = KEY2_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(KEY2_GPIO_Port, &GPIO_InitStruct);
	
	  //自己添加的GPIO口初始化,用于驱动LED
	  GPIO_InitStruct.Pin = GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

 修改2:

4.2、连接机智云

然后按照要求连接号硬件和LED,上电试着连接机智云,先长按Key2进入airlink模式,然后使用手机打开机智云点击右上角的+,然后点击一键配网  

 

等待配对成功后,就可以使用机智云控制LED开关了:

4.3、连接机智云串口打印信息

 五、HAL库移植机智云

前面我们已经熟悉了下载的代码的最基本需求:一个串口打印信息,一个串口连接esp8266,一个定时器ms级别中断,两个按键(非必要),那么我们进行移植之前就得先得到一个已经配置好的keil工程

5.1、Keil工程的生成

前面我们已经熟悉了机智云代码的最基本的需求,所以我们移植之前的需要得到一个符合条件的Keil工程,一个串口打印信息(串口1,115200bits/s),一个串口连接esp8266(串口2,9600bits/s),一个定时器实现ms级别中断(定时器2),两个按键(非必须),需要移植的代码中配置好的就是串口1、串口2,定时器2,如果我们想要使用其他的外设,我们就需要修改机智云代码中的句柄比如我们想要串口1连接esp8266,串口2打印信息,定时器3实现中断,我们在机智云代码中需要的修改的地方:huart1和huart2互换地方,htim2修改为htim3,以此类推。

我们这里就不随便换他的外设配置了,就按照它的来配置,最快把这个机智云平台使用起来:

打开外部高速时钟:配置时钟频率: 配置定时器二:

别忘记了打开定时器中断: 配置串口1负责打印信息(115200bits/s):

 配置串口二(9600bits/s):

一样别忘记打开中断:

配置点灯GPIO口:

 最后生成工程即可:

 5.2、查看机智云代码重要的文件

里面的文件我们只需要3个:

 我们将其复制出来我们自己的工程:

5.3、添加文件路径

我们打开我们自己工程:

把我们复制过来的文件路径都添加进去,不然我们直接包括头文件会报错:

然后打开添加组,把对应的C文件都添加进去:

5.4、打开Use Micro LIB 

打开这个才能print函数重映射:

5.5、代码移植

 

添加我圈起来的代码: 这样子我们的代码就基本移植成功了。

如果想要按键控制ESP8266工作模式的还需要添加(非必要):

void key1ShortPress(void)
{
    GIZWITS_LOG("KEY1 PRESS ,Production Mode\n");
    gizwitsSetMode(WIFI_PRODUCTION_TEST);
}

/**
* key1 long press handle
* @param none
* @return none
*/
void key1LongPress(void)
{
    GIZWITS_LOG("KEY1 PRESS LONG ,Wifi Reset\n");
    gizwitsSetMode(WIFI_RESET_MODE);

}

/**
* key2 short press handle
* @param none
* @return none
*/
void key2ShortPress(void)
{
    GIZWITS_LOG("KEY2 PRESS ,Soft AP mode\n");
    #if !MODULE_TYPE
    gizwitsSetMode(WIFI_SOFTAP_MODE);
    #endif
}

/**
* key2 long press handle
* @param none
* @return none
*/
void key2LongPress(void)
{
    //AirLink mode
    GIZWITS_LOG("KEY2 PRESS LONG ,AirLink mode\n");
    #if !MODULE_TYPE
    gizwitsSetMode(WIFI_AIRLINK_MODE);
    #endif
}

/**
* Key init function
* @param none
* @return none
*/
void keyInit(void)
{
    /* Key parameter initialization*/
    keyCategory_t keys[KEY_NUM]={
        [KEY1] = {

        .fsm.keyGpio.keyPort = KEY1_GPIO_Port,
        .fsm.keyGpio.keyPin = KEY1_Pin,
        //Key1 State Machine Init
        .fsm.keyShield = ENABLE,
        .fsm.keyDownLevel = Bit_RESET,
        //Key1 Callback function init
        .func.ShortPressCb = key1ShortPress,
        .func.longPressCb = key1LongPress,
        },

        [KEY2] = {
        .fsm.keyGpio.keyPort = KEY2_GPIO_Port,
        .fsm.keyGpio.keyPin = KEY2_Pin,
        //Key2 State Machine Init
        .fsm.keyShield = ENABLE,
        .fsm.keyDownLevel = Bit_RESET,
        //Key2 Callback function init
        .func.ShortPressCb = key2ShortPress,
        .func.longPressCb = key2LongPress,
        },
    };
    keyParaInit(keys); 
}

 然后再main函数中调用Key_Init函数即可:

 5.6、修改任务处理函数

跳转gizwitsHandle((dataPoint_t *)&currentDataPoint);函数定义,找到任务处理函数:

继续跳转去函数定义,添加任务处理: 到这里我们就已经完成了代码的移植,然后我们按照前面连接机智云的方法,在手机上即可控制LED的点亮与熄灭!

六、标准库移植机智云

可以看看某站的这个视频:标准库移植机智云

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【前端框架】Vue3 面试题深度解析

本文详细讲解了VUE3相关的面试题&#xff0c;从基础到进阶到高级&#xff0c;分别都有涉及&#xff0c;希望对你有所帮助&#xff01; 基础题目 1. 简述 Vue3 与 Vue2 相比有哪些主要变化&#xff1f; 答案&#xff1a; 响应式系统&#xff1a;Vue2 使用 Object.definePrope…

DarkLabel 2.4使用指南:高效标注视频数据目标检测标签

工具概述 DarkLabel 2.4 是一款强大的多功能标注工具&#xff0c;专为计算机视觉开发者设计&#xff0c;旨在提升标注工作的效率和精确度。其智能标注引擎支持两项核心功能&#xff1a;线性插值标注与多目标跟踪&#xff0c;极大地优化了视频标注过程。 &#xff08;1&#x…

js解析后端传来的如图示的list集合,怎么获取每个map的key和value

如图示&#xff0c;后端传到前端的questTypeList是一个HashMap的list集合 使用c标签将传来的集合放到下拉单选框中&#xff0c; <% taglib prefix"c" uri"http://java.sun.com/jsp/jstl/core" %><html> <body><form action"yo…

SpringSecurity请求流转的本质

1. SpringSecurity核心源码分析 分析SpringSecurity的核心原理,那么我们从哪开始分析?以及我们要分析哪些内容? 系统启动的时候SpringSecurity做了哪些事情?第一次请求执行的流程是什么?SpringSecurity中的认证流程是怎么样的?1.1 系统启动 当我们的Web服务启动的时候,…

[论文阅读] SeeSR: Towards Semantics-Aware Real-World Image Super-Resolution

文章目录 一、前言二、主要贡献三、Introduction四、Methodology4.1 Motivation &#xff1a;4.2Framework Overview.** 一、前言 通信作者是香港理工大学 & OPPO研究所的张磊教授&#xff0c;也是图像超分ISR的一个大牛了。 论文如下 SeeSR: Towards Semantics-Aware Rea…

在VS中通过vcpkg包管理器来安装使用qt5

常用指令 .\vcpkg install 库名 .\vcpkg install 库名版本号.\vcpkg install 库名 --trip x86-windows.\vcpkg list.\vcpkg search 库名 .\vcpkg x-all-installed --7zip PS G:\vcpkg> .\vcpkg help usage: vcpkg <command> [--switches] [--optionsvalues] [argume…

ESXI 8.0 linux vSphere Client service has stopped working.手动启动服务

1、首先在你的esxi中进入到你的VC系统中&#xff0c;我这个是linux部署 #查看每个服务及状态 service-control --status2、你会发现有停止的服务和正在启动的&#xff0c;在不知道具体哪些服务具体负责的功能&#xff0c;那你就一个一个起&#xff0c;边起边试----重要服务我后…

基于SpringBoot+Vue的装修装潢管理系统的设计与实现

获取源码&#xff1a;SpringBootVue的装修装潢公司管理系统: 用户&#xff1a;登录、注册、忘记密码、首页、产品展示、装修案例、装修套餐、装修预约、新闻动态、合作伙伴、在线留言、我的装修、个人中心、我的留言、我的预约、关于我们等功能管理员&#xff1a;登录、首页、户…

DeepSeek部署到本地(解决ollama模型下载失败问题)

一、下载ollama软件安装 1、下载ollama软件 Ollama 下载完成后可以直接进行安装&#xff08;外网&#xff0c;速度可能会有点慢&#xff09; 2、修改安装目录 进去下载的目录&#xff0c;使用cmd打开终端输入OllamaSetup.exe /DIRE:\MySoftware\Ollama 输入完成后会自动打开…

【拥抱AI】GPT Researcher的诞生

一、GPT Researcher 研究过程总结 GPT Researcher 是一个开源的自主智能体&#xff0c;旨在通过利用人工智能技术实现高效、全面且客观的在线研究。它通过一系列创新的设计和优化&#xff0c;解决了传统研究工具&#xff08;如 AutoGPT&#xff09;中存在的问题&#xff0c;如…

什么是Dubbo?Dubbo框架知识点,面试题总结

本篇包含什么是Dubbo&#xff0c;Dubbo的实现原理&#xff0c;节点角色说明&#xff0c;调用关系说明&#xff0c;在实际开发的场景中应该如何选择RPC框架&#xff0c;Dubbo的核心架构&#xff0c;Dubbo的整体架构设计及分层。 主页还有其他的面试资料&#xff0c;有需要的可以…

软件单元测试的技术要求

文章目录 一、软件单元测试的概念二、测试对象三、测试目的四、进入条件五、测试内容六、测试环境七、测试实施方一、软件单元测试的概念 单元测试(Unit Testing),是指对软件中的最小可测试单元进行测试验证。单元测试是白盒测试,主要依据软件详细设计和软件代码进行,不仅…

GPT-Sovits:语音克隆训练-遇坑解决

前言 本来以为3050完全无法执行GPT-Sovits训练的&#xff0c;但经过实践发现其实是可以&#xff0c;并且仅花费了十数分钟便成功训练和推理验证了自己的语音模型。 官方笔记&#xff1a;GPT-SoVITS指南 语雀 项目地址&#xff1a;https://github.com/RVC-Boss/GPT-SoVITS 本人…

如何调用 DeepSeek API:详细教程与示例

目录 一、准备工作 二、DeepSeek API 调用步骤 1. 选择 API 端点 2. 构建 API 请求 3. 发送请求并处理响应 三、Python 示例&#xff1a;调用 DeepSeek API 1. 安装依赖 2. 编写代码 3. 运行代码 四、常见问题及解决方法 1. API 调用返回 401 错误 2. API 调用返回…

成员函数定义后面加const是什么功能:C++中const成员函数的作用

成员函数定义后面加const是什么功能&#xff1a;C中const成员函数的作用 前言C中const成员函数的作用总结 前言 在PX4的代码中的位置控制模块中&#xff0c;有这样一个成员函数 void getAttitudeSetpoint(vehicle_attitude_setpoint_s &attitude_setpoint) const;该函数的…

数据结构-----双向链表

一、双向循环列表 head.h #ifndef __head_h__ #define __head_h__ #include <stdio.h> #include <string.h>…

基于Flask的第七次人口普查数据分析系统的设计与实现

【Flask】基于Flask的第七次人口普查数据分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 基于Flask的人口普查可视化分析系统 二、项目界面展示 登录/注册 首页/详情 …

纯手工搭建整套CI/CD流水线指南

目录 一、前言 二、环境准备 1、服务器开荒&#xff08;192.168.1.200&#xff09; 2、离线资源清单&#xff08;提前用U盘拷好&#xff09; 三、硬核安装&#xff1a;比拧螺丝还细的步骤 Step1&#xff1a;搭建GitLab&#xff08;注意&#xff01;这是只内存饕餮&#xf…

RocketMQ - 常见问题

RocketMQ常见问题 文章目录 RocketMQ常见问题一&#xff1a;消息幂等问题1&#xff1a;什么是消费幂等2&#xff1a;消息重复的场景分析2.1&#xff1a;发送时消息重复2.2&#xff1a;消费时消息重复2.3&#xff1a;Rebalance时消息重复 3&#xff1a;通用解决方案3.1&#xff…

macos sequoia 禁用 ctrl+enter 打开鼠标右键菜单功能

macos sequoia默认ctrlenter会打开鼠标右键菜单&#xff0c;使得很多软件有冲突。关闭方法&#xff1a; end