当前位置: 首页 > 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));
}

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

相关文章:

  • TIME - MoE 模型代码 4——Time-MoE-main/run_eval.py
  • 图形化编程革命:iVX携手AI 原生开发范式
  • MNIST 数据并行 Data Parallel - DP
  • 【目标检测系列】YOLOV1解读
  • Go语言实现豆瓣电影Top250爬虫
  • 掌握 void 类型在函数返回值中的应用
  • MIT 6.S081 2020 Lab3 page tables 个人全流程
  • 添加文字标签
  • Docker使用ClickHouse | ClickHouse 配置用户名密码 | ClickHouse 可视化 | windows系统 | 镜像
  • 类型别名与接口的对比与选择
  • Javascript:数组和函数
  • 【心海资源】【最新话费盗u】【未测】提币对方官方波场+没有任何加密+无后门+前端VUE
  • 专业课复习笔记 5
  • Three.js + React 实战系列 - 职业经历区实现解析 Experience 组件✨(互动动作 + 3D 角色 + 点击切换动画)
  • 【星海随笔】信息安全法律法规概述
  • 单片机调用printf概率性跑飞解决方法
  • 大疆卓驭嵌入式面经及参考答案
  • 论文阅读与写作:《从探索到突破:解密科研和论文写作的思维密码》
  • 《从零构建一个简易的IOC容器,理解Spring的核心思想》
  • GitHub打开缓慢甚至失败的解决办法
  • 孙简任吉林省副省长
  • 技术派|更强的带刀侍卫:从054B型战舰谈谈世界护卫舰发展
  • 多家中小银行存款利率迈入“1时代”
  • 海北州委常委、常务副州长桑本履新青海省供销社理事会主任
  • 第19届威尼斯建筑双年展开幕,中国案例呈现“容·智慧”
  • 韩国执政党总统候选人更换方案被否决,金文洙候选人资格即刻恢复