功能描述:
上电配置初始化时:第一个小灯会闪烁,配置完成时,小灯保持直亮;
上电完成,串口调试助手会出现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}; //缓冲区,存放ID
char 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)); //冒号后的数据,复制到data
MCU_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); //延时10ms
if(strstr(MCU_Rx_ESP8266_BUF,">")) //如果接收到>表示成功
break; //主动跳出while循环
MCU_Tx_USART1_Data("%d ",timeout); //串口输出现在的超时时间
}
if(timeout<=0)return 1; //超时错误,返回1
else{ //没超时,正确
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); //延时10ms
if(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; //超时错误,返回3
else 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; //准备设置PA9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO速率50M
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出,用于串口1的发送
GPIO_Init(GPIOA, &GPIO_InitStructure); //设置PA9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //准备设置PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入,用于串口1的接收
GPIO_Init(GPIOA, &GPIO_InitStructure); //设置PA10
USART_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; //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子优先级0
NVIC_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 Tx
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO速率50M
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出,用于串口2的发送
GPIO_Init(GPIOA, &GPIO_InitStructure); //设置PA2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //准备设置PA3 Rx
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入,用于串口2的接收
GPIO_Init(GPIOA, &GPIO_InitStructure); //设置PA3
USART_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); //使能串口2
USART_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; //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子优先级0
NVIC_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)); //等待计数到0
SysTick->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 header
void led_init(void);
void led_shanshuo(void);
#endif