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));
}

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

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐