九、STM32入门学习之WIFI模块(ESP32C3)
ESP32-C3 是乐鑫科技推出的一款高性能、低功耗物联网芯片,专为物联网设备设计,集成了 Wi-Fi 和蓝牙通信功能,具备丰富的外设接口和先进的安全机制。串口U0TXD和U0RXD用于程序的烧录。串口U1TXD和U1RXD用于与外部MCU(stm32)进行通信,如:stm32利用esp32模块进行蓝牙和wifi通信,就是stm32的对应引脚与U1串口连接,并通过它发送AT指令实现功能。
·
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、初始化串口USART2
MX_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){
//清空rxBuffer
memset(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、初始化ESP
ESP32_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、设置工作模式为STA
printf("Set STA Mode\n");
uint8_t* cmd="AT+CWMODE=1\r\n";
ESP32_SendCmd(cmd,strlen((char*)cmd));
//2、连接到指定的AP
printf("Connect to specific AP\n");
cmd="AT+CWJAP=\"FAST_BA9E\",\"123456789\"\r\n";
ESP32_SendCmd(cmd,strlen((char*)cmd));
//3、查询本机IP
printf("local IP address is:\n");
cmd="AT+CIPSTA?\r\n";
ESP32_SendCmd(cmd,strlen((char*)cmd));
}
static void WIFI_AP_MODE(void){
//1、设置工作模式为AP
printf("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、查询本机IP
printf("local IP address is: \n");
cmd= "AT+CIPAP=\"168.168.168.1\"\r\n";
ESP32_SendCmd(cmd,strlen((char*)cmd));
}
串口打印功能的实现略。
更多推荐



所有评论(0)