九、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));
}
串口打印功能的实现略。