当前位置: 首页 > news >正文

STM32-ESP8266Wi-Fi模块使用USART实现通信/创建AP和STA模式配置教程(寄存器版)

本章思维导图:

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<<18;//开启USART3时钟RCC->APB2ENR|=1<<3;//开启PB时钟RCC->APB1RSTR|=1<<18;//开启USART3复位时钟RCC->APB1RSTR&=~(1<<18);//关闭复位时钟//2. 配置GPIO模式GPIOB->CRH&=0xffff00ff;//清空PB10和PB11引脚模式GPIOB->CRH|=0x00008b00;//PB11为输入模式,PB10为输出模式//3. 通过在USART_CR1寄存器上置位UE位来激活USARTUSART3->CR1|=1<<13;//4.?编程USART_CR1的M位来定义字长。USART3->CR1&=~(1<<12);//5.?在USART_CR2中编程停止位的位数。USART3->CR2&=~(0x3<<12);//6.?利用USART_BRR寄存器选择要求的波特率。(查看第二章的系统架构找到 ?USART3属于APB1上,在第六章的时钟树上找到APB1总线工作频率;用工作频率/波特率:(USART1>BRR=72000000/bps)注意要换算成HZ单位因为对应秒时间USART3->BRR=36000000/bps;//7.?设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送。USART3->CR1|=1<<3;//8.?设置USART_CR1的RE位。激活接收器,使它开始寻找起始位。USART3->CR1|=1<<2;//9. 接收缓冲区非空中断使能USART3->CR1|=1<<5;//10.?开启空闲帧中断USART3->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<<5)//接收数据中断{dat=USART3->DR;if(USART3_cnt<1024){USART3_buffer[USART3_cnt]=dat;USART3_cnt++;}else{USART3_cnt=0;}}if(USART3->SR&1<<4)//空闲帧中断{dat=USART3->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连接热点信息;

代码运行结果:


制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!

http://www.dtcms.com/a/309582.html

相关文章:

  • 从0开始学习R语言--Day64--决策树回归
  • 流式编程的中间操作
  • 机器学习sklearn:随机森林的决策树
  • 低通滤波器的原理以及作用
  • C# 引用外部项目
  • 切比雪夫不等式
  • 网页从点击到显示:前端开发视角下的旅程
  • 在SQL SERVER 中如何用脚本实现每日自动调用存储过程
  • 大模型开发框架LangChain之构建知识库
  • 高速公路桥梁安全监测系统解决方案
  • 技术栈:基于Java语言的搭子_搭子社交_圈子_圈子社交_搭子小程序_搭子APP平台
  • 安全专家发现利用多层跳转技术窃取Microsoft 365登录凭证的新型钓鱼攻击
  • 【C#学习Day14笔记】泛型、集合(数组列表Arraylist、列表list)与字典
  • Python 中的可迭代、迭代器与生成器——从协议到实现再到最佳实践
  • 最新docker国内镜像源地址大全
  • AttributeError: ChatGLMTokenizer has no attribute vocab_size
  • 强反光干扰下识别率↑89%!陌讯多模态融合算法在烟草SKU识别的实战解析
  • MySQL分析步
  • U-Net vs. 传统CNN:为什么医学图像分割需要跳过连接?
  • C语言的复合类型、内存管理、综合案例
  • 【AI 加持下的 Python 编程实战 2_12】第九章:繁琐任务的自动化(上)——自动清理电子邮件文本
  • PendingIntent相关流程解析
  • MySQL——事务详解
  • React Refs:直接操作DOM的终极指南
  • RAGFlow Agent 知识检索节点源码解析:从粗排到精排的完整流程
  • Java学习第九十六部分——Eureka
  • Elasticsearch IK 中文分词器指南:从安装、配置到自定义词典
  • IPAM如何帮助企业解决IP冲突、识别未经授权设备并管理子网混乱
  • MAC 升级 Ruby 到 3.2.0 或更高版本
  • ARM Cortex-M 处理器的应用