stm32模块系列(3)——wifi模块esp-01S

系列文章目录

第一章 DHT11温湿度模块

第二章 4针0.96寸OLED模块

第三章 wifi模块esp-01S


一、esp-01S

        某宝上esp-01S模块如下图

图1-1

        10元以内就可以拿下,有实力推荐安信可的。然后你还需要一块WiFi模块下载板,如下图

图1-2

        也是10元以内拿下。

二、使用步骤

        使用步骤的话也是简单。首先通过下面的链接下载烧录软件、AT固件包和安信可串口助手

        WiFi模块资料链接

1.固件烧录

        首先将所有压缩包解压

       

        图 2-1

        接着,双击运行...\wifi模块\flash_download_tool_3.9.2_0\flash_download_tool_3.9.2路径下的flash_download_tool_3.9.2.exe程序,如下图 2-2

图 2-2

        然后出现如下图显示,点击ok即可

图 2-3

        然后配置如下图2-4

 图2-4

  烧录成功后,打开串口调试工具验证是否成功

图2-5

        打开串口调试助手后,按下复位键会输出一些字符,然后发送AT指令,如果回复OK,则成功

图2-6

2.创建工程

        该工程因该具有两个串口,本次测试工程选用串口1和串口2

        1)选择SW调试方式

图2-7

2)设置高速时钟为外部晶振

图2-8

3)设置时钟树

图2-9

4.配置串口1和2,配置一样

图2-10

5.生成工程

3.代码移植

        本次移植的代码相对较少,就一个esp8266.h和esp8266.c两个文件。你需要在工程中创建一个Network的文件,然后将esp8266.h和esp8266.c放入其中。esp8266.h文件如下

//code_01
//
// Created by 86139 on 2024/11/26.
//

/**
 * @author:ideal
 * @mailbox:idealofgoner@outlook.com
 */

#ifndef _ESP8266_H_
#define _ESP8266_H_

#include "stdint.h"

void ESP8266_Init(void);
_Bool ESP8266_Send_Cmd(uint8_t* cmd,uint8_t* res);

#endif //_ESP8266_H

代码a-esp8266.h

        esp8266.c文件如下

//code_02
//
// Created by 86139 on 2024/11/26.
//

/**
 * @author:ideal
 * @mailbox:idealofgoner@outlook.com
 */
#include "stm32f1xx_hal.h"

#include <stdio.h>
#include <string.h>

#include "esp8266.h"

uint8_t ESP8266_Buffer[256];
uint8_t UART2_Rx_Buffer[256];


extern UART_HandleTypeDef huart1;
extern UART_HandleTypeDef huart2;

uint8_t WIFI_Name_Cipher[]="AT+CWJAP=\"Redmi K60\",\"244466666\"\r\n";

/**
 * Send instructions to ESP8266 module
 * @param cmd
 * @param res
 * @return Return 1 if the transmission succeeds.  Return 0 if the transmission fails
 */
//通过串口2发送AT指令给esp-01s模块,如果检索到串口2收到esp-01s回复的字符中存在指定字符(res),则表示成功且返回1,否则失败返回0
//其中cmd是需要发送的AT指令,res是esp-01s模块回复(发送)给串口2的字符消息
_Bool ESP8266_Send_Cmd(uint8_t* cmd,uint8_t* res)
{
    uint8_t timeOut = 20;

    HAL_UART_Transmit(&huart2,cmd,strlen(cmd),100);

    while (timeOut--){
        if(strstr(ESP8266_Buffer,res) != NULL){

            return 1;
        }
        HAL_Delay(100);
    }
    return 0;
}

/**
 * Example Initialize the ESP8266 module
 */
//esp-01s初始化
void ESP8266_Init(void)
{
    uint8_t state;
    /* Start Serial port2 is idle & MDA Receive */
    __HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);
    HAL_UART_Receive_DMA(&huart2,UART2_Rx_Buffer, strlen(UART2_Rx_Buffer));
    /* End Serial port2 is idle & MDA Receive */

    while(!ESP8266_Send_Cmd("AT+RST\r\n","ready"));
    HAL_Delay(500);
    while(!ESP8266_Send_Cmd("AT\r\n","OK"));
    HAL_Delay(500);
    while(!ESP8266_Send_Cmd("AT+CWMODE=1\r\n","OK"));
    HAL_Delay(500);
    while(!ESP8266_Send_Cmd(WIFI_Name_Cipher,"OK"));
    HAL_Delay(500);
}

    代码b-esp8266.c

4.代码编写

        需要在主函数中添加两个头文件,如下图

图2-11

        你还需要外部引用数组ESP8266_Buffer和定义一个串口1接收数组UART1_Rx_Buffer,如下图2-12

图2-12

        随后在主循环中添加下图2-13中的代码

图2-13

        此时还需要在stm32f1xx_it.c中外部引用如下代码c,引用最好放在函数定义之前

//code_03
extern uint8_t UART2_Rx_Buffer[256];
extern uint8_t UART1_Rx_Buffer[256];
extern uint8_t ESP8266_Buffer[256];

代码c

        然后在USART1_IRQHandler函数中添加代码如下

//code_04
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
    uint8_t idle = __HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE);
    uint8_t UART1_Tx_Buffer[256];

    if(RESET != idle) {
        __HAL_UART_CLEAR_IDLEFLAG(&huart1);
        HAL_UART_DMAStop(&huart1);

        strcpy(UART1_Tx_Buffer, UART1_Rx_Buffer);
        //回显发送字符
        HAL_UART_Transmit(&huart1, UART1_Tx_Buffer, strlen(UART1_Tx_Buffer), 100);
        
        memset(UART1_Rx_Buffer, '\0', 256);
        //如果发送的字符是AT指令,发送成功就回回显"AT CMD Send OK!"
        if(strstr(UART1_Tx_Buffer,"AT") != NULL){
            HAL_UART_Transmit_DMA(&huart2, UART1_Tx_Buffer, strlen(UART1_Tx_Buffer));
            HAL_UART_Transmit(&huart1, "AT CMD Send OK!\r\n", strlen("AT CMD Send OK!\r\n"), 100);

        }
        HAL_UART_Receive_DMA(&huart1, UART1_Rx_Buffer, 256);
        HAL_UART_Receive_DMA(&huart2,UART2_Rx_Buffer,256);
    }
  /* USER CODE END USART1_IRQn 1 */
}

        代码d_USART1_IRQHandler函数

         最后在USART2_IRQHandler函数中添加代码如下

//code_05
void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */

  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */
  uint8_t idle = __HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE);

  if(RESET != idle){
      __HAL_UART_CLEAR_IDLEFLAG(&huart2);
      HAL_UART_DMAStop(&huart2);

      strcpy(ESP8266_Buffer,UART2_Rx_Buffer);

      //将串口2接收到的数据发送给串口1,
      HAL_UART_Transmit(&huart1,ESP8266_Buffer, strlen(ESP8266_Buffer),100);

      memset(UART2_Rx_Buffer,'\0',256);
      HAL_UART_Receive_DMA(&huart2,UART2_Rx_Buffer,256);
      HAL_UART_Receive_DMA(&huart1, UART1_Rx_Buffer, 256);

  }

  /* USER CODE END USART2_IRQn 1 */
}

代码e_USART2_IRQHandler函数

        完成后点击编译,然后调试。打开串口助手(只要是串口助手都行),复位主板。串口接收数据如下图2-14所示

图2-14        

        由于手机热点并未打开,所以连接失败,值得注意的是手机热点的频段必须是2.4G频段。然后打开热点,发送AT指令

AT+CWJAP="Redmi K60/*热点名字*/","244466666/*热点密码*/"\r\n

连接手机热点。

  

      图2-15

工程链接如下(我用的CLion编辑代码)

工程下载链接


总结

        总的来说较为简单,主要是理解两个串口中断为什么要那样写,还有就是烧录要注意一下细节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值