STM32-ESP8266Wi-Fi模块使用USART实现通信/创建AP和STA模式配置教程(寄存器版)_stm32-esp8266-wifi模块(ap模式发送数据)
本章思维导图:
ESP8266WIFI模块简介
ESP8266 是一款由乐鑫科技推出的低成本、高性能 Wi-Fi 模块,广泛应用于物联网和嵌入式开发领域。
WIFI的频段5G和2.4G
2.4G Wi-Fi与5G Wi-Fi最本质的区别即工作频段(无线电波的频率)不一样;
2.4GWi-Fi工作频段为:2.4GHZ~2.4835GHZ;
5GWi-Fi工作频段为:5.15GHZ~5.350GHZ和5.725GHZ和5.850GHZ;
WIFI的信道
目前常用的频段有2个5G和2.4G频段,每个频段又分为若干频道,又称为信道。如果把频段理解为高速公路的话,那么信道可以理解高速公路上的车道。
WFIF模块
SMT32F10x系统的MCU如果想通过WIFI联网,必须配备WFI模块。(互联型MCU内置了WIFI外设,不用额外配置WIFI模块)。本章讲解目前市场上主流的WIFI模块乐鑫公司的ESP8266;
ESP8266与MCU的通信方式:通常大多以串口的方式进行连接,ESP8266也支持IIC和SPI通讯;
ESP8266开发方式
ESP8266AT指令集:AT 命令以 “AT” 开始,代表 Attention,以新的一行 (CR LF) 为结尾。输入的每条命令都会返回 OK 或 ERROR 的响应,表示当前命令的最终执行结果。注意,所有 AT 命令均为串行执行,每次只能执行一条命令。因此,在使用 AT 命令时,应等待上一条命令执行完毕后,再发送下一条命令。如果上一条命令未执行完毕,又发送了新的命令,则会返回 busy p...
常用AT指令有:(本章会上传AT指令集文件,方便小伙伴们创建ESP8266模式)
AT:测试指令
AT+CWLP:列出所有可访问的WiFi
AT+CWMODE=? :设置模式
AT+CIPSIART=”type”,”address”,port:建立TCP或UDP连接
ESP8266三种模式:
AP模式:创建热点,最多支持 5 个设备接入(如作为移动热点共享网络)。类似与路由器功能,简单理解就是开放一个热点信息模式;
STA模式:作为客户端连接路由器,适用于远程控制(如智能家居设备联网)。连接热点。简单理解就是联网模式;
AP+STA模式:同时作为客户端和服务端,实现无缝切换(如设备既连接路由器又允许其他设备接入)。先连接一个可上网的热点(STA)在开放一个热点信息(AP)就是两种模式同时存在;
USART3配置
根据原理图,查看对应引脚
如图所示:ESP8266跟STM32连接的引脚分别为:
ESP8266的22发送TX引脚连接STM32的PB11串口接收引脚;
ESP8266的21接收RX引脚连接STM32的PB10串口发送引脚;
ESP8266是采用USART串口3与STM32进行通信的;所以STM32PB11引脚应设置为复用输入模式,STM32PB10引脚应设置为复用输出模式;
USART3串口配置教程
USART3配置步骤:
1. 开时钟
2. 配置GPIO模式
3. 通过在USART_CR1寄存器上置位UE位来激活USART
4. 编程USART_CR1的M位来定义字长。
5. 在USART_CR2中编程停止位的位数。
6. 利用USART_BRR寄存器选择要求的波特率。(查看第二章的系统架构找到 USART3属于APB1上,在第六章的时钟树上找到APB1总线工作频率;用工作频率/波特率:(USART1>BRR=72000000/bps)注意要换算成HZ单位因为对应秒时间
7. 设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送。
8. 设置USART_CR1的RE位。激活接收器,使它开始寻找起始位。
9. 接收缓冲区非空中断使能
10. 开启空闲帧中断
11. 调用中断设置优先级函数
代码示例:
/* 串口3初始化函数 ESP8266的22发送TX引脚连接STM32的PB11串口接收引脚; ESP8266的21接收RX引脚连接STM32的PB10串口发送引脚; 形参bps为设置的波特率*/void USART3_Init(u32 bps){ //1. 开时钟 RCC->APB1ENR|=1<APB2ENR|=1<APB1RSTR|=1<APB1RSTR&=~(1<CRH&=0xffff00ff;//清空PB10和PB11引脚模式 GPIOB->CRH|=0x00008b00;//PB11为输入模式,PB10为输出模式 //3. 通过在USART_CR1寄存器上置位UE位来激活USART USART3->CR1|=1<CR1&=~(1<CR2&=~(0x3<BRR=72000000/bps)注意要换算成HZ单位因为对应秒时间 USART3->BRR=36000000/bps; //7.?设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送。 USART3->CR1|=1<CR1|=1<CR1|=1<CR1|=1<<4; //11.?调用中断设置优先级函数 STM32_SetNVICPriority(USART3_IRQn,1,1);}
串口3底层发送数据函数
代码示例:
/*串口3底层发送数据函数*/void USART3_TX(u8 *dat){ while(*dat) { USART3->DR=*dat++; while(USART3->SR&1<<7){};//等待数据发送完成 }}
串口3中断接收服务函数
代码示例:
/* 串口3中断服务函数*/u8 USART3_buffer[1024];//接收数据缓冲区u32 USART3_cnt=0;//缓冲区数组下标u8 USART3_flag=0;//标志位void USART3_IRQHandler(void){ u8 dat=0; if(USART3->SR&1<DR; if(USART3_cntSR&1<DR; USART3_flag=1; } }
配置ESP8266Wi-Fi模块AP和STA模式
STM32通过UART串口与ESP8266模块通信,利用AT指令集控制ESP8266的工作模式、网络连接及数据传输。ESP8266默认波特率为115200,支持多种模式(Station、AP、Station+AP),并通过AT指令动态切换。
配置AP模式
STM32通过USART3(串口3)向ESP8266模块发送AT指令集,配置其进入AP(Access Point,无线接入点)模式,使ESP8266作为Wi-Fi热点运行,供其他设备连接。
配置AP模式指令集代码(本章会上传指令集代码文件):
通过USART3发送以下AT指令序列
ESP8266_AP_SERVER_MODE{\"AT\\r\\n\" --测试指令\"ATE0\\r\\n\" --关回显\"AT+CWMODE=2\\r\\n\"--设置为服务器模式\"AT+RST\\r\\n\" --模块复位\"ATE0\\r\\n\" --关回显\"AT+CWSAP=\\\"%s\\\",\\\"%s\\\",1,4\\r\\n\" --设置wifi信息\"AT+CIPMUX=1\\r\\n\"--开启多连接\"AT+CIPSERVER=1,%d\\r\\n\" --设置端口号\"AT+CIFSR\\r\\n\" --查询IP}
配置AP模式代码示例:
#include \"LED.h\"#include \"Delay.h\"#include \"KEY.h\"#include \"USART1.h\"#include \"stdio.h\"#include \"USART3.h\"char *ESP8266_AP_SERVER_MODE[]={\"AT\\r\\n\" , // --测试指令\"ATE0\\r\\n\" , //--关回显\"AT+CWMODE=2\\r\\n\",//--设置为服务器模式\"AT+RST\\r\\n\", //--模块复位\"ATE0\\r\\n\", //--关回显\"AT+CWSAP=\\\"LYF_WiFi\\\",\\\"LYF77777\\\",1,4\\r\\n\", //--设置wifi信息\"AT+CIPMUX=1\\r\\n\",//--开启多连接\"AT+CIPSERVER=1,8088\\r\\n\", //--设置端口号\"AT+CIFSR\\r\\n\", //--查询IP};int main(){ LED_Init();//LED灯初始化函数 KEY_Init();//按键初始化函数 USART3_Init(115200);//USART3串口3初始化函数 printf(\"各模块初始化完成\\n\"); u8 key=0; u8 index=0; while(1) { key=KEY_get(); if(key) { LED1(1); Delay_MS(50); LED1(0); printf(\"发送指令集:%s\\n\",ESP8266_AP_SERVER_MODE[index]); USART3_TX((u8*)ESP8266_AP_SERVER_MODE[index]); index++; if(index==9) { index=0; } } if(USART3_flag) { USART3_buffer[USART3_cnt]=\'\\0\'; printf(\"发送指令集返回状态:%s\\n\",USART3_buffer); USART3_cnt=0; USART3_flag=0; } }}
创建一个WiFi名称为LYF_WiFi的热点信息、密码为:LYF77777、端口号为:8088;
代码运行效果图:
配置STA模式
STM32通过USART3(串口3)向ESP8266模块发送AT指令集,使其配置ESP8266为STA模式(Station模式,即客户端模式)
配置STA模式指令集代码(本章会上传指令集代码文件):
通过USART3发送以下AT指令序列
ESP8266_STA_TCPserver[]={\"AT\\r\\n\",//测试指令\"ATE0\\r\\n\",//关回显\"AT+CWMODE=3\\r\\n\",//AP+STA共存模式\"AT+RST\\r\\n\",//模块复位\"ATE0\\r\\n\",//关回显\"AT+CWJAP=\\\"liyyff\\\",\\\"12345678\\\"\\r\\n\",//连接wifi\"AT+CIPMUX=1\\r\\n\",//设置多连接\"AT+CIFSR\\r\\n\",//查询IP\"AT+CIPSERVER=1,100\\r\\n\",//建立TCP服务器\"AT+CIPSTART=\\\"TCP\\\",\\\"192.168.1.118\\\",8080\\r\\n\",//设置端口号,连接服务器\"AT+CIPMODE=1\\r\\n\",//设置透传模式\"AT+CIPSEND\\r\\n\",//开始发送数据};
配置STA模式代码示例:
#include \"LED.h\"#include \"Delay.h\"#include \"KEY.h\"#include \"USART1.h\"#include \"stdio.h\"#include \"USART3.h\"char *ESP8266_STA_TCPClient[]={\"AT\\r\\n\",//测试指令\"ATE0\\r\\n\",//关回显\"AT+CWMODE=1\\r\\n\",//设置客户端模式\"AT+RST\\r\\n\",//模块复位\"ATE0\\r\\n\",//关回显\"AT+CWJAP=\\\"HUAWEIshui\\\",\\\"asdfghjkl12\\\"\\r\\n\",//连接wifi\"AT+CIPMUX=0\\r\\n\",//设置单连接\"AT+CIFSR\\r\\n\",//查询IP\"AT+CIPSTART=\\\"TCP\\\",\\\"192.168.43.204\\\",8080\\r\\n\",//设置端口号,连接服务器\"AT+CIPMODE=1\\r\\n\",//设置透传模式\"AT+CIPSEND\\r\\n\",//开始发送数据};int main(){ LED_Init();//LED灯初始化函数 KEY_Init();//按键初始化函数 USART3_Init(115200);//USART3串口3初始化函数 printf(\"各模块初始化完成\\n\"); u8 key=0; u8 index=0; while(1) { key=KEY_get(); if(key) { LED1(1); Delay_MS(50); LED1(0); printf(\"发送指令集:%s\\n\",ESP8266_STA_TCPClient[index]); USART3_TX((u8*)ESP8266_STA_TCPClient[index]); index++; if(index==12) { index=0; } } if(USART3_flag) { USART3_buffer[USART3_cnt]=\'\\0\'; printf(\"发送指令集返回状态:%s\\n\",USART3_buffer); USART3_cnt=0; USART3_flag=0; } }}
先用电脑创建一个liyyff名称的热点信息,密码为:12345678,频段为:2.4GHZ,IP地址为:192.168.1.118,设置好AT指令利用串口3发送,使其ESP8266连接热点信息;
代码运行结果:
制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!