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

九、STM32入门学习之WIFI模块(ESP32C3)

目录

  • 1、ESP32C3芯片
    • 芯片介绍
    • AT指令集
    • WIFI通信案例
      • main.c
      • esp32.c
      • wifi.c

1、ESP32C3芯片

芯片介绍

ESP32-C3 是乐鑫科技推出的一款高性能、低功耗物联网芯片,专为物联网设备设计,集成了 Wi-Fi 和蓝牙通信功能,具备丰富的外设接口和先进的安全机制。
在这里插入图片描述

  • 串口U0TXD和U0RXD用于程序的烧录。
  • 串口U1TXD和U1RXD用于与外部MCU(stm32)进行通信,如:stm32利用esp32模块进行蓝牙和wifi通信,就是stm32的对应引脚与U1串口连接,并通过它发送AT指令实现功能。

AT指令集

  • 基础指令集
    • AT:测试 AT 启动
    • AT+RST:重启模块
    • AT+GMR:查看版本信息
    • AT+CMD:查询当前固件支持的所有命令及命令类型
    • AT+GSLP:进入 Deep-sleep 模式
    • ATE:开启或关闭 AT 回显功能
    • AT+RESTORE:恢复出厂设置
    • AT+SAVETRANSLINK:设置开机透传模式 信息
    • AT+TRANSINTVL:设置透传模式 模式下的数据发送间隔
    • AT+UART_CUR:设置 UART 当前临时配置,不保存到 flash
    • AT+UART_DEF:设置 UART 默认配置, 保存到 flash
    • AT+SLEEP:设置 sleep 模式
    • AT+SYSRAM:查询当前剩余堆空间和最小堆空间
    • AT+SYSMSG:查询/设置系统提示信息
    • AT+SYSMSGFILTER:启用或禁用系统消息 过滤
    • AT+SYSMSGFILTERCFG:查询/配置系统消息 的过滤器
    • AT+SYSFLASH:查询或读写 flash 用户分区
    • AT+SYSMFG:查询或读写manufacturing nvs 用户分区
    • AT+RFPOWER:查询/设置 RF TX Power
    • AT+SYSROLLBACK:回滚到以前的固件
    • AT+SYSTIMESTAMP:查询/设置本地时间戳
    • AT+SYSLOG:启用或禁用 AT 错误代码提示
    • AT+SLEEPWKCFG:设置 Light-sleep 唤醒源和唤醒 GPIO
    • AT+SYSSTORE:设置参数存储模式
    • AT+SYSREG:读写寄存器
    • AT+SYSTEMP:读取芯片内部摄氏温度值
  • wifi相关的指令集
    • AT+CWINIT:初始化/清理 Wi-Fi 驱动程序
    • AT+CWMODE:查询/设置 Wi-Fi 模式 (Station/SoftAP/Station+SoftAP)
    • AT+CWSTATE:查询 Wi-Fi 状态和 Wi-Fi 信息
    • AT+CWJAP:连接 AP
    • AT+CWRECONNCFG:查询/设置 Wi-Fi 重连配置
    • AT+CWLAPOPT:设置AT+CWLAP 命令扫描结果的属性
    • AT+CWLAP:扫描当前可用的 AP
    • AT+CWQAP:断开与 AP 的连接
    • AT+CWSAP:配置 ESP32-C3 SoftAP 参数
    • AT+CWLIF:查询连接到 ESP32-C3 SoftAP 的 station 信息
    • AT+CWQIF:断开 station 与 ESP32-C3 SoftAP 的连接
    • AT+CWDHCP:启用/禁用 DHCP
    • AT+CWDHCPS:查询/设置 ESP32-C3 SoftAP DHCP 分配的 IPv4 地址范围
    • AT+CWAUTOCONN:上电是否自动连接 AP
    • AT+CWAPPROTO:查询/设置 SoftAP 模式下 802.11 b/g/n 协议标准
    • AT+CWSTAPROTO:设置 Station 模式下 802.11 b/g/n 协议标准
    • AT+CIPSTAMAC:查询/设置 ESP32-C3 Station 的 MAC 地址
    • AT+CIPAPMAC:查询/设置 ESP32-C3 SoftAP 的 MAC 地址
    • AT+CIPSTA:查询/设置 ESP32-C3 Station 的 IP 地址
    • AT+CIPAP:查询/设置 ESP32-C3 SoftAP 的 IP 地址
    • AT+CWSTARTSMART:开启 SmartConfig
    • AT+CWSTOPSMART:停止 SmartConfig
    • AT+WPS:设置 WPS 功能
    • AT+MDNS:设置 mDNS 功能
    • AT+CWJEAP:连接 WPA2 企业版 AP
    • AT+CWHOSTNAME:查询/设置 ESP32-C3 Station 的主机名称
    • AT+CWCOUNTRY:查询/设置 Wi-Fi 国家代码

WIFI通信案例

1、stm32和esp32作为AP(即,路由器) ,并搭建TCP服务器
2、电脑通过wifi接入stm32和esp32构建的路由器
3、电脑的客户端 与 TCP服务器进行通信tcp/ip协议通信。

main.c

#include "main.h"
#include "usart.h"
#include "gpio.h"#include "esp32.h"
#include "wifi.h"
//定义全局缓存区,长度,连接ID,对应IP和端口号
uint8_t rxBuff[1024];
uint16_t rxLen=0;
uint8_t id;
uint8_t ip[16];
uint16_t port;
void SystemClock_Config(void);int main(void){HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();MX_USART2_UART_Init();printf("Init succeed\n");/*uint8_t *cmd = "AT\r\n";ESP32_SendCmd(cmd, strlen((char *)cmd));uint8_t AT[]="AT+GMR\r\n";ESP32_SendCmd(AT,strlen((char*)AT));*/printf("WIFI案例:…\n");//WIFI_Init(AP);WIFI_Init(AP);WIFI_TCP_ServerStart();while (1){WIFI_TCP_ReadData(rxBuff, &rxLen, &id, ip, &port); if(rxLen>0){printf("接收到数据!连接ID:%d,对端IP为:%s,port为:%d,数据长度=%d,内容:%.*s\n",id,ip,port,rxLen,rxLen,rxBuff); WIFI_TCP_SendData(id,rxBuff,rxLen);rxLen=0;}}
}void SystemClock_Config(void){RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}void Error_Handler(void){__disable_irq();while (1){}
}#ifdef  USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line){
}
#endif /* USE_FULL_ASSERT */

esp32.c

#include "esp32.h"
uint8_t respBuffer[1024];
uint16_t respLen;
//初始化
void ESP32_Init(void){//1、初始化串口USART2MX_USART2_UART_Init();	//2、清空ESP32的寄存器复位操作(发送AT复位指令)char *cmd="AT+RST=0\r\n";ESP32_SendCmd((uint8_t*)cmd,strlen((char*)cmd));//3、引入延时,确保重启成功HAL_Delay(2000); //等待复位
}//发送命令
void ESP32_SendCmd(uint8_t* cmd,uint16_t cmdLen){//清空rxBuffermemset(respBuffer,0,1024);//发送命令HAL_UART_Transmit(&huart2,cmd,cmdLen,1000);//读取响应do{ESP32_ReadResponse(respBuffer,&respLen);}while(strstr((char*)respBuffer,"OK")==NULL);	printf("%.*s\n",respLen,respBuffer);
}//接收响应数据
void ESP32_ReadResponse(uint8_t rxBuffer[],uint16_t* len){HAL_UARTEx_ReceiveToIdle(&huart2,rxBuffer,1024,len,1000);
}

wifi.c

#include "wifi.h"//设置WIFI工作模式static void WIFI_STA_MODE(void);
static void WIFI_AP_MODE(void);
//初始化,wifi的工作模式
void WIFI_Init(WIFI_MODE mode){//printf("WIFI_Init begin\n");//1、初始化ESPESP32_Init();//2、设置工作模式以及IP设置if(mode==STA)WIFI_STA_MODE();else if(mode==AP)WIFI_AP_MODE();printf("WIFI_Init succeed\n");}//启动TCP服务器
void WIFI_TCP_ServerStart(void){//1、使能服务器多连接printf("设置服务器多连接模式\n");uint8_t* cmd="AT+CIPMUX=1\r\n";ESP32_SendCmd(cmd,strlen((char*)cmd));//2、开启TCP服务器printf("开启TCP服务器\n");cmd="AT+CIPSERVER=1,8080\r\n";ESP32_SendCmd(cmd,strlen((char*)cmd));//2、设置IPD数据格式(显示详情,主动模式和被动模式)printf("设置IPD数据格式\n");cmd="AT+CIPDINFO=1\r\n";ESP32_SendCmd(cmd,strlen((char*)cmd));
}//发送数据(包含连接ID,和数据长度)
void WIFI_TCP_SendData(uint8_t linkId, uint8_t *data, uint16_t length{//1、设置发送数据的连接ID和长度printf("给对方发送数据\n");uint8_t snedCmd[50]={0};sprintf((char*) snedCmd,"AT+CIPSEND=%d,%d\r\n",linkId,length);ESP32_SendCmd(snedCmd,strlen((char*)snedCmd));//2、通过步骤1,进入数据模式,直接通过串口发送数据HAL_UART_Transmit(&huart2,data,length,1000);
}//定义全局缓冲区接收IPD数据
uint8_t tempBuff[1024]={0};
uint16_t tempLen=0;
//接收数据(包含连接ID,接收缓存,接收数据长度,对方IP和端口号)
void WIFI_TCP_ReadData(uint8_t rxBuff[],uint16_t *rxLen, uint8_t *linkId, uint8_t *IP, uint16_t* port){//1、从串口接收数据HAL_UARTEx_ReceiveToIdle(&huart2,tempBuff,1024,&tempLen,1000);//2、从接收到的IPD数据中解析数据//筛选出以+IPD开头的字符,进行过滤,因为esp32会主动上报一些其它状态信息if(strstr((char *)tempBuff,"+IPD")!=NULL){//利用scanf和正则表达式提取对应信息"%*[\r\n]+IPD,%hhu,%hu,\"%[^\"]\",%hu"sscanf((char*)tempBuff,"%*[\r\n]+IPD,%hhu,%hu,\"%[^\"]\",%hu",linkId,rxLen,IP,port);//将真正的数据复制到rxBuff缓冲区中char* pData=strstr((char *)tempBuff,":")+1;memcpy(rxBuff,pData,*rxLen);}
}static void WIFI_STA_MODE(void){//1、设置工作模式为STAprintf("Set STA Mode\n");uint8_t* cmd="AT+CWMODE=1\r\n";ESP32_SendCmd(cmd,strlen((char*)cmd));	//2、连接到指定的APprintf("Connect to specific AP\n");cmd="AT+CWJAP=\"FAST_BA9E\",\"123456789\"\r\n";ESP32_SendCmd(cmd,strlen((char*)cmd));//3、查询本机IPprintf("local IP address is:\n");cmd="AT+CIPSTA?\r\n";ESP32_SendCmd(cmd,strlen((char*)cmd));
}
static void WIFI_AP_MODE(void){//1、设置工作模式为APprintf("Set AP Mode\n");uint8_t* cmd="AT+CWMODE=2\r\n";ESP32_SendCmd(cmd,strlen((char*)cmd));//2、主动设置自己的网络参数,如WIFI名和密码printf("Set AP parameters(wifi name,password,channel and encode)\n");cmd="AT+CWSAP=\"YaoLiangWIFISTM32\",\"0123456789\",5,3\r\n"; //这里的5是信道号,3是加密方式ESP32_SendCmd(cmd,strlen((char*)cmd));	//3、查询本机IPprintf("local IP address is: \n");cmd= "AT+CIPAP=\"168.168.168.1\"\r\n";ESP32_SendCmd(cmd,strlen((char*)cmd));
}

串口打印功能的实现略。
在这里插入图片描述

http://www.xdnf.cn/news/395911.html

相关文章:

  • 轻量级高性能推理引擎MNN 学习笔记 01.初识MNN
  • 跟我学c++高级篇——模板元编程之十三处理逻辑
  • E+H流量计profibus协议如何转换成profinet协议
  • C语言_函数调用栈的汇编分析
  • 【AI论文】作为评判者的感知代理:评估大型语言模型中的高阶社会认知
  • 二分查找的理解
  • Object类
  • wordpress自学笔记 第三节 独立站产品和类目的三种展示方式
  • RabbitMQ的工作队列模式和路由模式有什么区别?
  • 2. cef 及 cefcapi
  • 全国青少年信息素养大赛 Python编程挑战赛初赛 内部集训模拟试卷七及详细答案解析
  • Qt开发经验 --- 避坑指南(13)
  • 梦熊联盟:202505基础语法-题解
  • 沐言智语开源Muyan-TTS模型,词错率、语音质量评分都处于开源模型的一线水平,推理速度相当快~
  • Go语言运算符详解
  • No module named ‘xxx’报错原因及解决方式
  • DedeCMS-Develop-5.8.1.13-referer命令注入研究分析 CVE-2024-0002
  • css背景相关
  • 【大模型】解决最新的Dify1.3.1版本 无法基于Ollama成功添加模型
  • 进程间关系与守护进程
  • Quantum convolutional nerual network
  • 责任链模式
  • 苍穹外卖(数据统计–Excel报表)
  • C语言常见的文件操作函数总结
  • 互联网大厂Java求职面试:电商商品推荐系统中的AI技术应用
  • 超标量处理器设计4-分支预测
  • TypeScript 装饰器高级用法详解
  • Kubernetes排错(十四):Pod状态异常排查手册
  • 深入理解 TypeScript 中 unknown 类型:安全性与使用指南
  • 深度学习:系统性学习策略(二)