ESP8266模块(WIFI STM32)

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

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

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

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

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

点击领取更多详细资料

一、概述

ESP8266是一款低成本的Wi-Fi芯片,它具有完整且自成体系的Wi-Fi网络功能,能够独立运行,也可以作为从机搭载于其他主机MCU运行。STM32是意法半导体推出的一系列基于ARM Cortex - M内核的32位微控制器,性能强大、外设丰富。将ESP8266与STM32结合使用,可以让STM32设备轻松接入Wi-Fi网络,实现远程数据传输、远程控制等功能。

二、硬件连接

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

ESP8266引脚STM32引脚
VCC3.3V
GNDGND
TXDSTM32的RXD(例如USART1_RX)
RXDSTM32的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();
}
四、代码解释
  1. 发送AT指令send_AT_command 函数用于向ESP8266发送AT指令,通过串口将指令和换行符发送出去。
  2. 等待响应wait_for_response 函数用于等待ESP8266的响应,在指定的时间内检查是否接收到预期的响应。
  3. 主函数流程
    • 初始化STM32的硬件和串口。
    • 复位ESP8266。
    • 设置ESP8266为STA模式(客户端模式)。
    • 连接到指定的Wi-Fi网络。
    • 建立TCP连接到指定的服务器。
    • 发送HTTP请求。
五、注意事项
  • 请将代码中的 your_SSIDyour_PASSWORD 替换为实际的Wi-Fi网络名称和密码。
  • example.com 替换为实际要连接的服务器地址。
  • 确保ESP8266的波特率与STM32的串口波特率一致,示例中使用的是115200。

通过以上步骤,你可以实现STM32与ESP8266的通信,让STM32设备接入Wi-Fi网络并进行数据传输。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值