问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32F103的HAL库ESP8266模块AT指令进行调试

创作时间:
作者:
@小白创作中心

STM32F103的HAL库ESP8266模块AT指令进行调试

引用
CSDN
1.
https://m.blog.csdn.net/m0_37371085/article/details/142003399

本文将详细介绍如何使用STM32F103单片机通过USART中断方式调试ESP8266 WIFI模块的AT指令。通过本文,读者将了解如何在STM32F103单片机上配置USART中断,以及如何通过AT指令控制ESP8266模块。

开发环境

硬件:

  • 正点原子精英版 STM32F103 开发板
  • ESP8266 WIFI模块
  • USB-TTL转串口

单片机:

  • STM32F103ZET6

软件:

  • Keil版本:5.32
  • 串口调试助手
  • STM32CubeMX版本:6.9.2
  • STM32Cube MCU Packges版本:STM32F1xx_DFP.2.3.0

ESP8266(ESP-01)模块简介

实验使用的是ESP8266(ESP-01)模块。ESP8266 系列模组是深圳市安信可科技有限公司开发的一系列基于乐鑫ESP8266EX的低功耗UART-WiFi芯片模组,可以方便地进行二次开发,接入云端服务,实现手机3/4G全球随时随地的控制,加速产品原型设计。

模块核心处理器 ESP8266 在较小尺寸封装中集成了业界领先的 Tensilica L106 超低功耗 32 位微型 MCU,带有 16 位精简模式,主频支持 80 MHz 和 160 MHz,支持 RTOS,集成 Wi-Fi MAC/ BB/RF/PA/LNA,板载天线。支持标准的 IEEE802.11 b/g/n 协议,完整的 TCP/IP 协议栈。用户可以使用该模块为现有的设备添加联网功能,也可以构建独立的网络控制器。ESP8266 有两个 UART,其中 UART0 有 TX、 RX,可做数据传输; UART1 由于RX 脚被SPI-Flash 占⽤,只能使⽤TX,可以做串⼝调试信息打印。

ESP8266 是高性能无线 SoC,以最低成本提供最大实用性,为 Wi-Fi 功能嵌入其他系统提供无限可能。

实物图片如下:

电脑PC串口助手调试ESP8266

在开始使用STM32F103单片机调试ESP8266之前,建议先通过电脑PC的串口助手软件(如PuTTY、SSCOM等)与ESP8266进行通信测试,以确保模块功能正常。具体步骤如下:

  1. 连接硬件:使用USB转TTL模块将ESP8266的TX、RX引脚(注意交叉连接,即ESP8266的TX接USB转TTL的RX,反之亦然)与电脑连接。VCC、 CH_PD 接到3.3v(EN),GND引脚连接到GND,并确保供电稳定。如图所示。

值得注意,请保证供电电源是3.3V,在 3V-4V 以下,保证 CH_PD 也就是芯片选通脚为高电平(3.3v),系统若有指示灯,蓝灯会在上电瞬间闪烁一下立刻灭掉!因为 8266 模组的 LED 灯接到芯片的 GPIO2 引脚,此引脚与 UART1 的TXD 共用,此时模块上电会输出一下打印信息,所以 LED 会闪烁直到打印信息输出完毕,LED 灯就灭了。若看到数据指示灯有输出,而你的串口没数据,代表输出的数据你没有很好的接收到,请检查你的USB 转串口工具。

  1. 配置串口助手:打开串口助手软件,设置正确的波特率(ESP8266默认波特率通常为115200)、数据位、停止位和校验位。

  2. 发送AT指令:通过串口助手向ESP8266发送AT指令(如“AT\r\n”),如果返回“OK”,则表示模块已正确响应,可进行后续操作。

AT+RST
OK
WIFI DISCONNECT
 ets Jan  8 2013,rst cause:1, boot mode:(3,7)
load 0x40100000, len 1856, room 16 
tail 0
chksum 0x63
load 0x3ffe8000, len 776, room 8 
tail 0
chksum 0x02
load 0x3ffe8310, len 552, room 8 
tail 0
chksum 0x79
csum 0x79
2nd boot version : 1.5
  SPI Speed      : 40MHz
  SPI Mode       : DIO
  SPI Flash Size & Map: 8Mbit(512KB+512KB)
jump to run user1 @ 1000
勩??鞗s名g|??噟sl勩r踕宒?l`你{?靗?d`屻;泴l嚐?l$`{l`莾sl劅銊c$宑s|廲x`鋖鋍dr?dc潴o飥ng?刣鹥d?l那???弆?$€g?劅銓bd鞄8専銓#l刢ps$c{l
Ai-Thinker Technology Co. Ltd.
ready
AT+CWMODE=1
OK
WIFI CONNECTED
WIFI GOT IP
AT+CWJAP_DEF="cctv","66668888"
WIFI DISCONNECT
WIFI CONNECTED
WIFI GOT IP
OK
AT+CIPSTA?
+CIPSTA:ip:"192.168.0.54"
+CIPSTA:gateway:"192.168.0.1"
+CIPSTA:netmask:"255.255.255.0"
OK
AT+CIPMUX=1
OK
AT+CIPSERVER=1,9999
OK

系统启动后,在 0.91 版本以及以前,系统会输出一堆乱码(其实不是乱码,系统启动后输出一些内部信息)然后输出 READY!代表系统正常。按照上述方法,系统正常运行后,应该能在手机上或者电脑上搜到以 ESP_XXXX或AI-THINKER 为头的WIFI,若系统有上述描述的状态,代表你的系统正常运行。

STM32单片机调试ESP8266

接下来,我们将利用STM32F103单片机,通过其USART接口以中断方式调试ESP8266模块,实现更高级别的设备交互与控制。

  1. 硬件连接
  • 将ESP8266的TX、RX接STM32F103的相应USART2引脚(PA2、PA3)。VCC、 CH_PD 接到3.3v,GND引脚连接到GND,并确保供电稳定。
  • 使用USB转TTL模块将STM32单片机USART1(PA9、PA10)的TX、RX引脚(注意交叉连接,TX接USB转TTL的RX,反之亦然)与电脑连接。VCC、 CH_PD 接到3.3v(EN),GND引脚连接到GND,并确保供电稳定。如图所示。
  1. 软件配置
  • 初始化USART:使用STM32CubeMX或手动配置STM32F103的USART1,USART2,设置波特率、中断优先级等参数。
  1. 程序框架

  2. 编写调试代码

  • 基于STM32 HAL库编写USART初始化代码,并配置中断服务例程以处理接收到的数据。在中断服务例程中,在usart.c添加代码添加串口的代码。
/* USER CODE BEGIN 0 */
#include <string.h>
#include <stdio.h>
/* USER CODE END 0 */
/* USER CODE BEGIN 1 */
/*
* 添加如下代码,可不在工程设置中勾选Use MicroLIB
![](https://wy-static.wenxiaobai.com/chat-rag-image/7664789697005872751)
*/
#pragma import(__use_no_semihosting)
struct __FILE
{
    int a;
};
FILE __stdout;
FILE __stdin;
void _sys_exit(int x)
{
}
/*****************************************************
*function: 写字符文件函数
*param1: 输出的字符
*param2: 文件指针
*return: 输出字符的ASCII码
******************************************************/
int fputc(int ch, FILE *f)
{
    HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 10);
    return ch;
}
/*****************************************************
*function: 读字符文件函数
*param1: 文件指针
*return: 读取字符的ASCII码
******************************************************/
int fgetc(FILE *f)
{
    uint8_t ch = 0;
    HAL_UART_Receive(&huart1, (uint8_t*)&ch, 1, 10);
    return (int)ch;
}
static uint8_t rx_len;
static uint8_t rx_data;
static uint8_t usart_rx_buf[200];
void USART2_startRx(void)
{
        HAL_UART_Receive_IT(&huart2,(uint8_t*)&rx_data,1);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        usart_rx_buf[rx_len%200] = rx_data;
        rx_len++;
        HAL_UART_Receive_IT(&huart2,(uint8_t*)&rx_data,1);
}
uint16_t USART2_receive(uint8_t *pdata)
{
        memcpy(pdata,(uint8_t*)usart_rx_buf,rx_len);
        return rx_len;
}
void USART2_transmit(uint8_t *pdata,uint16_t size,uint32_t timeout)
{
        HAL_UART_Transmit(&huart2,pdata,size,timeout);
}
void USART2_clear(void)
{
    rx_len = 0;	
    memset((uint8_t*)usart_rx_buf,0,200);
}
uint8_t ESP8266_SendCommand(char* cmd,char *reply,uint16_t timeout)
{
        char buf[256] = {0};
        strcat(buf,cmd);
        
        if(strstr(buf,"\r\n") ==0)
        {
                strcat(buf,"\r\n");
        }
        USART2_clear();
        
        USART2_transmit((uint8_t *)buf,strlen(buf),500);
        memset(buf,0,256);
        while(timeout !=0)
        {
                if(USART2_receive((uint8_t *)buf))
                {
                        if(strstr(buf,reply)==0)
                        {
                                    printf("\"%s \"is sent !\r\n",cmd);
                                    if(strstr(buf,"CIPSTA:ip") == 0)
                                    return 0;
                        }
                }
                else{
                                timeout--;
                                HAL_Delay(1);
                        }
      }
      printf("\"%s \"is ERR !\r\n",cmd);
        return 1;
}
/* USER CODE END 1 */
  • 在main.c添加串口发送和接收的指令,发送AT指令。
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint8_t pdata_rx[200]={0};
//uint8_t pdata_tx[200]="AT+RST\r\n";
uint8_t pdata_tx[200]="AT\r\n";
int len =0;
/* USER CODE END 0 */
/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */
  /* MCU Configuration--------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* USER CODE BEGIN Init */
  /* USER CODE END Init */
  /* Configure the system clock */
  SystemClock_Config();
  /* USER CODE BEGIN SysInit */
  /* USER CODE END SysInit */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  USART2_startRx();
     //printf("usart1 is ok\r\n");
     //USART2_transmit((uint8_t*)pdata_tx,sizeof(pdata_tx),500);
     //printf("tx:%s",pdata_tx);
   ESP8266_SendCommand("AT+RST","OK",500);
   ESP8266_SendCommand("AT+CWMODE=1","OK",500);
    //ESP8266_SendCommand("AT+CWJAP_DEF=\"cctv\",\"66668888\"","OK",8000);
    ESP8266_SendCommand("AT+CWJAP=\"cctv\",\"66668888\"","OK",8000);
    ESP8266_SendCommand("AT+CIPMUX=1","OK",500);	HAL_Delay(1000);
    ESP8266_SendCommand("AT+CIPSERVER=1,9999","OK",500);
    ESP8266_SendCommand("AT+CIPSTA?","OK",500);
  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
    
        
  }
  /* USER CODE END 3 */
}
  1. 调试与测试
    串口调试助手看到,STM32发送AT指令给ESP8266模块,串口助手打印如下信息,明确ESP8266模块已可以用AT指令进行调试成功。

总结

通过以上步骤,我们成功地利用STM32F103单片机通过USART中断方式调试了ESP8266 WIFI模块常用的AT指令。这一过程不仅加深了我们对ESP8266模块及STM32单片机USART通信的理解,进而实现更复杂的物联网应用功能。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号