系列文章目录
第三章 wifi模块esp-01S
一、esp-01S
某宝上esp-01S模块如下图
图1-1
10元以内就可以拿下,有实力推荐安信可的。然后你还需要一块WiFi模块下载板,如下图
图1-2
也是10元以内拿下。
二、使用步骤
使用步骤的话也是简单。首先通过下面的链接下载烧录软件、AT固件包和安信可串口助手
1.固件烧录
首先将所有压缩包解压
图 2-1
接着,双击运行...\wifi模块\flash_download_tool_3.9.2_0\flash_download_tool_3.9.2路径下的flash_download_tool_3.9.2.exe程序,如下图 2-2
图 2-2
然后出现如下图显示,点击ok即可
图 2-3
然后配置如下图2-4
图2-4
烧录成功后,打开串口调试工具验证是否成功
图2-5
打开串口调试助手后,按下复位键会输出一些字符,然后发送AT指令,如果回复OK,则成功
图2-6
2.创建工程
该工程因该具有两个串口,本次测试工程选用串口1和串口2
1)选择SW调试方式
图2-7
2)设置高速时钟为外部晶振
图2-8
3)设置时钟树
图2-9
4.配置串口1和2,配置一样
图2-10
5.生成工程
3.代码移植
本次移植的代码相对较少,就一个esp8266.h和esp8266.c两个文件。你需要在工程中创建一个Network的文件,然后将esp8266.h和esp8266.c放入其中。esp8266.h文件如下
//code_01
//
// Created by 86139 on 2024/11/26.
//
/**
* @author:ideal
* @mailbox:idealofgoner@outlook.com
*/
#ifndef _ESP8266_H_
#define _ESP8266_H_
#include "stdint.h"
void ESP8266_Init(void);
_Bool ESP8266_Send_Cmd(uint8_t* cmd,uint8_t* res);
#endif //_ESP8266_H
代码a-esp8266.h
esp8266.c文件如下
//code_02
//
// Created by 86139 on 2024/11/26.
//
/**
* @author:ideal
* @mailbox:idealofgoner@outlook.com
*/
#include "stm32f1xx_hal.h"
#include <stdio.h>
#include <string.h>
#include "esp8266.h"
uint8_t ESP8266_Buffer[256];
uint8_t UART2_Rx_Buffer[256];
extern UART_HandleTypeDef huart1;
extern UART_HandleTypeDef huart2;
uint8_t WIFI_Name_Cipher[]="AT+CWJAP=\"Redmi K60\",\"244466666\"\r\n";
/**
* Send instructions to ESP8266 module
* @param cmd
* @param res
* @return Return 1 if the transmission succeeds. Return 0 if the transmission fails
*/
//通过串口2发送AT指令给esp-01s模块,如果检索到串口2收到esp-01s回复的字符中存在指定字符(res),则表示成功且返回1,否则失败返回0
//其中cmd是需要发送的AT指令,res是esp-01s模块回复(发送)给串口2的字符消息
_Bool ESP8266_Send_Cmd(uint8_t* cmd,uint8_t* res)
{
uint8_t timeOut = 20;
HAL_UART_Transmit(&huart2,cmd,strlen(cmd),100);
while (timeOut--){
if(strstr(ESP8266_Buffer,res) != NULL){
return 1;
}
HAL_Delay(100);
}
return 0;
}
/**
* Example Initialize the ESP8266 module
*/
//esp-01s初始化
void ESP8266_Init(void)
{
uint8_t state;
/* Start Serial port2 is idle & MDA Receive */
__HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart2,UART2_Rx_Buffer, strlen(UART2_Rx_Buffer));
/* End Serial port2 is idle & MDA Receive */
while(!ESP8266_Send_Cmd("AT+RST\r\n","ready"));
HAL_Delay(500);
while(!ESP8266_Send_Cmd("AT\r\n","OK"));
HAL_Delay(500);
while(!ESP8266_Send_Cmd("AT+CWMODE=1\r\n","OK"));
HAL_Delay(500);
while(!ESP8266_Send_Cmd(WIFI_Name_Cipher,"OK"));
HAL_Delay(500);
}
代码b-esp8266.c
4.代码编写
需要在主函数中添加两个头文件,如下图
图2-11
你还需要外部引用数组ESP8266_Buffer和定义一个串口1接收数组UART1_Rx_Buffer,如下图2-12
图2-12
随后在主循环中添加下图2-13中的代码
图2-13
此时还需要在stm32f1xx_it.c中外部引用如下代码c,引用最好放在函数定义之前
//code_03
extern uint8_t UART2_Rx_Buffer[256];
extern uint8_t UART1_Rx_Buffer[256];
extern uint8_t ESP8266_Buffer[256];
代码c
然后在USART1_IRQHandler函数中添加代码如下
//code_04
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
uint8_t idle = __HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE);
uint8_t UART1_Tx_Buffer[256];
if(RESET != idle) {
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
HAL_UART_DMAStop(&huart1);
strcpy(UART1_Tx_Buffer, UART1_Rx_Buffer);
//回显发送字符
HAL_UART_Transmit(&huart1, UART1_Tx_Buffer, strlen(UART1_Tx_Buffer), 100);
memset(UART1_Rx_Buffer, '\0', 256);
//如果发送的字符是AT指令,发送成功就回回显"AT CMD Send OK!"
if(strstr(UART1_Tx_Buffer,"AT") != NULL){
HAL_UART_Transmit_DMA(&huart2, UART1_Tx_Buffer, strlen(UART1_Tx_Buffer));
HAL_UART_Transmit(&huart1, "AT CMD Send OK!\r\n", strlen("AT CMD Send OK!\r\n"), 100);
}
HAL_UART_Receive_DMA(&huart1, UART1_Rx_Buffer, 256);
HAL_UART_Receive_DMA(&huart2,UART2_Rx_Buffer,256);
}
/* USER CODE END USART1_IRQn 1 */
}
代码d_USART1_IRQHandler函数
最后在USART2_IRQHandler函数中添加代码如下
//code_05
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
/* USER CODE BEGIN USART2_IRQn 1 */
uint8_t idle = __HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE);
if(RESET != idle){
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
HAL_UART_DMAStop(&huart2);
strcpy(ESP8266_Buffer,UART2_Rx_Buffer);
//将串口2接收到的数据发送给串口1,
HAL_UART_Transmit(&huart1,ESP8266_Buffer, strlen(ESP8266_Buffer),100);
memset(UART2_Rx_Buffer,'\0',256);
HAL_UART_Receive_DMA(&huart2,UART2_Rx_Buffer,256);
HAL_UART_Receive_DMA(&huart1, UART1_Rx_Buffer, 256);
}
/* USER CODE END USART2_IRQn 1 */
}
代码e_USART2_IRQHandler函数
完成后点击编译,然后调试。打开串口助手(只要是串口助手都行),复位主板。串口接收数据如下图2-14所示
图2-14
由于手机热点并未打开,所以连接失败,值得注意的是手机热点的频段必须是2.4G频段。然后打开热点,发送AT指令
AT+CWJAP="Redmi K60/*热点名字*/","244466666/*热点密码*/"\r\n
连接手机热点。
图2-15
工程链接如下(我用的CLion编辑代码)
总结
总的来说较为简单,主要是理解两个串口中断为什么要那样写,还有就是烧录要注意一下细节。