✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进
❤欢迎关注我的知乎:对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 库进行串口配置的步骤:
- 打开 CubeMX,选择对应的 STM32 芯片型号。
- 配置 RCC 时钟,选择外部晶振作为时钟源,并配置系统时钟频率。
- 使能所需的串口(如 USART1),设置波特率为 115200(与 ESP8266 默认波特率一致)。
- 生成代码并导入到 Keil 或其他开发环境中。
3.2 ESP8266 初始化
ESP8266 在使用前需要进行一些初始化操作,如设置工作模式、连接 Wi-Fi 网络等。可以通过向 ESP8266 发送 AT 指令来完成这些操作。常见的 AT 指令如下:
AT+RST
:复位 ESP8266AT+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 设备具备网络通信能力,实现更多的物联网应用。