物联网ESP8266配置成AP模式
功能描述:
上电配置初始化时:第一个小灯会闪烁,配置完成时,小灯保持直亮;
上电完成,串口调试助手会出现ESP8266的参数,WIFI名称,WIFI密码,端口号等;
手机上连接这个WIFI,在手机上利用网络调试助手发送一些数据给ESP8266,ESP8266会将接收到的数据发送给手机,并且串口调试助手上会显示,哪部手机发送的数据和发送数据的长度。
串口调试助手是电脑端的,网络调试助手是手机端的,
上电完成,串口1显示各种初始化,如图:
按照显示的WIFI名称和密码,连接WIFI,连接后,打开手机上网络调试助手
网络调试助手配置如下:
打开网络调试助手
在串口调试助手上显示
看最后两句话:有客户端连接,表示我们手机已经连接上了(只有我们客户端发送一个数据这句话才能显示出来)
ID=0:表示这个客户端的分机号,就是在ESP8266看来,就是第一号客户
程序:
main.c
#include "stm32f10x.h"
#include "led.h"
#include "esp8266.h"
#include "esp8266_usart1.h"
#include "esp8266_usart2.h"
#include "esp8266_delay.h"extern char MCU_Rx_ESP8266_BUF[1024];
extern char MCU_Rx_ESP8266_Count;
char Data_buff[2048]; //数据缓冲区
char Data_len[5]; //数据长度缓冲区
char Data_id[5]; //数据发送者的id缓冲区int main()
{USART1_GPIO_Init();USART2_Init();led_init();while(ESP8266_Cmd()==0){delay_ms(100);}else GPIO_ResetBits(GPIOC,GPIO_Pin_0);MCU_Rx_ESP8266_Count=0; //WiFi接收数据长度变量清零 memset(MCU_Rx_ESP8266_BUF,0,1024); //清空 ESP8266_TO_MCU 接收缓冲区while(1){WiFi_Get_LinkSta(); //检测有无客户端连接或是断开if(WiFi_Get_Data(Data_buff,Data_len,Data_id)){ //接收数据 MCU_Tx_USART1_Data("连接id:%s有%s字节数据到来\r\n",Data_id,Data_len); //串口显示信息MCU_Tx_USART1_Data("数据:%s\r\n",Data_buff); //串口显示信息WiFi_SendData(Char_to_Hex(Data_id,strlen(Data_id)),Data_buff,strlen(Data_buff),500);//5s的发送超时时间,发送数据}}
}
esp8266.c
#include "esp8266.h"char a[]="AT+CWMODE=2"; //设置成AP模式(路由器)
char b[]="AT+RST"; //复位
char c[]="AT+CWSAP_DEF=\"ESP8266\",\"123456789\",5,4" ;//设置WIFI的名称,密码,通道号和加密方式
char d[]="AT+CIPAP=\"192.168.10.2\""; //开启服务器并设置AP模式的IP地址
char h[]="AT+CIPMODE=0"; //关闭透传模式
char e[]="AT+CIPMUX=1"; //设置多连接
char f[]="AT+CIPSERVER=1,8080"; //设置端口号
char g[]="AT+CIPAP=\"192.168.10.2\""; //开启服务器并设置AP模式的IP地址 extern char MCU_Tx_ESP8266_BUF[1024];
extern char MCU_Rx_ESP8266_BUF[1024];
extern uint16_t MCU_Rx_ESP8266_Count;/* 单片机向ESP8266发送AT指令转化函数 */
void MCU_TO_ESP8266_Cmd(u8 *cmd)
{MCU_TO_ESP8266("%s\r\n",cmd); //发送命令,需要加换行符
}
/* ESP8266复位函数 */
uint8_t ESP8266_RST(int timeout)
{MCU_Rx_ESP8266_Count=0; //WiFi接收数据长度变量清零 memset(MCU_Rx_ESP8266_BUF,0,1024); //清空 ESP8266_TO_MCU 接收缓冲区 MCU_TO_ESP8266_Cmd("AT+RST");while(timeout--){delay_ms(100);led_shanshuo();if(strstr(MCU_Rx_ESP8266_BUF,"ready"))break;MCU_Tx_USART1_Data("%d ",timeout);}MCU_Tx_USART1_Data("\r\n");if(timeout<=0)return 1;else return 0;
}
/* 单片机向ESP8266发送AT指令函数 */
uint8_t MCU_To_ESP8266_Control(uint8_t *Cmd,int timeout)
{MCU_Rx_ESP8266_Count=0; //WiFi接收数据长度变量清零 memset(MCU_Rx_ESP8266_BUF,0,1024); //清空 ESP8266_TO_MCU 接收缓冲区MCU_TO_ESP8266_Cmd(Cmd);while(timeout--){delay_ms(100);led_shanshuo();if(strstr(MCU_Rx_ESP8266_BUF,"OK"))break; MCU_Tx_USART1_Data("%d ",timeout);}if(timeout<=0)return 1;else return 0;
}
/* ESP8266初始化配置函数 */
uint8_t ESP8266_Cmd()
{MCU_Tx_USART1_Data("准备复位ESP8266\r\n");if(ESP8266_RST(50)){MCU_Tx_USART1_Data("复位失败,准备重新复位\r\n");return 0;}else MCU_Tx_USART1_Data("复位成功\r\n");MCU_Tx_USART1_Data("\r\n");MCU_Tx_USART1_Data("ESP8266设置成AP模式\r\n");if(MCU_To_ESP8266_Control("AT+CWMODE=2",50)==1){MCU_Tx_USART1_Data("设置失败,重新设置\r\n");return 0;}else MCU_Tx_USART1_Data("设置成功\r\n"); MCU_Tx_USART1_Data("\r\n");MCU_Tx_USART1_Data("设置WIFI的名称和密码\r\n");if(MCU_To_ESP8266_Control("AT+CWSAP_DEF=\"CMCC-ESP8266\",\"123456789\",5,4" ,50)==1){MCU_Tx_USART1_Data("设置失败,重新设置\r\n");return 0;}else MCU_Tx_USART1_Data("设置成功\r\n");MCU_Tx_USART1_Data("ESP8266设置成AP模式\r\n");if(MCU_To_ESP8266_Control("AT+CWMODE=2",50)==1){MCU_Tx_USART1_Data("设置失败,重新设置\r\n");return 0;}else MCU_Tx_USART1_Data("设置成功\r\n"); MCU_Tx_USART1_Data("\r\n");MCU_Tx_USART1_Data("设置AP的IP地址\r\n");if(MCU_To_ESP8266_Control("AT+CIPAP=\"192.168.10.2\"" ,50)==1){MCU_Tx_USART1_Data("设置失败,重新设置\r\n");return 0;}else MCU_Tx_USART1_Data("设置成功\r\n");MCU_Tx_USART1_Data("WIFI名称: %s\r\n",ESP8266_SSID);MCU_Tx_USART1_Data("WIFI密码: %s\r\n",ESP8266_PASS);MCU_Tx_USART1_Data("WIFI IP地址: %s\r\n",ESP8266_IP);MCU_Tx_USART1_Data("\r\n");MCU_Tx_USART1_Data("关闭透传模式\r\n");if(MCU_To_ESP8266_Control("AT+CIPMODE=0",50)==1){MCU_Tx_USART1_Data("设置失败,重新设置\r\n");return 0;}else MCU_Tx_USART1_Data("设置成功\r\n"); MCU_Tx_USART1_Data("\r\n");MCU_Tx_USART1_Data("设置成多连接\r\n");if(MCU_To_ESP8266_Control("AT+CIPMUX=1",50)==1){MCU_Tx_USART1_Data("设置失败,重新设置\r\n");return 0;}else MCU_Tx_USART1_Data("设置成功\r\n"); MCU_Tx_USART1_Data("\r\n");MCU_Tx_USART1_Data("设置ESP8266的端口号\r\n");if(MCU_To_ESP8266_Control("AT+CIPSERVER=1,8080",50)==1){MCU_Tx_USART1_Data("设置失败,重新设置\r\n");return 0;}else{MCU_Tx_USART1_Data("端口号为: %s\r\n",duankouhao);MCU_Tx_USART1_Data("设置成功\r\n"); MCU_Tx_USART1_Data("\r\n"); return 1;}
}/*-------------------------------------------------*/
/*函数名:获取连接状态 */
/*参 数:无 */
/*返回值:连接状态 */
/* 0:无状态 */
/* 1:有客户端接入 */
/* 2:有客户端断开 */
/*-------------------------------------------------*/
char WiFi_Get_LinkSta(void)
{char id_temp[10]={0}; //缓冲区,存放IDchar sta_temp[10]={0}; //缓冲区,存放状态if(strstr(MCU_Rx_ESP8266_BUF,"CONNECT")){ //如果接受到CONNECT表示有客户端连接 sscanf(MCU_Rx_ESP8266_BUF,"%[^,],%[^,]",id_temp,sta_temp);MCU_Tx_USART1_Data("有客户端接入,ID=%s\r\n",id_temp); //串口显示信息MCU_Rx_ESP8266_Count=0; //WiFi接收数据量变量清零 memset(MCU_Rx_ESP8266_BUF,0,1024); //清空WiFi接收缓冲区 return 1; //有客户端接入}else if(strstr(MCU_Rx_ESP8266_BUF,"CLOSED")){ //如果接受到CLOSED表示有链接断开 sscanf(MCU_Rx_ESP8266_BUF,"%[^,],%[^,]",id_temp,sta_temp);MCU_Tx_USART1_Data("有客户端断开,ID=%s\r\n",id_temp); //串口显示信息MCU_Rx_ESP8266_Count=0; //WiFi接收数据量变量清零 memset(MCU_Rx_ESP8266_BUF,0,1024); //清空WiFi接收缓冲区 return 2; //有客户端断开}else return 0; //无状态改变
}
/*-------------------------------------------------*/
/*函数名:获取客户端数据 */
/* 两组回车换行符\r\n\r\n作为数据的结束符 */
/*参 数:data:数据缓冲区 */
/*参 数:len: 数据量 */
/*参 数:id: 发来数据的客户端的连接ID */
/*返回值:数据状态 */
/* 0:无数据 */
/* 1:有数据 */
/*-------------------------------------------------*/
char WiFi_Get_Data(char *data, char *len, char *id)
{char temp[10]={0}; //缓冲区char *presult;if(strstr(MCU_Rx_ESP8266_BUF,"+IPD")){ delay_ms(10); //延时sscanf(MCU_Rx_ESP8266_BUF,"%[^,],%[^,],%[^:]",temp,id,len);//截取各段数据,主要是id和数据长度 presult = strstr(MCU_Rx_ESP8266_BUF,":"); //查找冒号。冒号后的是数据if( presult != NULL ) //找到冒号sprintf((char *)data,"%s",(presult+1)); //冒号后的数据,复制到dataMCU_Rx_ESP8266_Count=0; //WiFi接收数据量变量清零 memset(MCU_Rx_ESP8266_BUF,0,1024); //清空WiFi接收缓冲区 return 1; //有数据到来} else return 0; //无数据到来
}/*-------------------------------------------------*/
/*函数名:服务器发送数据 */
/*参 数:databuff:数据缓冲区<2048 */
/*参 数:data_len:数据长度 */
/*参 数:id: 客户端的连接ID */
/*参 数:timeout: 超时时间(10ms的倍数) */
/*返回值:错误值 */
/* 0:无错误 */
/* 1:等待发送数据超时 */
/* 2:连接断开了 */
/* 3:发送数据超时 */
/*-------------------------------------------------*/
char WiFi_SendData(char id, char *databuff, int data_len, int timeout)
{ int i;MCU_Rx_ESP8266_Count=0; //WiFi接收数据量变量清零 memset(MCU_Rx_ESP8266_BUF,0,1024); //清空WiFi接收缓冲区 MCU_TO_ESP8266("AT+CIPSEND=%d,%d\r\n",id,data_len); //发送指令 while(timeout--){ //等待超时与否 delay_ms(10); //延时10msif(strstr(MCU_Rx_ESP8266_BUF,">")) //如果接收到>表示成功break; //主动跳出while循环MCU_Tx_USART1_Data("%d ",timeout); //串口输出现在的超时时间}if(timeout<=0)return 1; //超时错误,返回1else{ //没超时,正确 MCU_Rx_ESP8266_Count=0; //WiFi接收数据量变量清零 memset(MCU_Rx_ESP8266_BUF,0,1024); //清空WiFi接收缓冲区 for(i=0;i<data_len;i++)MCU_TO_ESP8266("%c",databuff[i]); //发送数据 while(timeout--){ //等待超时与否 delay_ms(10); //延时10msif(strstr(MCU_Rx_ESP8266_BUF,"SEND OK")){ //如果接受SEND OK,表示发送成功 MCU_Rx_ESP8266_Count=0; //WiFi接收数据量变量清零 memset(MCU_Rx_ESP8266_BUF,0,1024); //清空WiFi接收缓冲区 break; //跳出while循环} if(strstr(MCU_Rx_ESP8266_BUF,"link is not valid")){ //如果接受link is not valid,表示连接断开 MCU_Rx_ESP8266_Count=0; //WiFi接收数据量变量清零 memset(MCU_Rx_ESP8266_BUF,0,1024); //清空WiFi接收缓冲区 return 2; //返回2}}if(timeout<=0)return 3; //超时错误,返回3else return 0; //正确,返回0}
}
/*-------------------------------------------------*/
/*函数名:字符型数字转换成数字,0-9999 */
/*参 数:char_data:字符型数字 */
/*参 数:len: 位数 */
/*返回值:转换后的数字 */
/*-------------------------------------------------*/
int Char_to_Hex(char *char_data, int len)
{int temp;switch(len){case 1 : temp=(char_data[0]-0x30)*1;break;case 2 : temp=(char_data[0]-0x30)*10;temp+=(char_data[1]-0x30)*1;break;case 3 : temp=(char_data[0]-0x30)*100;temp+=(char_data[2]-0x30)*10;temp+=(char_data[3]-0x30)*1;break;case 4 : temp=(char_data[0]-0x30)*1000;temp+=(char_data[1]-0x30)*100;temp+=(char_data[2]-0x30)*10;temp+=(char_data[3]-0x30)*1;break;}return temp;
}
esp8266.h
#ifndef __esp8266_H
#define __esp8266_H#include "stm32f10x.h"
#include "esp8266_usart2.h" //包含需要的头文件
#include "esp8266_usart1.h"
#include "esp8266_delay.h"
#include "led.h" #define ESP8266_IP "192.168.10.2"
#define ESP8266_SSID "CMCC-EAP8266"
#define ESP8266_PASS "123456789"
#define duankouhao "8080"uint8_t ESP8266_RST(uint16_t timeout);
uint8_t MCU_To_ESP8266_Control(uint8_t *Cmd,uint16_t timeout);
uint8_t ESP8266_Cmd();char WiFi_Get_LinkSta(void);
char WiFi_Get_Data(char *data, char *len, char *id);
char WiFi_SendData(char id, char *databuff, int data_len, int timeout);
int Char_to_Hex(char *char_data, int len);#endif
esp8266_usart1.c
#include "esp8266_usart1.h" unsigned int MCU_Rx_USART1_Count = 0; //定义一个变量,记录串口1总共接收了多少字节的数据
char MCU_Rx_USART1_BUF[1024]; //定义一个数组,用于保存串口1接收到的数据
char MCU_Tx_USART1_BUF[1024];
unsigned int MCU_Tx_USART1_Count=0;/*-------------------------------------------------*/
/*函数名:初始化串口1发送功能 */
/*参 数:bound:波特率 */
/*返回值:无 */
/*-------------------------------------------------*/
void USART1_GPIO_Init()
{ GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO结构体USART_InitTypeDef USART_InitStructure; //定义串口结构体NVIC_InitTypeDef NVIC_InitStructure; //定义中断结构体NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //使能串口1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //准备设置PA9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO速率50MGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出,用于串口1的发送GPIO_Init(GPIOA, &GPIO_InitStructure); //设置PA9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //准备设置PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入,用于串口1的接收GPIO_Init(GPIOA, &GPIO_InitStructure); //设置PA10USART_InitStructure.USART_BaudRate = 115200; //波特率设置USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8个数据位USART_InitStructure.USART_StopBits = USART_StopBits_1; //1个停止位USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //收发模式 USART_Init(USART1, &USART_InitStructure); //初始化串口1 USART_ClearFlag(USART1, USART_FLAG_RXNE); //清除接收标志位USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启接收中断NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //设置串口1中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子优先级0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //中断通道使能NVIC_Init(&NVIC_InitStructure); //设置串口1中断 USART_Cmd(USART1, ENABLE); //使能(开启)串口1
}/*-------------------------------------------------*/
/*函数名:串口1 printf函数 */
/*参 数:char* fmt,... 格式化输出字符串和参数 */
/*返回值:无 */
/*-------------------------------------------------*/void MCU_Tx_USART1_Data(char* fmt,...)
{ unsigned int i,length;va_list ap; //定义一个指针变量va_start(ap,fmt); //把多个参数的起始参数的地址放入ap中,因为ap是指针vsprintf(MCU_Tx_USART1_BUF,fmt,ap);//把多个变参,放入MCU_Tx_USART1_BUF数组中va_end(ap); length=strlen((const char*)MCU_Tx_USART1_BUF);//计算出MCU_Tx_USART1_BUF的长度 while((USART1->SR&0X40)==0);for(i = 0;i < length;i ++){ USART1->DR = MCU_Tx_USART1_BUF[i];//把数组MCU_Tx_USART1_BUF中的数据放入串口1的寄存器中,打印出来while((USART1->SR&0X40)==0); }
}void USART1_IRQHandler(void)
{ if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){ //如果USART_IT_RXNE标志置位,表示有数据到了,进入if分支if(USART1->DR){ //非零值才保存到缓冲区 MCU_Rx_USART1_BUF[MCU_Rx_USART1_Count]=USART1->DR; //保存到缓冲区 MCU_Rx_USART1_Count ++; //每接收1个字节的数据,Usart2_RxCounter加1,表示接收的数据总量+1 } MCU_Tx_USART1_Data(MCU_Rx_USART1_BUF);}
}
esp8266_usart1.h
#ifndef __esp8266_usart1_H
#define __esp8266_usart1_H#include "stm32f10x.h"
#include "stdio.h" //包含需要的头文件
#include "stdarg.h" //包含需要的头文件
#include "string.h" //包含需要的头文件void MCU_Tx_USART1_Data(char* fmt,...) ;
void USART1_GPIO_Init(void);#endif
esp8266_usart2.c
#include "esp8266_usart2.h" char MCU_Tx_ESP8266_BUF[1024];
char MCU_Rx_ESP8266_BUF[1024];
uint16_t MCU_Rx_ESP8266_Count=0;/*-------------------------------------------------*/
/*函数名:初始化串口2发送功能 */
/*参 数:bound:波特率 */
/*返回值:无 */
/*-------------------------------------------------*/
void USART2_Init()
{ GPIO_InitTypeDef GPIO_InitStructure; //定义一个设置GPIO功能的变量USART_InitTypeDef USART_InitStructure; //定义一个设置串口功能的变量NVIC_InitTypeDef NVIC_InitStructure; //如果使能接收功能,定义一个设置中断的变量RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //使能串口2时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //准备设置PA2 TxGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO速率50MGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出,用于串口2的发送GPIO_Init(GPIOA, &GPIO_InitStructure); //设置PA2GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //准备设置PA3 RxGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入,用于串口2的接收GPIO_Init(GPIOA, &GPIO_InitStructure); //设置PA3USART_InitStructure.USART_BaudRate = 115200; //波特率设置USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8个数据位USART_InitStructure.USART_StopBits = USART_StopBits_1; //1个停止位USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //收发模式 USART_Init(USART2, &USART_InitStructure); //设置串口2 USART_Cmd(USART2, ENABLE); //使能串口2USART_ClearFlag(USART2, USART_FLAG_RXNE); //清除接收标志位USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //开启接收中断NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //设置串口2中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子优先级0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //中断通道使能NVIC_Init(&NVIC_InitStructure); //设置串口2中断
}/*-------------------------------------------------*/
/*函数名:MCU向ESP8266发送数据 */
/*函数作用:因为向ESP8266发送的是AT指令, */
/* 所以把数据转换一下(也叫格式化) */
/*参 数:不确定长度和类型的变量(变参) */
/*返回值:无 */
/*-------------------------------------------------*/
void MCU_TO_ESP8266(char* fmt,...)
{ unsigned int i,length;va_list ap;va_start(ap,fmt);vsprintf(MCU_Tx_ESP8266_BUF,fmt,ap);va_end(ap); length=strlen((const char*)MCU_Tx_ESP8266_BUF); while((USART2->SR&0X40)==0);for(i = 0;i < length;i ++){ USART2->DR = MCU_Tx_ESP8266_BUF[i];while((USART2->SR&0X40)==0); }
}/*-------------------------------------------------*/
/*函数名:串口2接收中断函数 */
/*参 数:无 */
/*返回值:无 */
/*-------------------------------------------------*/
void USART2_IRQHandler(void)
{ if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){ //如果USART_IT_RXNE标志置位,表示有数据到了,进入if分支if(USART2->DR){ //非零值才保存到缓冲区 MCU_Rx_ESP8266_BUF[MCU_Rx_ESP8266_Count]=USART2->DR; //保存到缓冲区 MCU_Rx_ESP8266_Count ++; //每接收1个字节的数据,Usart2_RxCounter加1,表示接收的数据总量+1 } }
}
esp8266_usart2.h
#ifndef __esp8266_usart2_H
#define __esp8266_usart2_H#include "stm32f10x.h"
#include "stdio.h" //包含需要的头文件
#include "stdarg.h" //包含需要的头文件
#include "string.h" //包含需要的头文件void USART2_Init();
void MCU_TO_ESP8266(char*,...) ; #endif
esp8266_delay.c就是正常的延时函数
#include "esp8266_delay.h"/*** @brief 微秒级延时* @param xus 延时时长,范围:0~233015* @retval 无*/
void delay_us(uint32_t xus)
{SysTick->LOAD = 72 * xus; //设置定时器重装值SysTick->VAL = 0x00; //清空当前计数值SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器while(!(SysTick->CTRL & 0x00010000)); //等待计数到0SysTick->CTRL = 0x00000004; //关闭定时器
}/*** @brief 毫秒级延时* @param xms 延时时长,范围:0~4294967295* @retval 无*/
void delay_ms(uint32_t xms)
{while(xms--){delay_us(1000);}
}/*** @brief 秒级延时* @param xs 延时时长,范围:0~4294967295* @retval 无*/
void delay_s(uint32_t xs)
{while(xs--){delay_ms(1000);}
}
esp8266_delay.h
#ifndef __esp8266_delay_H
#define __esp8266_delay_H#include "stm32f10x.h" void delay_us(uint32_t us);
void delay_ms(uint32_t ms);
void delay_s(uint32_t s);#endif
led.c
#include "led.h"
#include "esp8266_delay.h"void led_init(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitStruct.GPIO_Mode =GPIO_Mode_Out_PP ;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz ;GPIO_Init(GPIOC,&GPIO_InitStruct);GPIO_SetBits (GPIOC,GPIO_Pin_All);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE);GPIO_InitStruct.GPIO_Mode =GPIO_Mode_Out_PP ;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz ;GPIO_Init(GPIOG,&GPIO_InitStruct);GPIO_SetBits (GPIOG,GPIO_Pin_7);
}void led_shanshuo(void)
{GPIO_ResetBits(GPIOC,GPIO_Pin_0);delay_ms(100);GPIO_SetBits(GPIOC,GPIO_Pin_0);
}
led.h
#ifndef __led_init_H_
#define __led_init_H_#include "stm32f10x.h" // Device headervoid led_init(void);
void led_shanshuo(void);
#endif
物联网ESP8266配置成AP模式相关推荐
- ESP8266的sta+ap模式
printf ( "\r\nwaiting-\r\n" ); SYSTICK_NmsDelay(2000); //延时2s,让模块自动连接WiFi ESP8266_Cmd ( &q ...
- 3、ESP8266入门(AT模式)——手机与ESP8266通信(AP模式)
实现手机与ESP8266最简单通信.关于指令参考安信可官方指令.https://wiki.ai-thinker.com/esp8266/docs#at 在AT指令处下载即可,还有一个是使用实例,也可以 ...
- zynq配置成jtag模式_Zynq-7000 MiZ701 SOC硬件使用手册
一.整体概述 此板卡是由南京米联电子设计团队设计的一款高性能SOC开发板.采用了美国XILINX公司开发的XC7Z020CLG484作为CPU,硬件设计方案参考了安富利公司的Zedboard,最大程度 ...
- zynq配置成jtag模式_zynq 7Z010的启动模式配置
启动模式 ZYNQ 7000启动模式由MIO[5-2]来决定,选择JTAG启动时,MIO[5-3]必须都是0,而MIO2,决定了JTAG 的Cacade和 Independent模式 我们先说明如何启 ...
- kali虚拟机配置成桥接模式
1.设置网络类型 将虚拟机设置中的网络适配器设置为桥接模式 2.查看本机网络状态 使用ipconfig查看本机的内网IP地址.子网掩码以及默认网关 3.手动配置kali网络配置 vim /etc/ne ...
- 中兴光纤猫F420如何配置成桥接模式
背景: 1:家里两个高清机顶盒,一个光纤宽带(20M/1M) 2:光纤猫(电信提供的设备,类似路由器)一共四个网口,有两个网口LAN1和LAN2用来连接IPTV,还有一个网口LAN4用来上网 3:网口 ...
- esp8266 接收udp广播_【零知ESP8266教程】AP模式下WIFI UDP协议通信示例
[mw_shl_code=cpp,true]/********************************************************** * 文件: udp-serve ...
- notepad++ 配置成VIM模式
1st 先上效果图 2st 配置文件 :xxx@xx$ vi stylers.xml 放到 C:\Users\Administrator\AppData\Roaming\Notepad++\s ...
- ESP8266 AP模式建立服务器
功能:ESP8266配置为AP模式,作为TCP Server与电脑客户端进行通信 1.串口助手向模块依次发送如下指令,建立服务器: 注:端口号和模块IP在客户端进行连接时需要使用 串口助手发生指令,需 ...
最新文章
- luogu P3393 逃离僵尸岛(点权最短路 + 多源BFS)
- Asp.Net 之 通过调用 WScript.Shell 启动本地 exe 程序时产生“ automation服务器不能创建对象 ”的错误...
- Linux安装jellyfin硬件加速,proxmoxVE LXC 安装设置 Jellyfin 多媒体家庭影院
- 安卓四大组件之Service
- 终于也为自己开了技术博客
- Java学习小程序(9)冒泡排序算法实现
- phpcms9-6-0 一键getshell工具
- Linux初学:(二)Shell环境与命令基础
- WPF Image Source 设置相对路径图片
- 中国太阳能窗户市场趋势报告、技术动态创新及市场预测
- python博客主题_博客园SimpleMemary主题美化教程
- 软件测试方法和技术知识点有哪些?
- 学习日记(三)利用Arduino读取加速度传感器信号并采用NRF24L01无线传输
- 南京 学计算机的学校,南京小学生暑假学计算机编程去哪家学校好
- 输入大小写混合的字母,大写转小写,小写转大写
- Python使用RMF聚类分析客户价值
- DataGrip 禁用自动同步
- RSI的交易系统以及用rsi指标进行探势
- 【高并发专题】-高并发下前后端常用解决方案总结(全套)
- 7-10 计算多门课的平均绩点
热门文章
- c语言判断一个素数能被几个9整除,判断一个素数能被几个9整除
- 半导体可饱和吸收体(SA)
- Apple公司联系邮箱收录
- 计算机编程语言排行榜—TIOBE世界编程语言排行榜(2020年5月份最新版)
- 德语键盘在标准ASCII键盘上使用的小窍门/ 德语键盘英语输入法输出波浪线~
- 2021年茶艺师(高级)考试内容及茶艺师(高级)考试资料
- DSM_Solver软件使用说明
- 【Android】 炫酷霓虹灯
- LAMP(一)_介绍
- i386, x86, x86_64, IA-32, IA-64, 安腾, AMD64 的关系是什么?