✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进
❤欢迎关注我的知乎:对error视而不见
代码获取、问题探讨及文章转载可私信。
☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。
🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇
一、概述
ESP8266是一款低成本的Wi-Fi芯片,它具有完整且自成体系的Wi-Fi网络功能,能够独立运行,也可以作为从机搭载于其他主机MCU运行。STM32是意法半导体推出的一系列基于ARM Cortex - M内核的32位微控制器,性能强大、外设丰富。将ESP8266与STM32结合使用,可以让STM32设备轻松接入Wi-Fi网络,实现远程数据传输、远程控制等功能。
二、硬件连接
ESP8266与STM32之间通常通过串口进行通信。以下是一种常见的连接方式:
ESP8266引脚 | STM32引脚 |
---|---|
VCC | 3.3V |
GND | GND |
TXD | STM32的RXD(例如USART1_RX) |
RXD | STM32的TXD(例如USART1_TX) |
三、软件编程
以下是一个基于STM32 HAL库的示例代码,用于通过ESP8266连接到Wi-Fi网络并发送HTTP请求。
#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);
}
// 等待ESP8266响应
void wait_for_response(const char* response, uint32_t timeout) {
char buffer[256];
uint32_t start_time = HAL_GetTick();
uint8_t index = 0;
while (HAL_GetTick() - start_time < timeout) {
if (HAL_UART_Receive(&huart1, (uint8_t*)&buffer[index], 1, 100) == HAL_OK) {
if (strstr(buffer, response) != NULL) {
return;
}
index++;
if (index >= sizeof(buffer) - 1) {
index = 0;
}
}
}
}
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
// 复位ESP8266
send_AT_command("AT+RST");
wait_for_response("OK", 5000);
// 设置为STA模式
send_AT_command("AT+CWMODE=1");
wait_for_response("OK", 5000);
// 连接到Wi-Fi网络
send_AT_command("AT+CWJAP=\"your_SSID\",\"your_PASSWORD\"");
wait_for_response("OK", 10000);
// 建立TCP连接
send_AT_command("AT+CIPSTART=\"TCP\",\"example.com\",80");
wait_for_response("OK", 5000);
// 发送HTTP请求
char http_request[] = "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n";
char cip_send_command[50];
sprintf(cip_send_command, "AT+CIPSEND=%d", strlen(http_request));
send_AT_command(cip_send_command);
wait_for_response(">", 5000);
HAL_UART_Transmit(&huart1, (uint8_t*)http_request, strlen(http_request), HAL_MAX_DELAY);
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();
}
四、代码解释
- 发送AT指令:
send_AT_command
函数用于向ESP8266发送AT指令,通过串口将指令和换行符发送出去。 - 等待响应:
wait_for_response
函数用于等待ESP8266的响应,在指定的时间内检查是否接收到预期的响应。 - 主函数流程:
- 初始化STM32的硬件和串口。
- 复位ESP8266。
- 设置ESP8266为STA模式(客户端模式)。
- 连接到指定的Wi-Fi网络。
- 建立TCP连接到指定的服务器。
- 发送HTTP请求。
五、注意事项
- 请将代码中的
your_SSID
和your_PASSWORD
替换为实际的Wi-Fi网络名称和密码。 example.com
替换为实际要连接的服务器地址。- 确保ESP8266的波特率与STM32的串口波特率一致,示例中使用的是115200。
通过以上步骤,你可以实现STM32与ESP8266的通信,让STM32设备接入Wi-Fi网络并进行数据传输。