提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
本文针对新手快速使用CubeMx实现USART3的中断接收来配置esp8266和4G(Air780EP)模块,大佬请绕过,嘿嘿。
一、配置CubeMx
1.默认已经选择了芯片型号(我这里选择了STM32F103RCT6)
2.配置时钟
3.配置串口
此时,串口配置完成
4.配置工程
5.生成MDK工程
二、代码部分
1.重定向串口一
在"usart.c"中添加以下代码,并在keil > 魔术棒中勾选[Use MicroLIB]
/* USER CODE BEGIN 0 */
#include <stdio.h>
/* USER CODE END 0 */
/* USER CODE BEGIN 1 */
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
/* USER CODE END 1 */
在用到printf()函数的.c文件中添加 #include <stdio.h> 就可以调用printf()函数了。
2.编写esp8266/Air780EP初始化函数
新建esp8266.c/h文件,并添加到项目中
#include "esp8266.h"
#include "usart.h"
#define REV_OK 0
#define REV_WAIT 1
unsigned char esp8266_buf[128];
unsigned short esp8266_cnt = 0, esp8266_cntPre = 0;
void Usart_SendString(UART_HandleTypeDef *huart, unsigned char *str, unsigned short len)
{
unsigned short count = 0;
HAL_UART_Transmit(huart,(uint8_t *)str, len, HAL_MAX_DELAY);
while(HAL_UART_GetState(huart) == HAL_UART_STATE_BUSY_TX);
}
void ESP8266_Clear(void)
{
memset(esp8266_buf, 0, sizeof(esp8266_buf));
esp8266_cnt = 0;
}
_Bool ESP8266_WaitRecive(void)
{
if(esp8266_cnt == 0) return REV_WAIT;
if(esp8266_cnt == esp8266_cntPre)
{
esp8266_cnt = 0;
return REV_OK;
}
esp8266_cntPre = esp8266_cnt;
return REV_WAIT;
}
_Bool ESP8266_SendCmd(char *cmd, char *res)
{
unsigned char timeOut = 200;
Usart_SendString(&huart3, (unsigned char *)cmd, strlen((const char *)cmd));
while(timeOut--)
{
if(ESP8266_WaitRecive() == REV_OK)
{
if(strstr((const char *)esp8266_buf, res) != NULL)
{
ESP8266_Clear();
return 0;
}
}
HAL_Delay(10);
}
return 1;
}
void ESP8266_Init(void)
{
ESP8266_Clear();
printf("1. AT\r\n");
while(ESP8266_SendCmd("AT\r\n", "OK"))
HAL_Delay(1000);
printf("2. CWMODE\r\n");
while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
HAL_Delay(1000);
printf("3. CWJAP\r\n");
while(ESP8266_SendCmd("AT+CWJAP=\"WiFi名称\",\"WiFi密码\"\r\n", "GOT IP"))
HAL_Delay(1000);
...
printf("ESP8266 Init Over.\r\n");
}
void AIR780EP_Init(void)
{
ESP8266_Clear();
printf("0. AT\r\n");
while(ESP8266_SendCmd("AT\r\n", "OK"))
HAL_Delay(1000);
printf("1. AT+RESET\r\n");
while(ESP8266_SendCmd("AT+RESET\r\n", "OK"))
HAL_Delay(1000);
HAL_Delay(3000);
printf("2. ATE0\r\n");
while(ESP8266_SendCmd("ATE0\r\n", "OK"))
HAL_Delay(1000);
printf("3. AT+CGATT?\r\n");
while(ESP8266_SendCmd("AT+CGATT?\r\n", "OK"))
HAL_Delay(1000);
...
printf("Air780EP Init Over.\r\n");
}
"esp8266.h"文件
#ifndef __ESP8266_H__
#define __ESP8266_H__
#include "main.h"
#include <stdio.h>
#include <string.h>
void ESP8266_Init(void);
void AIR780EP_Init(void);
void ESP8266_Clear(void);
_Bool ESP8266_WaitRecive(void);
_Bool ESP8266_SendCmd(char *cmd, char *res);
void Usart_SendString(UART_HandleTypeDef *huart, unsigned char *str, unsigned short len);
#endif
3.重写串口三中断回调函数
在"usart.c"中添加以下代码
/* USER CODE BEGIN 0 */
extern unsigned char esp8266_buf[128];
extern unsigned short esp8266_cnt, esp8266_cntPre;
uint8_t USART3_RxData;
/* USER CODE END 0 */
/* USER CODE BEGIN 1 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart == &huart3)
{
if(esp8266_cnt > sizeof(esp8266_buf)) esp8266_cnt = 0;
esp8266_buf[esp8266_cnt++] = USART3_RxData;
HAL_UART_Receive_IT(&huart3, (uint8_t *)&USART3_RxData, 1);
}
}
/* USER CODE END 1 */
4.调用esp8266/Air780EP初始化函数
在main.c中添加以下代码
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include "esp8266.h"
/* USER CODE END Includes */
/* USER CODE BEGIN 0 */
extern uint8_t USART3_RxData;
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart3, (uint8_t *)&USART3_RxData, 1);
/* USER CODE END 2 */
/* USER CODE BEGIN WHILE */
printf("Hello!\r\n");
// ESP8266_Init();
AIR780EP_Init();
HAL_Delay(2000);
printf("Air780EP当前的信号[%d]",getAir780EP_Signal()); //下期增加此函数
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
总结
程序运行串口显示如下: