STM32 通过 ESP8266 通信详解

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

❤欢迎关注我的知乎:对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 通信的示例代码:

c 复制代码
#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 协议发送数据的示例代码:

c 复制代码
// 连接到 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 设备具备网络通信能力,实现更多的物联网应用。

相关推荐
信奥洪老师9 分钟前
2025年12 电子学会 机器人三级等级考试真题
单片机·嵌入式硬件·机器人
程序员zgh15 分钟前
MCU 锁步(Lockstep)
单片机·嵌入式硬件
恶魔泡泡糖41 分钟前
最小系统组成部分
c语言·单片机
czhaii1 小时前
USB拓展库及使用示例
单片机·嵌入式硬件·硬件工程
iCxhust1 小时前
8088单板机C语言汇编混合编程实验方法与步骤
c语言·汇编·单片机·嵌入式硬件·微机原理
正运动技术1 小时前
全国产强实时运动控制内核(十二):实时在线变速实现多段速的软着陆
嵌入式硬件·c#·运动控制·运动控制器·运动控制卡·正运动·pc上位机
坏一点2 小时前
Yocto项目构建(3)——构建和部署树莓派镜像
linux·驱动开发·嵌入式硬件
逆小舟2 小时前
【RTOS】任务间通信IPC
单片机·嵌入式硬件
电化学仪器白超2 小时前
《可编程固定阻值电子负载的制作与自动化标定技术》
python·单片机·嵌入式硬件·自动化