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.pswp.cn/diannao/93857.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法26. 删除有序数组中的重复项

给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0c;你…

ROS2中传输样条曲线

在ROS2中传输样条曲线需要解决两个核心问题&#xff1a;**如何结构化表示曲线数据**和**如何高效传输**。以下是一套完整方案&#xff0c;结合自定义消息设计、序列化优化和QoS配置实现可靠传输&#xff1a;---### &#x1f4d0; 一、定义样条曲线的自定义消息 样条曲线通常由控…

Win11怎样安装DirectX 9

通过微软官方下载安装&#xff1a;确认系统兼容性并准备&#xff1a;确保显卡驱动为最新版本&#xff0c;因为 DirectX 与显卡驱动程序紧密相关。同时&#xff0c;可暂时关闭防病毒软件和防火墙&#xff0c;防止其干扰安装过程。下载安装程序&#xff1a;访问微软官方网站下载 …

RAGFLOW~Enable RAPTOR

Enable RAPTOR 一种递归抽象方法&#xff0c;用于长上下文知识检索和摘要&#xff0c;在广泛语义理解和细微细节之间取得平衡。 RAPTOR&#xff08;递归抽象处理用于树状组织检索&#xff09;是一种在2024年论文中引入的增强文档预处理技术。它旨在解决多跳问答问题&#xff0c…

【机器人+相机通讯】宇树科技相机通信

https://github.com/unitreerobotics/xr_teleoperate/blob/main/README_zh-CN.md 相机驱动与服务端 https://github.com/unitreerobotics/xr_teleoperate/blob/main/teleop/image_server/image_server.py 其中相机如果是realsense, 安装好驱动后&#xff0c;可以使用命令查看…

机械学习中的一些优化算法(以逻辑回归实现案例来讲解)

一、混淆矩阵混淆矩阵是机器学习中评估分类模型性能的重要工具&#xff0c;尤其适用于二分类或多分类任务。它通过展示模型预测结果与实际标签的匹配情况&#xff0c;帮助理解模型的错误类型&#xff08;如假阳性、假阴性等&#xff09;。以下通过二分类场景为例&#xff0c;结…

龙蜥受邀参加2025开放计算技术大会,解码基础模型驱动下的系统创新与生态共建

开放计算技术大会由全球最大的开放计算社区 OCP 发起&#xff0c;是开放计算领域生态覆盖最广且最具影响力的亚洲年度技术盛会。本届大会由 OCP 与 OCTC&#xff08;中国电子工业标准化技术协会开放计算标准工作委员会&#xff09;两大开放组织联合主办&#xff0c;将于 8 月 7…

第三阶段—8天Python从入门到精通【itheima】-140节(pysqark实战——基础准备)

目录 140节——pysqark实战——基础准备 1.学习目标 2.pysqark库的安装 3.pyspark的路径安装问题 一、为什么不需要指定路径&#xff1f; 二、如何找到 pyspark 的具体安装路径&#xff1f; 三、验证一下&#xff1a;直接定位 pyspark 的安装路径 四、总结&#xff1a;记…

数据库中使用SQL作分组处理01(简单分组)

1.简单分组GroupBy什么就Select什么SELECT Name,Score From StudentScore GROUP BY Name,Score2.聚合函数(MAX SUM AVG COUNT)&#xff08;1&#xff09;计算1.表的全部字段都可以用聚合函数&#xff0c;但是筛选聚合函数的结果要用Having关键字2.聚合函数默认排除Null值IDName…

Linux基本服务——web服务解析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 Web服务解析 虚拟Web主机 Web目录访问控制 Web服务解析 用途&#xff1a;基于 B/S 架构提供网页的服务端程序 应用层协议&#xff1a;HTTP&#xff08;TCP 80…

深入理解缓存淘汰策略:LRU vs LFU 完全解析

深入理解缓存淘汰策略&#xff1a;LRU vs LFU 完全解析 文章目录深入理解缓存淘汰策略&#xff1a;LRU vs LFU 完全解析前言一、基础概念解析1.1 LRU&#xff08;Least Recently Used&#xff09;- 最近最少使用1.2 LFU&#xff08;Least Frequently Used&#xff09;- 最少使用…

【C语言】字符函数与字符串函数详解

文章目录一、字符分类函数二、字符转换函数三、strlen函数&#xff1a;计算字符串长度功能说明使用示例模拟实现四、strcpy函数&#xff1a;字符串拷贝功能说明模拟实现五、strcat函数&#xff1a;字符串追加功能说明模拟实现六、strcmp函数&#xff1a;字符串比较比较规则模拟…

uvicorn 启动重复加载 多次加载

目录 uvicorn 启动重复加载 多次加载 解决方法1&#xff1a; 解决方法2&#xff1a; uvicorn 启动重复加载 多次加载 fastapi_aa 是当前类 解决方法1&#xff1a; import uvicornfrom fastapi import FastAPIapp FastAPI()if __name__ "__main__":if sys.gett…

Bard AI本地部署教程:在自己的服务器上运行谷歌AI

Bard AI本地部署教程:在自己的服务器上运行谷歌AI 关键词:Bard AI、本地部署、服务器、谷歌AI、运行教程 摘要:本文旨在为大家详细介绍如何在自己的服务器上实现Bard AI的本地部署。我们会从背景知识讲起,逐步深入到核心概念、算法原理、操作步骤,还会提供项目实战案例和实…

应急响应处置案例(上)

本文目录 目录 本文目录 Web安全事件 概述 案例1 - webshell 背景 排查情况 天眼 服务器 案例2 - Struts2 排查情况 天眼 服务器 案例3 - Redis未授权 背景 排查情况 天眼 服务器 案例4 - EW内网穿透 背景 排查情况 天眼 服务器 案例5 - 一句话木马 背…

面试官问我:“为什么不能完全用对象替代指针?”我笑了:看看Google和Linux内核代码就知道了!

本篇摘要 本篇将以最通俗易懂的语言&#xff0c;形象的讲述为什么很多情境下&#xff0c;我们优先考虑的使用指针而不是对象本身&#xff0c;本篇将给出你答案&#xff01; 一.从一个生活例子说起&#xff0c;形象秒懂 想象一下&#xff0c;你去图书馆借书&#xff0c;下面你…

CAMx大气污染模拟全流程:Linux编译/多重嵌套配置/SMOKE清单预处理/SA-DDM-PA工具应用与科研绘图结果可视化分析

CAMx模型是一个基于大气化学&#xff0c;针对臭氧、颗粒物和雾霾天气过程的大气污染物计算模型。【目标】&#xff1a;1、掌握CAMx模式的区域空气质量模拟案例配置技术方法2、掌握SMOKE模型的CAMx模式大气排放清单输入准备方法3、掌握CAMx模式污染来源解析工具&#xff08;SA&a…

嵌入式学习笔记-MCU阶段-DAY10ESP8266模块

1.ESP8266概述 官方网址&#xff1a;ESP8266 Wi-Fi MCU I 乐鑫科技 (espressif.com.cn) ESP8266模块---wifi模块 产品特点&#xff1a; 2.ESP8266中的wifi: ESP8266EX ⽀持 TCP/IP 协议&#xff0c;完全遵循 802.11 b/g/n WLAN MAC 协议&#xff0c;⽀持分布式控制功能 (DC…

如何快速通过软件项目验收,第三方软件检测机构的重要性

在客户和开发团队之间&#xff0c;最后临门一脚的项目验收环节总容易出现各种问题&#xff0c;以至于时间无限拉长&#xff0c;久久不见结束&#xff0c;为此给大家准备了一份如何快速通过软件项目验收的内容来帮助大家结束持久战。 一、项目验收准备材料 &#xff08;一&…

洛谷做题3:P5711 【深基3.例3】闰年判断

文章目录题目描述输入格式输出格式输入输出样例分析代码题目描述 输入一个年份&#xff0c;判断这一年是否是闰年&#xff0c;如果是输出 1&#xff0c;否则输出 0。 1582 年以来&#xff0c;闰年的定义&#xff1a; 普通闰年&#xff1a;公历年份是 4 的倍数&#xff0c;且不…