下载文档,阅读大概的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加密