下載文檔,閱讀大概的WiFi指令有哪些,而且返回什麼數組
下載APP,用於測試鏈接是否成功服務器
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); }
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 ); }
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加密