本次实验是使用每次传输不超过200B的ESP8266芯片的WiFi模块,WiFi模块内部自有驱动,我们初始化它,只需要发送指定的指令给他就可以了,指定的指令其实是使用USART3的复用的PB10和PB11进行通信,

  • 首先看原理图管脚连接

  • 下载文档,阅读大概的WiFi指令有哪些,并且返回什么

ESP8266_用户手册_V0.3.pdf

  • 下载APP,用于测试连接是否成功

测试.apk

程序编写和讲解

  • 1.明确我要实现app连接并控制LED,同时串口通信要及时输出信息到电脑上,

  • 2.明确我们需要初始化那些外设时钟,LED使用PB0,1,5管脚,串口USART1复用管脚PA9,10,WiFi模块串口USART3复用管脚PB10,PB11,WiFi模块片选CH和复位管脚PA0,PA1,。WiFi模块CH-PD和RST使用管脚PG13和PG14

  • 3.主函数:

  • 4.时钟配置代码,SYSTICK不是由NVIC来控制的,RCC_Configuration()

void RCC_Configuration()
{
//打开系统时钟
SystemInit();
//打开usart1时钟,而串口1使用GPIOA9和GPIOA10复用的, 和LED
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //打开控制WiFi使能与复位的GPIOG和AFIO复用的GPIOB和LED灯
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//打开控制beep的时钟GPIOC--pc0
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
//打开控制WiFiCH-PD和RST的GPIOG
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE);
//WiFi使用usart3
RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
}
  • 5.使用系统时钟滴答systick实现精准延时
void SysTick_Init()
{
if(SysTick_Config(SystemCoreClock /1000000))
{
//capture error
while(1);
} //关闭计数器
//SysTick_CounterCmd(SysTick_Counter_Disable);固件库3.5没有改功能,需要自己操做寄存器
SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}
  • 6.初始化串口PA9,10 - USARTx_Config

  • 7.GPIO_Config初始化,WiFi模块的片选CH引脚使能,和复位重启(RST)引脚

void GPIO_Config( void )
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure; /*开启GPIOA的外设时钟*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE ); /* 配置WiFi模块的片选(CH)引脚 复位重启(RST)引脚*/
/*选择要控制的GPIOA0(CH)引脚和GPIOA1(RST)引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOA, &GPIO_InitStructure ); /* 拉低WiFi模块的片选引脚 */
GPIO_ResetBits( GPIOA, GPIO_Pin_0 ); /* 拉高WiFi模块的复位重启引脚 */
GPIO_SetBits( GPIOA, GPIO_Pin_1 ); }
    1. 控制LED管脚的初始化,这里就不写了
  • 9.WiFi的初始化(只提重点)
    • 9.1 WiFi的CH-PD和RST管脚(PG13,14)初始化

    • 9.2 ESP8266(WiFi)串口初始化ESP8266_USART_Config -- Tx(GPIO_Mode_AF_PP),Rx(GPIO_Mode_IN_FLOATING)

    • 9.3 ESP8266_USART_Config中需要进行使能串口接收中断和串口总线空闲中断,两者是一起的,不懂的,点击:https://blog.csdn.net/qq_29413829/article/details/63262321

    • 9.4 既然设置的了usart3 的接收中断和空闲中断,就需要配置NVIC中断,从而使能IQR某中断通道,每个中断,不管哪个外设软中断还是外部中断,都对应有对应的中断通道,外部中断还多一个EXIT需要配置呢。https://blog.csdn.net/chaoshui7758/article/details/50504319

    • 9.5 配置任何的NVIC对应的通道中断,都需要设定好优先组,其实就是设定好抢占级与优先级位数

    • 9.6 前期初始化

    • 9.7调用WiFi的AT_Test(),即检查是否正常工作

    • 9.8 测试正常工作后,第二步选择工作模式,三种工作模式:softAP 模式, station 模式, softAP + station 共存模式(https://blog.csdn.net/xiaohupashu/article/details/53575097

    • 9.10 指令:AT+CWMODE=1或2或3 --》选择 WIFI 工作模式》》注意,如果选的是3(softAP + station 共存),该指令需要重启AT+RST才能起效

    • 9.11 由于我们本次选择透传模式( 透传模式ESP8266 只负责将数据传到目标地址,不对数据进行处理,发送方和接收方的数据内容、 长度完全一致,传输过程就好像透明一样。)。设置传透模式需要调用函数去设置,其实就是执行了AT+ CIPMODE=1命令

    • 9.12 先大概了解esp8266.c文件主要函数,

    • 9.13 下面详细阅读最终的的初始化WiFi的过程,和怎么使用,不懂可以下载我的工程文件查看:

#include "./Test/test.h"
#include "./ESP8266/bsp_esp8266.h"
#include "./SysTick/bsp_SysTick.h"
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include "./led/bsp_led.h" static uint8_t ucLed1Status = 0, ucLed2Status = 0, ucLed3Status = 0; /**
//本次WiFi使用sta tcp client 透传
*/
void ESP8266_StaTcpClient_UnvarnishTest ( void )
{
char cStr [ 100 ] = { 0 };
char* pCh;
uint8_t ucId; printf("\r\n正在配置esp8266。。。。\r\n"); //使能esp8266
GPIO_SetBits(GPIOG,GPIO_Pin_13);
//AT指令测试。
ESP8266_AT_Test ();
//模式选择
ESP8266_Net_Mode_Choose ( AP ); //:设置模块的 AP IP,输入 :pApIp,模块的 AP IP
while ( ! ESP8266_CIPAP ( "192.168.123.169" ) );
//描述 :WF-ESP8266模块创建WiFi热点,输入 :pSSID,WiFi名称字符串 ,pPassWord,WiFi密码字符串:enunPsdMode,WiFi加密方式代号字符串
while ( ! ESP8266_BuildAP ( "BinghuoLink", "wildfire" , OPEN ) );
// 描述 :WF-ESP8266模块启动多连接 ,AT+CIPMUX=<mode>enable就是使mode=1
ESP8266_Enable_MultipleId ( ENABLE );
//描述 :WF-ESP8266模块开启或关闭服务器模式,8080是服务器端口,1800服务器超市秒数
while ( ! ESP8266_StartOrShutServer ( ENABLE, "8080", "1080" ) );
/*
* 描述 :获取 F-ESP8266 的 AP IP,用于串口输出真实配到的ip,此函数可有可无,测试而已
输入 :pApIp,存放 AP IP 的数组的首地址 ucArrayLength,存放 AP IP 的数组的长度
*/
ESP8266_Inquire_ApIp ( cStr, 20 ); printf ( "\r\n本模块WIFI为%s,密码开放\r\nAP IP 为:%s,开启的端口为:%s\r\n手机网络助手连接该 IP 和端口,最多可连接5个客户端\r\n",
"BinghuoLink", cStr, "8080" ); //查询是不是使用透传选择
ESP8266_Inquire_mode(cStr,20); printf("\n mode是:%s\n",cStr); //定义一个全局的结构体,结构体用于存储串口接收到的数据
strEsp8266_Fram_Record.InfBit.FramLength = 0;//串口数据帧处理结构体 ,在bsp_exp8266.h
strEsp8266_Fram_Record.InfBit.FramFinishFlag = 0; while ( 1 )
{
//如果有数据来,中断回触发,修改FramFinishFlag标志位
if ( strEsp8266_Fram_Record.InfBit.FramFinishFlag )
{
//这里使能usart3的中断使能
USART_ITConfig ( USART3, USART_IT_RXNE, DISABLE ); //禁用串口接收中断
//以'\0'做字符串结束符
strEsp8266_Fram_Record.Data_RX_BUF[strEsp8266_Fram_Record.InfBit.FramLength ] = '\0'; //下面进入接收到的命令进行控制LED了,前面基本实现了利用WiFi透传的
Control(cStr);
//发送数据回APP,但发松之前,获取来自哪个客户端信息 if ( ( pCh = strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+IPD," ) ) != 0 )
{
ucId = * ( pCh + strlen ( "+IPD," ) ) - '0';
//需要调用专用函数发送,但接收使用串口中断从而触发读取。可以...it.c文件查看中断函数
//DISABLE是表明本实验没有使用透传工作模式
ESP8266_SendString ( DISABLE, cStr, strlen ( cStr ), ( ENUM_ID_NO_TypeDef ) ucId );
} //重新
strEsp8266_Fram_Record .InfBit .FramLength = 0;
strEsp8266_Fram_Record .InfBit .FramFinishFlag = 0; USART_ITConfig ( macESP8266_USARTx, USART_IT_RXNE, ENABLE ); //使能串口接收中断
}
}
} void Control(char* cStr)
{
char cCh;
char * pCh; //strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
pCh = strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "CMD_LED_" ); printf("\n\r app发送了啥:%s\r\n",pCh); if(pCh != NULL)
{
cCh = *(pCh +8);
//判断想开那个灯
switch ( cCh )
{
case '1':
cCh = *(pCh +10);
switch ( cCh )
{
case '0':
LED1_OFF ();
ucLed1Status=0;
break;
case '1':
LED1_ON ();
ucLed1Status=1;
break;
default:
break;
}
break;
case '2':
cCh = *(pCh +10);
switch ( cCh )
{
case '0':
LED2_OFF ();
ucLed2Status=0;
break;
case '1':
LED2_ON ();
ucLed2Status=1;
break;
default:
break;
}
break;
case '3':
cCh = *(pCh +10);
switch ( cCh )
{
case '0':
LED3_OFF ();
ucLed3Status=0;
break;
case '1':
LED3_ON ();
ucLed3Status=1;
break;
default:
break;
}
default :
break;
}
//回应app,好让他直到成功了,但只是合并要发送的字符串
//sprintf指的是字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。
sprintf ( cStr, "CMD_LED_%d_%d_%d_ENDLED_END", ucLed1Status, ucLed2Status, ucLed3Status );
}
}
-  9.14 下面是对我的工程文件夹做说明



- 9.15 工程下载:https://files-cdn.cnblogs.com/files/guguobao/WIFI.zip

- 9.16 更详细的esp_8266.c:https://files-cdn.cnblogs.com/files/guguobao/ESP8266.zip

STM32F10xx(高容量)WiFi模块的初始化和使用的更多相关文章

  1. 28-ESP8266 SDK开发基础入门篇--编写wifi模块TCP 客户端程序(官方API版,非RTOS版)

    https://www.cnblogs.com/yangfengwu/p/11432795.html 注:这节实现的功能是WIFI模块作为TCP 客户端,连接咱的TCP服务器,然后实现透传 本来想着做 ...

  2. 智能家居常用WiFi模块

    WiFi模块 WiFi模块就是整个系统的控制中心,控制很简单,就是输出一个开关信号控制继电器,而这个模块的核心是WiFi的连接,手机连接WiFi时需要扫描,输入密码,而这类本身没有屏幕和键盘的硬件设备 ...

  3. Stm32外围模块编程初始化步骤

    Stm32外围模块编程初始化步骤: 一.外部中断 1)初始化 IO 口为输入. 这一步设置你要作为外部中断输入的 IO 口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要 ...

  4. 移植 wifi模块

    本文以realtek 8192CU WiFi模块为例,介绍USB wifi在Jelly Bean 4.1的调试笔记. 1.WIFI打不开现象概述 WiFi打不开是指您在UI的settings下选中Wi ...

  5. RealTek WiFi 模块 RTL8710AF RTL8711AF RTL8711AM RTL8195AM

    瑞昱 8710 是一个完整且自成体系的 WiFi 网络解决方案, 能够独立运行,也可以作为从机搭载于其他主机 MCU 运行. 瑞昱 8710 在搭载应用并作为设备中唯⼀的应⽤处理器时,能够直接从外接闪 ...

  6. 玩转X-CTR100 l STM32F4 l ESP8266串口WIFI模块

    我造轮子,你造车,创客一起造起来!更多塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]- ESP8266是一款非常火的WIFI模块,性价 ...

  7. WIFI模块 RTL8188EUS Realtek

    http://item.taobao.com/item.htm?spm=a230r.1.14.24.KnooKa&id=26119704895 W12 产品是一款采用国际先进台湾瑞昱Realt ...

  8. Android WIFI模块分析

    一:什么是WIFI WIFI是一种无线连接技术.可用于手机.电脑.PDA等终端. WIFI技术产生的目的是改善基于IEEE802.11标准的无线网络产品之间的互通性,也就是说WIFI是基于802.11 ...

  9. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于(Wi-Fi模块AT指令TCP透传方式),MQTT通信控制升级

    实现功能概要 前面的版本都是,定时访问云端的程序版本,如果版本不一致,然后下载最新的升级文件,实现升级. 这一节,在用户程序里面加入MQTT通信,执行用户程序的时候,通过接收MQTT的升级命令实现升级 ...

随机推荐

  1. hive的shell用法(脑子糊涂了,对着脚本第一行是 #!/bin/sh 疯狂执行hive -f 结果报错)

    hive脚本的执行方式 hive脚本的执行方式大致有三种: hive控制台执行: hive -e "SQL"执行: hive -f SQL文件执行:参考hive用法: usage: ...

  2. 安装卸载JDK

    卸载JDK 删除Java的安装目录 删除JAVA_HOME 删除path下关于Java的目录 java-version 安装JDK 百度搜索JDK8,找到下载地址 同意协议 下载电脑对应的版本 双击安 ...

  3. ip_srcroute函数

    当响应某个分组时,I C M P和标准的运输层协议必须把分组带的任意源路由逆转.逆转源路由是通过i p _ s r c r o u t e保存的路由构造的. 7 7 7 - 7 8 3 i p _ s ...

  4. CodeForces 840B - Leha and another game about graph | Codeforces Round #429(Div 1)

    思路来自这里,重点大概是想到建树和无解情况,然后就变成树形DP了- - /* CodeForces 840B - Leha and another game about graph [ 增量构造,树上 ...

  5. P4178 Tree 点分治

    思路:点分治 提交:1次 题解: 要求权值和\(\leq K\) 的路径,我们可以类比点分治的模板,把长为\(len\)是否存在,改为\(len\)的路径的条数,并用用树状数组维护前缀和,这样就可以求 ...

  6. box-orient

    box-orient 语法: box-orient:horizontal | vertical | inline-axis | block-axis 默认值:horizontal 适用于:伸缩盒容器大 ...

  7. LOJ #121. 「离线可过」动态图连通性 LCT维护最大生成树

    这个还是比较好理解的. 你考虑如果所有边构成一棵树的话直接用 LCT 模拟一波操作就行. 但是可能会出现环,于是我们就将插入/删除操作按照时间排序,然后依次进行. 那么,我们就要对我们维护的生成树改变 ...

  8. Spring Boot and Rabbit MQ 异常的时候消息的状态

    我们有一个处理消息的方法. 在处理消息的时候出现了异常,那出现异常后这个消息会怎么处理呢. 根据我们的实际情况的观察,如果出现了异常. 但是你没有捕获或者处理异常,这个消息会一直存在,并且你的系统会持 ...

  9. elasticsearch java索引的增删改查

    1.创建索引并插入数据 Map<String, Object> json = new HashMap<String, Object>(); json.put("use ...

  10. spring事物不回滚的问题

    学习spring分布式事务的时候,自己整了个demo,写test测试的时候发先事物没有回滚.此问题和分布式事务没关系.1.在service层引入@Transaction注解 使用 throw new ...