【STM32+ESP8266连接腾讯云物联网开发平台 2】STM32+ESP8266-01S连接腾讯云_stm32使用esp8266采用mqtt上腾讯云(1)

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取


前言

昨天已经用ESP-12S成功连接上腾讯云物联网开发平台,并且还能用手机控制了,但是毕竟是在电脑上位机做的连接,还没有在STM32连接。博主经过一天的努力。成功给STM32接上了腾讯云物联网开发平台,先说明几点:
       1. 博主用的是RTOS实时操作系统,为的是更快捷的读取云的数据;
       2. 博主也是第一次使用RTOS实时操作系统,对一些API还不是特别熟悉;
       3. 本文虽然大部分介绍怎么实现功能,小部分需要同学们要有点动手能力,比如换SOP芯片啥的。
       4. 如果没有看过第一篇 的同学,请移步【STM32+ESP-12S连接腾讯云物联网开发平台 1】云平台的创建和AT固件烧录,能做到成功连接腾讯云物联网平台再看本文,不然这篇博文对大家连接云平台的帮助不会很大。
声明一下:博主是第一次使用HAL库给STAM32编程,所以有不足之处还请见谅!!

一、硬件准备

1.ESP8266-01S

在这里插入图片描述
       如果大家看过 STM32+ESP-12S连接腾讯云物联网开发平台 1 都应该还记得:ESP8266-01S因为Flash太小的原因,无法烧录至少需要2M Flash(ESP8266-01S一般只有1MFlash)的AT固件,这时候就需要各位同学的动手能力了。
       不就是Flash 太小吗?换一个大的就是了,所以大家可以把那个8脚的芯片拆了,换成2M以上的Flash芯片。然后烧录:QCloud_IoT_AT_ESP8266_v2.0.0_20200617_UART_1_3.bin 这个版本的固件,记住不要烧录错误,怎么烧录请移步: STM32+ESP-12S连接腾讯云物联网开发平台 1
在这里插入图片描述

2. STM32F103C8T6核心板或者小开发板及其程序下载器

在STM32芯片价格暴涨的年代,用STM32真是为难大家了,但是STM32F103C8T6的最小开发板的价格还是可以接受滴,博主推荐能够直插ESP8266-01S的,省得大家接线麻烦。
       程序下载器大家可以根据烧录方式来选择:
       1. 串口烧录的可以用USB转TTL模块就行;
       2 仿真调试方式下载,大家可以用STLink,或者Jlink都行。

二、软件准备

1.STM32CubeMX

`       博主玩这么多年的STM32,也是第一次用这个软件,不得不说,比起自己搭开发环境来说,这个真是太省时间了。

2. MDK (Keil v5)

这个软件,博主只用来学习,不做任何商业用途。推荐使用正版MDK。

3.程序实现流程

在这里插入图片描述

三、STM32CubeMX 配置工程

博主也是第一次使用这个软件来配置工程,有什么不足之处非常欢迎指正,

1.根据芯片信号创建工程

在这里插入图片描述
在这里插入图片描述
       到这里就需要开始配置功能引脚了。

2.配置LED驱动引脚

在这里插入图片描述

3.配置串口驱动

在这里插入图片描述

4.FreeRTOS配置

在这里插入图片描述

5.FreeRTOS的定时器配置

FreeRTOS是要使用定时器来管理任务的并行关系,所以要对定时器进行更改:
在这里插入图片描述

6.工程配置

配置完引脚之后,还要对工程输出进行配置:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样,我们的工程就配置好了,下面就能编写功能代码了。

四、串口中断驱动编写

STM32CubeMx生成的代码使用HAL库写的,而且对串口中断做了一下改变,现在并不是说直接就可以在串口中断函数中处理数据。目前,串口中断函数中只有一个函数:

void USART1\_IRQHandler(void)
{
  /\* USER CODE BEGIN USART1\_IRQn 0 \*/

  /\* USER CODE END USART1\_IRQn 0 \*/
  HAL\_UART\_IRQHandler(&huart1);
  /\* USER CODE BEGIN USART1\_IRQn 1 \*/
  
  /\* USER CODE END USART1\_IRQn 1 \*/
}


这个 HAL_UART_IRQHandler(&huart1) 函数只是判断中断类型而已,并没有处理数据的相关代码在里面。有兴趣的同学可以到函数里面看看。
        那既然这个函数并没有做数据处理,那肯定是有个函数专门负责接收串口数据的:
串口中断接收函数: HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
这个函数的功能:这个函数是把husart 串口接收到的 Size数据量的字节存到pData中, 并且关掉中断。
也就说,当我们接受完数据之后,要重新使用这个函数来开启中断。另外还要介绍另一个和这个函数息息相关的函数:
串口接收回调函数: void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
这个函数默认不会自动生成,需要我们自己写。
函数功能:当HAL_UART_Receive_IT函数结束后,会进来这个函数当中,用户可以在这个函数中对数据进行处理。
方便大家,给各位同学贴出我自己写的函数HAL_UART_RxCpltCallback

 if(huart->Instance==USART2)
  {
   UART2_DATA.UART_Data[UART2_DATA.UART_Cnt] = \*UART2_DATA.UART_DataBuf;
   UART2_DATA.UART_Cnt++;
  
    if(\*UART2_DATA.UART_DataBuf==0X0A)
    {
      UART2_DATA.UART_Flag = 1;
    }
  }
  HAL\_UART\_Receive\_IT(huart,(uint8\_t \*)UART2_DATA.UART_DataBuf,sizeof(UART2_DATA.UART_DataBuf));

相关宏结构体:

typedef struct usart
{
    unsigned char UART_Data[512]; 
    unsigned char UART_Flag;
    unsigned int UART_Cnt;
    unsigned char UART_DataBuf[1];
}USART_DataBuf;

我把接收到的数据存在结构体当中进行同意处理,而且这个结构体是全局的,方便使用。

五、ESP8266的数据显示

这个函数可以把ESP8266接收到的数据通过USART1打印出来,方便我们查看调试和了解AT指令的进度。这个函数我把它放在了一个独立线程当中,这样就可以不断地读取并显示出来。

ESP8266DATATypedef esp8266data;
//获取串口数据
uint8\_t \*Esp8266GetData(void)
{
  if (UART2_DATA.UART_Flag == 1)
  {
    strcpy((char \*)esp8266data.data, (const char \*)UART2_DATA.UART_Data);
    esp8266data.data_size = UART2_DATA.UART_Cnt;
    
    printf("%s", UART2_DATA.UART_Data);
    
    for (; UART2_DATA.UART_Cnt > 0; UART2_DATA.UART_Cnt--)
      UART2_DATA.UART_Data[UART2_DATA.UART_Cnt] = 0;

    esp8266data.flag += 1;  
    if(esp8266data.flag>16) esp8266data.flag=16;
    UART2_DATA.UART_Flag = 0;
    return esp8266data.data;
  }
  return esp8266data.data;
}

void StartTask02(void \*argument)
{
  /\* USER CODE BEGIN StartTask02 \*/
  /\* Infinite loop \*/
  uint8\_t \*sub_buf;
  HAL\_UART\_RxCpltCallback(&huart2);
  for (;;)
  {
    sub_buf = Esp8266GetData();


六、AT指令配置ESP8266连接WiFi和腾讯云

有了串口中断及之前地AT指令流程,就可以连接腾讯云了:

1.连接WiFi

//连接WiFi
void Esp8266LinkAp(uint8\_t \*ssid, uint8\_t \*passwd)
{
  uint8\_t \*linkap;

  linkap = (uint8\_t \*)malloc(128);
  HAL\_UART\_Transmit(&huart2, " \r\n", 3, 1000);
  do
  {
    switch (esp8266data.flag)
    {
    case 0: //复位ESP8266
      HAL\_UART\_Transmit(&huart2, "AT+RST\r\n", strlen("AT+RST\r\n"), 5000);
      osDelay(2000);
      break;
    case 2: //设置连接模式
    case 3:
      HAL\_UART\_Transmit(&huart2, "AT+CWMODE=1\r\n", strlen("AT+CWMODE=1\r\n"), 5000);
      osDelay(1000);
      break;
    //开始连接WiFi
    case 4:
    case 5:
      sprintf((char \*)linkap, "AT+CWJAP=\"%s\",\"%s\"\r\n", ssid, passwd);
      HAL\_UART\_Transmit(&huart2, (uint8\_t \*)linkap, strlen((const char \*)linkap), 5000);
      osDelay(5000);
      break;

    default:
      break;
    }
  } while (esp8266data.flag < 7);

  free(linkap);
}

2.连接腾讯云并订阅主题

void Esp8266LinkloTExplorer(void)
{
  uint8\_t \*device_massage;

  device_massage = (uint8\_t \*)malloc(128);
  do
  {
    switch (esp8266data.flag)
    {
      // case 7: //设置连接信息
    case 7:
    case 8:


![img](https://img-blog.csdnimg.cn/img_convert/a3333a7673be36a75cd20af004464be0.png)
![img](https://img-blog.csdnimg.cn/img_convert/85857bc95345a0841c20fd9656589895.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**




[外链图片转存中...(img-iIc6vyds-1715708473032)]
[外链图片转存中...(img-e3sAKP8A-1715708473033)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ESP8266-01SSTM32的接线方式有多种,具体取决于您的应用场景和需求。以下是一种常见的接线方式: 1. 将ESP8266-01S的VCC引脚连接STM32的3.3V电源引脚上。 2. 将ESP8266-01S的GND引脚连接STM32的GND引脚上。 3. 将ESP8266-01S的TXD引脚连接STM32的RX引脚上。 4. 将ESP8266-01S的RXD引脚连接STM32的TX引脚上。 5. 如果需要使用ESP8266-01S的GPIO引脚,可以将其连接STM32的任意GPIO引脚上。 需要注意的是,ESP8266-01S的工作电压为3.3V,不能直接连接STM32的5V引脚上,否则可能会损坏ESP8266-01S。同时,ESP8266-01S的TXD和RXD引脚需要通过电平转换器进行转换,以适应STM32的3.3V电平。 ### 回答2: ESP8266-01S是一款非常实用的无线模块,可与STM32芯片相连接。下面将会介绍如何与STM32正确地接线。 首先,ESP8266-01S的接口分为VCC、GND、CH_PD、RX 和TX五个针脚。而STM32的IO口可以有多个,因此需要确认在STM32中可用的IO口,需要从STM32芯片的手册中查看。 接线步骤如下: 1. 将ESP8266-01S的TX接口连接STM32芯片的RX端口。同时将ESP8266-01S的RX端口连接STM32的TX端口。 2. 将ESP8266-01S的GND和CH_PD连接STM32的GND端口。 3. ESP8266-01S的VCC端口需要通过3.3V电源供电,STM32的3.3V端口可以使用此端口直接供电。 4. 在STM32芯片中需要开启串口,并且选择与ESP8266-01S相匹配的参数,例如波特率和数据位、校验位以及停止位等一系列参数。 5. 如果需要在STM32上控制ESP8266-01S,可以在按下按钮或者开关时,通过STM32的IO口给ESP8266-01S的CH_PD针脚传递高电平信号,即可实现对ESP8266-01S的控制。 需要注意的是,在接线之前,必须保证STM32的IO口与ESP8266-01S的RX、TX信号完全对接。如果接口数量不够,也可以通过串口扩展板或者其他拓展方式来实现ESP8266-01S连接。 总之,ESP8266-01S接线非常简单,但是需要注意每一个细节,确保接线稳定,这样才能实现准确高效的无线通讯。 ### 回答3: ESP8266-01S是一款内置WiFi模块的微控制器,而STM32则是一款性能强劲的微控制器。将它们连接起来可以实现许多有趣的物联网(IoT)应用。 ESP8266-01SSTM32连接方式有两种:串口连接和SPI连接。 串口连接需要将ESP8266-01S的TX、RX引脚分别连接STM32的TX、RX引脚。此外,还需要连接ESP8266-01S的VCC、GND引脚到STM32的3.3V和GND引脚。接线比较简单,但是需要配置串口通信的波特率和数据位、校验位、停止位等参数。 SPI连接需要连接ESP8266-01S的MOSI、MISO、CLK和CS引脚到STM32的相应引脚。此外,还需要连接ESP8266-01S的VCC、GND引脚到STM32的3.3V和GND引脚。SPI连接相对于串口连接稍微复杂一些,但是可以实现更加快速、可靠的数据传输。 ESP8266-01SSTM32连接方式取决于具体应用场景和要求。如果应用场景要求低功耗、简单,则串口连接是不错的选择;如果应用场景要求高速、可靠,则SPI连接是更好的选择。 在使用ESP8266-01SSTM32进行开发时,需要掌握两个设备的相关知识,包括硬件结构、引脚功能等,并且需要掌握通信协议和相应的编程技术。同时,还要持续关注更新的技术和应用,以便优化系统设计和提高开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值