zoukankan      html  css  js  c++  java
  • 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 );
    		
    }
    
      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("
    正在配置esp8266。。。。
    ");
    	
    	//使能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 ( "
    本模块WIFI为%s,密码开放
    AP IP 为:%s,开启的端口为:%s
    手机网络助手连接该 IP 和端口,最多可连接5个客户端
    ",
               "BinghuoLink", cStr, "8080" );
    	
    
        //查询是不是使用透传选择
    	ESP8266_Inquire_mode(cStr,20);
    		
    	printf("
     mode是:%s
    ",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 ); //禁用串口接收中断
    			//以''做字符串结束符
    			strEsp8266_Fram_Record.Data_RX_BUF[strEsp8266_Fram_Record.InfBit.FramLength ]  = '';
    		
    			//下面进入接收到的命令进行控制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("
    
     app发送了啥:%s
    ",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

  • 相关阅读:
    对webpack的初步研究7
    对后端返回的时间进行升序的排序
    对webpack的初步研究6
    对webpack的初步研究5
    对webpack的初步研究4
    对webpack的初步研究3
    计算两个时间之间的天数、小时等
    对webpack的初步研究2
    线程_进程间通信Queue合集
    线程_threading合集
  • 原文地址:https://www.cnblogs.com/guguobao/p/10147130.html
Copyright © 2011-2022 走看看