STM32F10xx(高容量)WiFi模块的初始化和使用
本次实验是使用每次传输不超过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 );
}
- 控制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模块的初始化和使用的更多相关文章
- 28-ESP8266 SDK开发基础入门篇--编写wifi模块TCP 客户端程序(官方API版,非RTOS版)
https://www.cnblogs.com/yangfengwu/p/11432795.html 注:这节实现的功能是WIFI模块作为TCP 客户端,连接咱的TCP服务器,然后实现透传 本来想着做 ...
- 智能家居常用WiFi模块
WiFi模块 WiFi模块就是整个系统的控制中心,控制很简单,就是输出一个开关信号控制继电器,而这个模块的核心是WiFi的连接,手机连接WiFi时需要扫描,输入密码,而这类本身没有屏幕和键盘的硬件设备 ...
- Stm32外围模块编程初始化步骤
Stm32外围模块编程初始化步骤: 一.外部中断 1)初始化 IO 口为输入. 这一步设置你要作为外部中断输入的 IO 口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要 ...
- 移植 wifi模块
本文以realtek 8192CU WiFi模块为例,介绍USB wifi在Jelly Bean 4.1的调试笔记. 1.WIFI打不开现象概述 WiFi打不开是指您在UI的settings下选中Wi ...
- RealTek WiFi 模块 RTL8710AF RTL8711AF RTL8711AM RTL8195AM
瑞昱 8710 是一个完整且自成体系的 WiFi 网络解决方案, 能够独立运行,也可以作为从机搭载于其他主机 MCU 运行. 瑞昱 8710 在搭载应用并作为设备中唯⼀的应⽤处理器时,能够直接从外接闪 ...
- 玩转X-CTR100 l STM32F4 l ESP8266串口WIFI模块
我造轮子,你造车,创客一起造起来!更多塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]- ESP8266是一款非常火的WIFI模块,性价 ...
- WIFI模块 RTL8188EUS Realtek
http://item.taobao.com/item.htm?spm=a230r.1.14.24.KnooKa&id=26119704895 W12 产品是一款采用国际先进台湾瑞昱Realt ...
- Android WIFI模块分析
一:什么是WIFI WIFI是一种无线连接技术.可用于手机.电脑.PDA等终端. WIFI技术产生的目的是改善基于IEEE802.11标准的无线网络产品之间的互通性,也就是说WIFI是基于802.11 ...
- ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于(Wi-Fi模块AT指令TCP透传方式),MQTT通信控制升级
实现功能概要 前面的版本都是,定时访问云端的程序版本,如果版本不一致,然后下载最新的升级文件,实现升级. 这一节,在用户程序里面加入MQTT通信,执行用户程序的时候,通过接收MQTT的升级命令实现升级 ...
随机推荐
- hive的shell用法(脑子糊涂了,对着脚本第一行是 #!/bin/sh 疯狂执行hive -f 结果报错)
hive脚本的执行方式 hive脚本的执行方式大致有三种: hive控制台执行: hive -e "SQL"执行: hive -f SQL文件执行:参考hive用法: usage: ...
- 安装卸载JDK
卸载JDK 删除Java的安装目录 删除JAVA_HOME 删除path下关于Java的目录 java-version 安装JDK 百度搜索JDK8,找到下载地址 同意协议 下载电脑对应的版本 双击安 ...
- 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 ...
- CodeForces 840B - Leha and another game about graph | Codeforces Round #429(Div 1)
思路来自这里,重点大概是想到建树和无解情况,然后就变成树形DP了- - /* CodeForces 840B - Leha and another game about graph [ 增量构造,树上 ...
- P4178 Tree 点分治
思路:点分治 提交:1次 题解: 要求权值和\(\leq K\) 的路径,我们可以类比点分治的模板,把长为\(len\)是否存在,改为\(len\)的路径的条数,并用用树状数组维护前缀和,这样就可以求 ...
- box-orient
box-orient 语法: box-orient:horizontal | vertical | inline-axis | block-axis 默认值:horizontal 适用于:伸缩盒容器大 ...
- LOJ #121. 「离线可过」动态图连通性 LCT维护最大生成树
这个还是比较好理解的. 你考虑如果所有边构成一棵树的话直接用 LCT 模拟一波操作就行. 但是可能会出现环,于是我们就将插入/删除操作按照时间排序,然后依次进行. 那么,我们就要对我们维护的生成树改变 ...
- Spring Boot and Rabbit MQ 异常的时候消息的状态
我们有一个处理消息的方法. 在处理消息的时候出现了异常,那出现异常后这个消息会怎么处理呢. 根据我们的实际情况的观察,如果出现了异常. 但是你没有捕获或者处理异常,这个消息会一直存在,并且你的系统会持 ...
- elasticsearch java索引的增删改查
1.创建索引并插入数据 Map<String, Object> json = new HashMap<String, Object>(); json.put("use ...
- spring事物不回滚的问题
学习spring分布式事务的时候,自己整了个demo,写test测试的时候发先事物没有回滚.此问题和分布式事务没关系.1.在service层引入@Transaction注解 使用 throw new ...