使用CubeMx配置esp8266/4g(Air780EP)模块

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文针对新手快速使用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 */

总结

程序运行串口显示如下:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值