1.WIFI模块如何驱动
ESP8266使用:第一种作为mcu开发,再次搭建一下他的环境,开发周期长
第二种利用官方固件使用AT指令(AT+**)开发。
我们原理图中使用的是 ESP12F --ESP8266
Ai-Thinker蓝牙模块_无线模块_物联网模块_WiFi模块【安信可官网】
ESP8266系列模组专题 | 安信可科技 (ai-thinker.com)
之前自己绘制的 是使用的ESP8266
提供 Wi-Fi、蓝牙芯片和 AIoT 解决方案 I 乐鑫科技 (espressif.com.cn)
AT固件汇总 | 安信可科技 (ai-thinker.com)
官方资料说明:出厂自带有一个AT固件:支持AT指令的一个程序
发的任何一个指令:前面都以AT开头
2.ESP8266模块配置
1.开时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
2.配置GPIO口
GPIO_InitTypeDef GPIO_InitStructure; //根据这个结构体里面参数,初始化对应GPIO端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //选择管脚10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速率50mhz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置模式为复用推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//选择管脚11
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//设置模式为浮空输入
GPIO_Init(GPIOB, &GPIO_InitStructure);
3.配置串口 以及设置优先级(串口可以任意选择这里选用串口3)
USART_InitTypeDef USART_InitStruct = {0};//可以通过结构体类型
USART_InitStruct.USART_BaudRate = 115200;//波特率
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//五硬件控制流
USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;//发送器和接收器打开
USART_InitStruct.USART_Parity = USART_Parity_No;//没有奇偶校验
USART_InitStruct.USART_StopBits = USART_StopBits_1;//1个停止位
USART_InitStruct.USART_WordLength = USART_WordLength_8b;//8个数据位
USART_Init(USART3,&USART_InitStruct);
4.使能串口3
USART_Cmd(USART3,ENABLE);
USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//允许接收中断
//USART_ITConfig(USART3,USART_IT_IDLE,ENABLE);//允许空闲中断
NVIC_SetPriority(USART3_IRQn,7);//设置优先级0-15
NVIC_EnableIRQ(USART3_IRQn);//使能中断通道
//配置EN引脚PE6
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //选择管脚PE6
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速率50mhz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置模式为复用推挽输出
GPIO_Init(GPIOE, &GPIO_InitStructure);
WIFI_ENABLE();
Delay_nms(500);
接下来进行USART3中断服务函数 不需要调用声明
3.USART3中断服务函数
WIFIDATA wifidata={0};//定义全局变量,保存从USART3接收到的数据
//USART3中断服务函数
void USART3_IRQHandler (void)
{
uint8_t data;
if((USART3->SR&0x1<<5)!=0){//执行该中断函数的原因有很多,所以判断一下是不是接收导致的
//接收数据
data = USART3->DR;//读取接收数据操作,同时也是清空中断标志位的
wifidata.recvbuf[wifidata.recvcnt] = data;//将接收的数据放入缓冲区
wifidata.recvcnt++;//增加接收计数器
wifidata.recvcnt%=1024;//如果缓冲区已满则从头开始覆盖
USART1->DR = data;//回显接收到的数据
}
}
接下来创建串口3发送单字节函数 数组函数 字符串函数
4.串口3发送单字节函数 数组函数 字符串函数
//串口3发送单字节函数
void Usart3Senddata(uint8_t data)
{
//等待发送完成
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==0);
//如果上次发送完成,就发送数据
USART_SendData(USART3,data);
}
//串口3发送数组函数
void Usart3SendArr(uint8_t * data,uint32_t len)
{
uint32_t i=0;
//循环发送数组中的每一个字节
for(i=0;i<len;i++){
Usart3Senddata(*data);
data++;//指针指向下一个元素
}
}
//串口3发送字符串函数
void Usart3Sendstr(uint8_t * data)
{
uint32_t i=0;
//循环直到遇到字符串结束符'\0'
while(*data!='\0'){
Usart3Senddata(*data);
data++;//指针指向下一个元素
}
}
接下来创建用于发送WIFI命令并等待响应的函数
5.用于发送WIFI命令并等待响应的函数
//用于发送WIFI命令并等待特定响应的函数
uint8_t WifiSendCmd(char * cmd,char * recv,uint32_t timeout)
{
uint32_t timecnt=0;
//清除缓冲区
memset(&wifidata,0,sizeof(wifidata));
//发送WIFI命令
Usart3Sendstr((uint8_t*)cmd);
//等待预期响应或者超时
while(strstr((char *)wifidata.recvbuf,recv)==NULL){
timecnt++;
Delay_nms(1);
if(timecnt>=timeout){
printf("发送超时失败%s",cmd);
return 1;
}
}
printf("发送成功");
return 0;
}
//连接到指定的IP地址的函数
uint8_t WifiConnectIP(void)
{
if(WifiSendCmd("AT\r\n","OK",1000) != 0){//测试连接
return 1;
}
if(WifiSendCmd("AT+CWMODE=1\r\n","OK",2000) != 0){//设置工作模式为STA
return 1;
}
if(WifiSendCmd("AT+CWJAP=\"tian\",\"12345678\"\r\n","OK",10000)!= 0){//连接指定WIFI热点
return 1;
}
if(WifiSendCmd("AT+CIPSTART=\"TCP\",\"36.137.226.30\",33451\r\n","OK",10000)!= 0){//开始TCP连接
return 1;
}
if(WifiSendCmd("AT+CIPMODE=1\r\n","OK",1000)!= 0){//设置透传模式
return 1;
}
if(WifiSendCmd("AT+CIPSEND\r\n","OK",1000)!= 0){//准备发发送数据
return 1;
}
return 0;
}
接下来是ESP8266.h
#ifndef _WIFI_H
#define _WIFI_H
#include "stm32f10x.h"
#include "delay.h"
#include "stdio.h"
#include "string.h"
typedef struct{
uint8_t recvbuf[1024];//定义数组用来存储数据
uint16_t recvcnt;//介绍数组下标
}WIFIDATA;
#define WIFI_ENABLE() GPIO_SetBits(GPIOE,GPIO_Pin_6)
#define WIFI_DISABLE() GPIO_ResetBits(GPIOE,GPIO_Pin_6)
void Esp8266_Config(void);
void Usart3Sendstr(uint8_t * data);
uint8_t WifiSendCmd(char * cmd,char * recv,uint32_t timeout);
uint8_t WifiConnectIP(void);
#endif
6.WIFI有两种模式:
STA:连接别的设备热点(比如可以连接手机热点)
AP:释放一个热点(手机可以连接他)
发送指令必须包含\r\n
可以通过PC直接测试WIFI模块了
AT :测试固件的
AT+RST 重启ESP8266
ATE0 关闭回显
ATE1 打开回显
AT+CWMODE_DEF=1 (_DEF有些固件支持,有些不支持)设置工作模式 STA模式(可以连接其他设备热点) 2AP模式 3组合模式
AT+CWJAP_DEF="xyd,"12345678" 连接WIFI
AT+CWSAP— 配置 ESP8266 SoftAP 参数(配置释放的热点)
AT+CIPAP—设置 ESP8266 SoftAP 的 IP 地址
多连接情况下 (AT+CIPMUX=1),才能开启 TCP 服务器。
AT+CIPSERVER—建⽴ TCP 服务器
AT+CIPSTART="TCP","122.114.122.174",39999 以TCP的形式连接服务器
AT+CIPMODE=1 开启透传 //向wifi发送的所有消息(除+++外)都认为不是指令
AT+CIPSEND 启动发送功能
+++ 没有回车 退出透传
AT+CIPCLOSE 退出服务器连接
7.连接服务器需要的步骤
连接网络:
设置位连接热点模式:STA
连接手机热点:名字和密码
连接服务器 ip 和 端口
收发数据:
AT是AT指令还是收发的数据
透传模式(透明传输,所有消息都认为是普通收发的消息)