STM32F10xx(高容量)WiFi模块的初始化和使用

2023-11-21 06:10

本文主要是介绍STM32F10xx(高容量)WiFi模块的初始化和使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

  • 首先看原理图管脚连接
    1252747-20181219162333260-1659607506.png
  • 下载文档,阅读大概的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复用的, 和LEDRCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打开控制WiFi使能与复位的GPIOG和AFIO复用的GPIOB和LED灯RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//打开控制beep的时钟GPIOC--pc0RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//打开控制WiFiCH-PD和RST的GPIOGRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE);//WiFi使用usart3RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
}
  • 5.使用系统时钟滴答systick实现精准延时
void SysTick_Init()
{if(SysTick_Config(SystemCoreClock /1000000)){//capture errorwhile(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
      1252747-20181219174245327-516513403.png
    • 9.4 既然设置的了usart3 的接收中断和空闲中断,就需要配置NVIC中断,从而使能IQR某中断通道,每个中断,不管哪个外设软中断还是外部中断,都对应有对应的中断通道,外部中断还多一个EXIT需要配置呢。https://blog.csdn.net/chaoshui7758/article/details/50504319
    • 9.5 配置任何的NVIC对应的通道中断,都需要设定好优先组,其实就是设定好抢占级与优先级位数
      1252747-20181219175823656-558811065.png
    • 9.6 前期初始化
      1252747-20181219183345702-866979860.png
    • 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");//使能esp8266GPIO_SetBits(GPIOG,GPIO_Pin_13);//AT指令测试。ESP8266_AT_Test ();//模式选择ESP8266_Net_Mode_Choose ( AP );//:设置模块的 AP IP,输入  :pApIp,模块的 AP IPwhile ( ! 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=1ESP8266_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.hstrEsp8266_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 下面是对我的工程文件夹做说明

1252747-20181222012610369-1851901270.png
- 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

转载于:https://www.cnblogs.com/guguobao/p/10147130.html

这篇关于STM32F10xx(高容量)WiFi模块的初始化和使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_30664615/article/details/95665717
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/400352

相关文章

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

Ubuntu如何分配​​未使用的空间

《Ubuntu如何分配​​未使用的空间》Ubuntu磁盘空间不足,实际未分配空间8.2G因LVM卷组名称格式差异(双破折号误写)导致无法扩展,确认正确卷组名后,使用lvextend和resize2fs... 目录1:原因2:操作3:报错5:解决问题:确认卷组名称​6:再次操作7:验证扩展是否成功8:问题已解