admin管理员组

文章数量:1620388

文章目录

    • 一.概要
    • 二.ESP8266 WIFI模块主要性能参数
    • 三.ESP8266 WIFI模块芯片内部框图
    • 四.ESP8266 WIFI模块原理图
    • 五.ESP8266 WIFI模块与单片机通讯方法
      • 1.硬件连接
      • 2.ESP8266模块AT指令介绍
    • 六.STM32单片机与ESP8266WIFI模块通讯实验
      • 1.硬件准备
      • 2.软件工程
      • 3.软件主要代码
      • 4.实验效果
    • 七.CubeMX工程源代码下载
    • 八.小结

一.概要

ESP8266 是一款高性能的 WIFI 串口模块,实现透明传输。只要有一定的串口知识,不需要知道 WIFI 原理就可以上手,在业内应用广泛。
ESP8266 是一个非常强大的 WIFI 模块,可以利用串口与单片机进行通讯,从而编程实现控制 ESP8266。利用 ESP8266 可以访问电脑服务器实现TCP/IP协议通讯。
该系列模块支持标准的IEEE802.11b/g/n协议,内置完整的TCP/IP协议栈。用户可以使用该系列模块为现有的设备添加联网功能,也可以构建独立的网络控制器。

二.ESP8266 WIFI模块主要性能参数

1.最小的 802.11b/g/n Wi-Fi SOC 模块
2.采用低功率32位CPU,可兼作应用处理器
3.主频最高可达160MHz
4.内置 10 bit 高精度 ADC
5.支持UART/GPIO/IC/PWM/ADC/HSPI等接口
6.集成 Wi-FiMAC/ BB/RF/PA/LNA
7.支持多种休眠模式,深度睡眠电流低至20uA
8.内嵌 Lwip 协议栈
9.支持STA/AP/STA+AP 工作模式
10.支持 Smart Config/AirKiss;一键配网
11.串口速率最高可达4Mbps
12.通用 AT 指令可快速上手
13.支持 SDK 二次开发
14.支持串口本地升级和远程固件升级(FOTA)

模块接口说明:

1.TX 模块UART串口发送脚
2.GND 接地
3.EN 芯片使能端,高电平有效
4.IO2 GPIO脚
5.RST 模块复位脚
6.IO0 模式选择脚,下载模式:外部拉低;运行模式:悬空或者外部拉高
7.3V3 3.3V 供电,外部供电电源输出电流建议在500mA以上
8.RX 模块UART串口接收脚

三.ESP8266 WIFI模块芯片内部框图

ESP8266 是高性能无线 SoC,以最低成本提供最大实用性,为 Wi-Fi 功能嵌入其他
系统提供无限可能。
ESP8266 拥有完整的且自成体系的Wi-Fi网络功能,既能够独立应用,也可以作为从
机搭载于其他主机MCU运行。当ESP8266独立应用时,能够直接从外接flash中启动。
内置的高速缓冲存储器有利于提高系统性能,并且优化存储系统。
另外⼀种情况是, ESP8266 只需通过 SPI/SDIO 接口或 UART 接口即可作为 Wi-Fi
适配器,应用到基于任何微控制器设计中。
ESP8266 强大的片上处理和存储能力,使其可通过GPIO口集成传感器及其他应用的
特定设备,大大地降低了前期开发的成本。

四.ESP8266 WIFI模块原理图

五.ESP8266 WIFI模块与单片机通讯方法

1.硬件连接

一般模块不需要固件下载更新,单片机通过串口跟模块通讯就能连接路由器,单片机跟模块通常连接如下:

2.ESP8266模块AT指令介绍

在ESP8266的开发过程中,AT指令方法是最常用的方法,无需花大量的时间去熟悉环境,开发速度快。
AT指令是一种串口通信协议,是以AT开头的一个字符串,每个指令执行成功与否都有相应的返回,都是ASCII码字符串操作,每个发送的AT指令都需要回车换行符结束。
最常见的就是AT指令就是查询模块通讯是否正常,指令如下:
单片机发送:AT+(回车换行符)
模块响应:OK

ESP8266模块的主要AT指令如下:
串口波特率115200,8位数据,1位停止位,无校验

ESP8266配置成客户端模式,登录电脑服务器端口主要AT指令流程


六.STM32单片机与ESP8266WIFI模块通讯实验

1.硬件准备

STLINK接STM32F103C8T6小系统板,STLINK接电脑USB口。

板子与ESP8266通过5根杜邦线相连
板子G----模块第2脚(GND)
板子3.3–模块第7脚(3V3)
板子A2—模块第8脚(RX)
板子A3—模块第1脚(TX)
板子C13–模块第5脚(RST)

2.软件工程

打开STM32CubeMX软件,新建工程

Part Number处输入STM32F103C8,再双击就创建新的工程

配置下载口引脚

配置外部晶振引脚

配置系统主频

配置USART2

配置USART2中断,和PC13引脚为输出,PC13引脚控制模块复位脚

配置工程文件名,保存路径,KEIL5工程输出方式

生成工程

用Keil5打开工程

添加代码


3.软件主要代码

串口数据接收相关代码

volatile uint8_t UartRxData;
uint8_t UartTxbuf[1000]={1,2,3,4,5,6,7,8,9,10};
uint8_t UartRxbuf[1024],UartIntRxbuf[1024];
uint16_t UartRxIndex=0,UartRxFlag,UartRxLen=0,UartRxTimer,UartRxOKFlag,UartIntRxLen;

//串口清除
uint8_t UartRecv_Clear(void)
{
	UartRxOKFlag=0;
	UartRxLen=0;
	UartIntRxLen=0;
	UartRxIndex=0;
	return 1;
}

//接收标志函数,返回0说明没收据接收,返回1说明有数据收到
uint8_t Uart_RecvFlag(void)
{
		if(UartRxOKFlag==0x55)
		{
			UartRxOKFlag=0;
			UartRxLen=UartIntRxLen;
			memcpy(UartRxbuf,UartIntRxbuf,UartIntRxLen);//把缓冲区的数据,放入需要解析的数组
			UartIntRxLen=0;
			TcpClosedFlag = strstr (UartRxbuf, "CLOSED\r\n" ) ? 1 : 0;
			return 1;
		}
		return 0;
}
//串口2在1字节接收完成回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	
	if(huart==&huart2)//判断是否串口2
	{
		UartRxFlag=0x55;//接收标志置位
		UartIntRxbuf[UartRxIndex]=UartRxData;//数据写入缓冲区
		UartRxIndex++;//记载数目加1
		if(UartRxIndex>=1024)//缓冲区是1024字节,如果存满,归零
		{
			UartRxIndex=0;
		}
		HAL_UART_Receive_IT(&huart2,(unsigned char*)&UartRxData,1);//继续接收下一字节
 }

}

//1ms调用一次,用来判断是否收完一帧
void UART_RecvDealwith(void)
{
	if(UartRxFlag==0x55)
	{
		if(UartIntRxLen<UartRxIndex)//UartIntRxLen小于UartRxIndex,说明有收到新的数据,把接收长度增加
		{
		UartIntRxLen=UartRxIndex;
		}else
		{
			UartRxTimer++;
			if(UartRxTimer>=50)//50ms,等待,没收到新数据,说明已经收完一帧
			{
				UartRxTimer=0;
				UartRxFlag=0;
				UartRxOKFlag=0x55;
				UartRxIndex=0;
			}
		}
	}
}
void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
UART_RecvDealwith();
  /* USER CODE BEGIN SysTick_IRQn 1 */

  /* USER CODE END SysTick_IRQn 1 */
}

/**
  * @brief This function handles USART2 global interrupt.
  */
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 */

  /* USER CODE END USART2_IRQn 1 */
}

main函数代码

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_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
	HAL_UART_Receive_IT(&huart2, (uint8_t *)&UartRxData, 1);//接收中断使能
	ESP8266_Init();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		ESP8266_STA_TCPClient_Test();//测试TCP通讯
  }
  /* USER CODE END 3 */
}

ESP8266配置相关

#define User_ESP8266_SSID     "CMCC-DAX7"          //wifi名
#define User_ESP8266_PWD      "13588084246"      //wifi密码

#define User_ESP8266_TCPServer_IP     "192.168.10.11"     //服务器IP
#define User_ESP8266_TCPServer_PORT   "8888"      //服务器端口号

  char str[100]={0};
	ESP8266_AT_Test();
	printf("正在配置ESP8266\r\n");
	ESP8266_Net_Mode_Choose(STA);
	while(!ESP8266_JoinAP(User_ESP8266_SSID, User_ESP8266_PWD));
	ESP8266_Enable_MultipleId ( DISABLE );
	while(!ESP8266_Link_Server(enumTCP, User_ESP8266_TCPServer_IP, User_ESP8266_TCPServer_PORT, Single_ID_0));
	while(!ESP8266_UnvarnishSend());
	printf("\r\n配置完成");
    while ( 1 )
    {       
		sprintf (str,"杭州光子物联科技有限公司" );//格式化发送字符串到TCP服务器
		ESP8266_SendString ( ENABLE, str, 0, Single_ID_0 );
		HAL_Delay(200);
		Uart_RecvFlag();//接收数据
        if(TcpClosedFlag) //判断是否失去连接
        {
            ESP8266_ExitUnvarnishSend(); //退出透传模式
            do
            {
                res = ESP8266_Get_LinkStatus();     //获取连接状态
            }   
            while(!res);

            if(res == 4)                     //确认失去连接,重连
            {               
                while (!ESP8266_JoinAP(User_ESP8266_SSID, User_ESP8266_PWD ) );
                while (!ESP8266_Link_Server(enumTCP, User_ESP8266_TCPServer_IP, 			User_ESP8266_TCPServer_PORT, Single_ID_0 ) );        
            } 
            while(!ESP8266_UnvarnishSend());                    
        }
    }  

//对ESP8266模块发送AT指令
// cmd 待发送的指令
// ack1,ack2;期待的响应,为NULL表不需响应,两者为或逻辑关系
// time 等待响应时间
//返回1发送成功, 0失败
bool ESP8266_Send_AT_Cmd(char *cmd,char *ack1,char *ack2,u32 time)
{ 
    UartRecv_Clear(); //重新接收新的数据包
    ESP8266_USART("%s\r\n", cmd);
	 if(ack1==0&&ack2==0)     //不需要接收数据
	 {
	 return true;
	 }
	HAL_Delay(time);   //延时
	HAL_Delay(1000);
	if(Uart_RecvFlag()==1)
	{
	UartRxbuf[UartRxLen]='\0';
	}
    if(ack1!=0&&ack2!=0)
    {
        return ( ( bool ) strstr ( (const char*)UartRxbuf, ack1 ) || 
                         ( bool ) strstr ( (const char*)UartRxbuf, ack2 ) );
    }
    else if( ack1 != 0 )  //strstr(s1,s2);检测s2是否为s1的一部分,是返回该位置,否则返回false,它强制转换为bool类型了
        return ( ( bool ) strstr ( (const char*)UartRxbuf, ack1 ) );

    else
        return ( ( bool ) strstr ( (const char*)UartRxbuf, ack2 ) );

}

 

4.实验效果

电脑TCP服务器收到WIFI的登录信息还有单片机发出的数据

七.CubeMX工程源代码下载

链接:https://pan.baidu/s/1okCg_2S222ugDzX70WaFVw
提取码:gx8l
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行

八.小结

ESP8266 WIFI模块具备强大的功能,‌能够实现与网络的无缝通信。‌它特别适用于物联网领域,‌能够轻松地通过串行通信接口与STM32单片机连接,‌为智能家居、‌智能照明、‌智能车辆等多种应用场景提供解决方案。

本文标签: 二十单片机实战源码模块