3. ESP8266模块 您所在的位置:网站首页 多功能控制模块 3. ESP8266模块

3. ESP8266模块

2024-07-14 19:36| 来源: 网络整理| 查看: 265

3.7.4. 例程介绍¶

在编写ESP8266模块驱动时,也要考虑更改硬件环境的情况。我们把ESP8266模块引脚相关的宏定义到”bsp_esp8266.h”文件中, 在更改或移植的时候只用改宏定义就可以。

例程中是使用串口3与esp8266通信,把串口3的相关配置也定义到”bsp_esp8266.h”中,其中还定义了一些ESP8266 数据结构,完整代码请参考WIFI透传例程。

bsp_esp8266.h¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30// ... ... /******************************** ESP8266 连接引脚定义 ***********************************/ #define macESP8266_CH_PD_APBxClock_FUN RCC_APB2PeriphClockCmd /* 重定义开启ESP8266 CH_PD 端口的时钟函数 */ #define macESP8266_CH_PD_CLK RCC_APB2Periph_GPIOB /* 定义ESP8266 CH_PD 引脚端口时钟 */ #define macESP8266_CH_PD_PORT GPIOB /* 定义ESP8266 CH_PD 引脚端口*/ #define macESP8266_CH_PD_PIN GPIO_Pin_8 /* 定义ESP8266 CH_PD 引脚*/ #define macESP8266_RST_APBxClock_FUN RCC_APB2PeriphClockCmd /* 重定义开启ESP8266 RST 端口的时钟函数 */ #define macESP8266_RST_CLK RCC_APB2Periph_GPIOB /* 定义ESP8266 RST 引脚端口时钟 */ #define macESP8266_RST_PORT GPIOB /* 定义ESP8266 RST 引脚端口*/ #define macESP8266_RST_PIN GPIO_Pin_9 /* 定义ESP8266 RST 引脚*/ #define macESP8266_USART_BAUD_RATE 115200 /* 定义ESP8266的串口波特率为 115200*/ #define macESP8266_USARTx USART3 /* 定义ESP8266串口为串口3*/ #define macESP8266_USART_APBxClock_FUN RCC_APB1PeriphClockCmd /* 重定义开启ESP8266 USART 的时钟函数 */ #define macESP8266_USART_CLK RCC_APB1Periph_USART3 /* 重定义ESP8266 USART3 */ #define macESP8266_USART_GPIO_APBxClock_FUN RCC_APB2PeriphClockCmd /* 重定义开启ESP8266 USART GPIO 的时钟函数 */ #define macESP8266_USART_GPIO_CLK RCC_APB2Periph_GPIOB /* 定义ESP8266 串口 GPIO 时钟*/ #define macESP8266_USART_TX_PORT GPIOB /* 定义ESP8266 串口 发送 GPIO 端口*/ #define macESP8266_USART_TX_PIN GPIO_Pin_10 /* 定义ESP8266 串口 发送 GPIO 引脚*/ #define macESP8266_USART_RX_PORT GPIOB /* 定义ESP8266 串口 接收 GPIO 端口*/ #define macESP8266_USART_RX_PIN GPIO_Pin_11 /* 定义ESP8266 串口 接收 GPIO 引脚*/ #define macESP8266_USART_IRQ USART3_IRQn /* 重定义ESP8266 串口 中断*/ #define macESP8266_USART_INT_FUN USART3_IRQHandler /* 重定义ESP8266 串口 中断函数*/ // ... ...

首先看一下ESP8266的管脚初始化,定义一个GPIO结构体,开启CH_PD引脚的时钟,GPIO_Pin 赋值为 CH_PD ,GPIO_Mode设置为推挽输出,CH_PD对应的管脚时钟设置为50MHz, 调用GPIO_Init初始化GPIO配置。对于RST不修改管脚模式和速度,配置一样。

bsp_esp8266.c¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25static void ESP8266_GPIO_Config ( void ) { /*定义一个GPIO_InitTypeDef类型的结构体*/ GPIO_InitTypeDef GPIO_InitStructure; /* 配置 CH_PD 引脚*/ macESP8266_CH_PD_APBxClock_FUN ( macESP8266_CH_PD_CLK, ENABLE ); GPIO_InitStructure.GPIO_Pin = macESP8266_CH_PD_PIN; // CH_PD GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO时钟为50MHz GPIO_Init ( macESP8266_CH_PD_PORT, & GPIO_InitStructure ); /* 配置 RST 引脚*/ macESP8266_RST_APBxClock_FUN ( macESP8266_RST_CLK, ENABLE ); GPIO_InitStructure.GPIO_Pin = macESP8266_RST_PIN; // RST GPIO_Init ( macESP8266_RST_PORT, & GPIO_InitStructure ); }

再来看一下ESP8266用到的串口初始化函数。定义GPIO、USART结构体,使能串口3及对应的管脚时钟,配置 TX 引脚,GPIO_Mode设置为复用推挽输出, GPIO_Speed设置为50MHz,初始化 TX 引脚配置。配置 RX 引脚,GPIO_Mode设置为浮空输入,GPIO_Speed保留 TX 引脚的配置,然后初始化 RX 引脚配置。

USART_BaudRate为串口波特率,这里设置为115200,USART_WordLength为数据格式长度,设置字长为8位数据格式,设置一个停止位,无奇偶校验,无硬件数据流控制, 串口模式设置为收发模式,初始化串口3,最后就是使能串口的中断。

bsp_esp8266.c¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42static void ESP8266_USART_Config ( void ) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /* config USART clock */ macESP8266_USART_APBxClock_FUN ( macESP8266_USART_CLK, ENABLE ); // 使能串口3时钟 macESP8266_USART_GPIO_APBxClock_FUN ( macESP8266_USART_GPIO_CLK, ENABLE ); // 使能串口3引脚时钟 /* USART GPIO config */ /* Configure USART Tx as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = macESP8266_USART_TX_PIN; // TX 引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 引脚时钟定义为50MHz GPIO_Init(macESP8266_USART_TX_PORT, &GPIO_InitStructure); // 初始化 TX 引脚配置 /* Configure USART Rx as input floating */ GPIO_InitStructure.GPIO_Pin = macESP8266_USART_RX_PIN; // RX 引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入 GPIO_Init(macESP8266_USART_RX_PORT, &GPIO_InitStructure); // 初始化 RX 引脚配置 /* USART1 mode config */ USART_InitStructure.USART_BaudRate = macESP8266_USART_BAUD_RATE; // 串口波特率 115200 USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_1; // 一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No ; // 无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件数据流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 收发模式 USART_Init(macESP8266_USARTx, &USART_InitStructure); //初始化串口3 /* 中断配置 */ USART_ITConfig ( macESP8266_USARTx, USART_IT_RXNE, ENABLE ); //使能串口接收中断 USART_ITConfig ( macESP8266_USARTx, USART_IT_IDLE, ENABLE ); //使能串口总线空闲中断 /* 配置 ESP8266 USART 的 NVIC 中断 */ ESP8266_USART_NVIC_Configuration (); /* 使能串口3*/ USART_Cmd(macESP8266_USARTx, ENABLE); }

下面是ESP8266模块的初始化函数,在这里调用ESP8266的GPIO初始化和串口初始化,拉高ESP8266复位管脚,再将CH_PD管脚置低。

bsp_esp8266.c¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14void ESP8266_Init ( void ) { /* 初始化ESP8266用到的GPIO引脚 */ ESP8266_GPIO_Config (); /* 初始化ESP8266用到的 USART */ ESP8266_USART_Config (); /* 拉高ESP8266复位管脚 */ macESP8266_RST_HIGH_LEVEL(); /* 将CH_PD管脚置低 */ macESP8266_CH_DISABLE(); }

在main函数中需要初始化串口1,用于打印调试信息,配置DWT计数器用于延时函数,初始化RGB彩灯,初始化WiFi模块使用的接口和外设。

main.c¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30int main ( void ) { /* 初始化 */ USART_Config (); //初始化串口1 CPU_TS_TmrInit(); //初始化DWT计数器,用于延时函数 LED_GPIO_Config(); //初始化RGB彩灯 ESP8266_Init (); //初始化WiFi模块使用的接口和外设 // DHT11_Init (); //初始化DHT11 // SysTick_Init (); //配置 SysTick 为 10ms 中断一次,在中断里读取传感器数据 printf ( "\r\n野火 WF-ESP8266 WiFi模块测试例程\r\n" ); //打印测试例程提示信息 printf ( "\r\n在网络调试助手或者串口调试助手上发送以下命令可以控制板载RGB灯\r\n" ); //打印测试例程提示信息 printf ( "\r\nLED_RED\r\nLED_GREEN\r\nLED_BLUE\r\nLED_YELLOW\r\nLED_PURPLE\r\nLED_CYAN\r\nLED_WHITE\r\nLED_RGBOFF\r\n" ); ESP8266_StaTcpClient_Unvarnish_ConfigTest(); //对ESP8266进行配置 printf ( "\r\n在网络调试助手或者串口调试助手 发送以下命令控制板载RGB灯:\r\n" ); //打印测试例程提示信息 printf ( "\r\nLED_RED\r\nLED_GREEN\r\nLED_BLUE\r\nLED_YELLOW\r\nLED_PURPLE\r\nLED_CYAN\r\nLED_WHITE\r\nLED_RGBOFF\r\n" ); printf ( "\r\n观察RGB灯的状态变化\r\n" ); while ( 1 ) { ESP8266_CheckRecvDataTest(); // ESP8266 检查一次是否接收到了数据 } }

另外,还要在 ESP8266_StaTcpClient_Unvarnish_ConfigTest 这个函数里面对ESP8266进行一些配置,然后才进入主循环执行 ESP8266_CheckRecvDataTest 函数。 我们来看一下 ESP8266_StaTcpClient_Unvarnish_ConfigTest 函数和 ESP8266_CheckRecvDataTest 函数都做了些什么。

首先是 ESP8266_StaTcpClient_Unvarnish_ConfigTest 函数,拉高 CH_PD 引脚,使能模块,对WF-ESP8266模块进行AT测试启动,选择WF-ESP8266模块的工作模式为STA模式, WF-ESP8266模块连接外部WiFi,WF-ESP8266模块启动多连接,WF-ESP8266模块连接外部服务器,配置WF-ESP8266模块进入透传发送。设置完毕后就可以开始透传了。

接着进入主循环,在 ESP8266_CheckRecvDataTest 函数里面,会一直检查是否接收到数据,如果接收到了串口调试助手的数据,就转发给ESP82636,如果接收到了ESP8266的数据,就转发给串口调试助手。 同时 ESP8266_CheckRecvDataTest 函数里面还会检查 ESP8266 有没有断开连接,若是断连的话会让 ESP8266 退出透传模式,并且重新连接热点和服务器。

bsp_esp8266_test.c¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91/** * @brief ESP8266 StaTcpClient Unvarnish 配置测试函数 * @param 无 * @retval 无 */ void ESP8266_StaTcpClient_Unvarnish_ConfigTest(void) { printf( "\r\n正在配置 ESP8266 ......\r\n" ); printf( "\r\n使能 ESP8266 ......\r\n" ); macESP8266_CH_ENABLE(); while( ! ESP8266_AT_Test() ); printf( "\r\n正在配置工作模式 STA ......\r\n" ); while( ! ESP8266_Net_Mode_Choose ( STA ) ); printf( "\r\n正在连接 WiFi ......\r\n" ); while( ! ESP8266_JoinAP ( macUser_ESP8266_ApSsid, macUser_ESP8266_ApPwd ) ); printf( "\r\n禁止多连接 ......\r\n" ); while( ! ESP8266_Enable_MultipleId ( DISABLE ) ); printf( "\r\n正在连接 Server ......\r\n" ); while( ! ESP8266_Link_Server ( enumTCP, macUser_ESP8266_TcpServer_IP, macUser_ESP8266_TcpServer_Port, Single_ID_0 ) ); printf( "\r\n进入透传发送模式 ......\r\n" ); while( ! ESP8266_UnvarnishSend () ); printf( "\r\n配置 ESP8266 完毕\r\n" ); printf ( "\r\n开始透传......\r\n" ); } /** * @brief ESP8266 检查是否接收到了数据,检查连接和掉线重连 * @param 无 * @retval 无 */ void ESP8266_CheckRecvDataTest(void) { uint8_t ucStatus; uint16_t i; /* 如果接收到了串口调试助手的数据 */ if(strUSART_Fram_Record.InfBit.FramFinishFlag == 1) { for(i = 0;i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有