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()app

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_Configtcp

  • 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中須要進行使能串口接收中斷和串口總線空閒中斷,二者是一塊兒的,不懂的,點擊:http://www.javashuo.com/article/p-qdnwoqnz-nb.html
    • 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 共存模式(http://www.javashuo.com/article/p-weagshyu-kg.html
    • 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的過程,和怎麼使用,不懂能夠下載個人工程文件查看:ui

#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加密

相關文章
相關標籤/搜索