STM32 通过 ESP8266 通信详解

发布于:2025-05-29 ⋅ 阅读:(32) ⋅ 点赞:(0)

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

一、引言

在物联网应用中,STM32 作为性能强大的微控制器,具备丰富的外设和较高的处理能力,但缺乏直接的网络通信能力。而 ESP8266 是一款低成本、高性能的 Wi-Fi 模块,能实现与互联网的连接。将 STM32 与 ESP8266 结合使用,可以让 STM32 设备轻松接入网络,实现远程数据传输和控制等功能。本文将详细介绍 STM32 如何通过 ESP8266 进行通信,包括硬件连接、软件配置和代码实现。

二、硬件连接

2.1 所需硬件

  • STM32 开发板(以 STM32F103C8T6 为例)
  • ESP8266 Wi-Fi 模块
  • 杜邦线若干
  • 电源模块(为 ESP8266 提供稳定的 3.3V 电源)

2.2 连接方式

通常,STM32 与 ESP8266 通过串口进行通信。以下是一种常见的连接方式:

STM32 ESP8266
TX(USART) RX
RX(USART) TX
GND GND
3.3V VCC

需要注意的是,ESP8266 的工作电压为 3.3V,而 STM32 的部分引脚输出为 5V,为避免损坏 ESP8266,需要进行电平转换。如果 STM32 的引脚支持 3.3V 输出,则可以直接连接。

三、软件配置

3.1 STM32 串口配置

在 STM32 中,需要配置串口以与 ESP8266 进行通信。以下是使用 CubeMX 和 HAL 库进行串口配置的步骤:

  1. 打开 CubeMX,选择对应的 STM32 芯片型号。
  2. 配置 RCC 时钟,选择外部晶振作为时钟源,并配置系统时钟频率。
  3. 使能所需的串口(如 USART1),设置波特率为 115200(与 ESP8266 默认波特率一致)。
  4. 生成代码并导入到 Keil 或其他开发环境中。

3.2 ESP8266 初始化

ESP8266 在使用前需要进行一些初始化操作,如设置工作模式、连接 Wi-Fi 网络等。可以通过向 ESP8266 发送 AT 指令来完成这些操作。常见的 AT 指令如下:

  • AT+RST:复位 ESP8266
  • AT+CWMODE=1:设置为 STA 模式(客户端模式)
  • AT+CWJAP="SSID","PASSWORD":连接到指定的 Wi-Fi 网络

四、代码实现

4.1 STM32 代码

以下是一个使用 STM32 HAL 库实现与 ESP8266 通信的示例代码:

#include "stm32f1xx_hal.h"

UART_HandleTypeDef huart1;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);

// 发送 AT 指令到 ESP8266
void send_AT_command(const char* command) {
    HAL_UART_Transmit(&huart1, (uint8_t*)command, strlen(command), HAL_MAX_DELAY);
    HAL_UART_Transmit(&huart1, (uint8_t*)"\r\n", 2, HAL_MAX_DELAY);
}

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();

  // 复位 ESP8266
  send_AT_command("AT+RST");
  HAL_Delay(2000);

  // 设置为 STA 模式
  send_AT_command("AT+CWMODE=1");
  HAL_Delay(1000);

  // 连接到 Wi-Fi 网络
  send_AT_command("AT+CWJAP=\"your_SSID\",\"your_PASSWORD\"");
  HAL_Delay(5000);

  while (1)
  {
    // 主循环
  }
}

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }
}

static void MX_USART1_UART_Init(void)
{
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
}

static void MX_GPIO_Init(void)
{
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();
}

void Error_Handler(void)
{
  while(1)
  {
  }
}

4.2 代码解释

  • send_AT_command 函数:用于向 ESP8266 发送 AT 指令,并在指令末尾添加换行符。
  • main 函数:初始化 STM32 的硬件资源,然后依次发送复位、设置工作模式和连接 Wi-Fi 网络的 AT 指令。

五、数据传输

在 STM32 与 ESP8266 建立连接后,可以进行数据传输。例如,通过 TCP 或 UDP 协议与服务器进行通信。以下是一个使用 TCP 协议发送数据的示例代码:

// 连接到 TCP 服务器
send_AT_command("AT+CIPSTART=\"TCP\",\"your_server_IP\",your_server_port");
HAL_Delay(3000);

// 发送数据
send_AT_command("AT+CIPSEND=5"); // 发送 5 个字节的数据
HAL_Delay(1000);
send_AT_command("Hello");
HAL_Delay(2000);

// 关闭 TCP 连接
send_AT_command("AT+CIPCLOSE");

六、注意事项

  • 波特率匹配:确保 STM32 与 ESP8266 的串口波特率一致,否则会导致通信失败。
  • AT 指令响应:在发送 AT 指令后,需要等待 ESP8266 的响应,以确保指令执行成功。可以通过读取串口接收缓冲区来获取响应信息。
  • 电源稳定性:ESP8266 在工作时对电源稳定性要求较高,建议使用稳压电源模块为其供电。

通过以上步骤,你可以实现 STM32 与 ESP8266 的通信,让 STM32 设备具备网络通信能力,实现更多的物联网应用。


网站公告

今日签到

点亮在社区的每一天
去签到