STM32CubeIDE开发(二十七), stm32的WIFI通信设计(基于AT指令)

这篇具有很好参考价值的文章主要介绍了STM32CubeIDE开发(二十七), stm32的WIFI通信设计(基于AT指令)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、stm32的WIFI配置

二、代码设计

三、编译及测试

四、关于WIFI模块的串口应用


一、stm32的WIFI配置

        通常WIFI模块就是一个独立的单片机,只是内置了WFIF通信软件的单片机,并该通信软件提供了AT通信指令集给开发人员,基于这些指令集我们就可以针对项目需要进行二次集成开发出所需的业务应用软件。

        本文本文采用的开发板是stm32L496VGT3,该开发板的MCU及WIFI模块(MW31)硬件电路图如下:

        MCU采用PC4、PC5连接WIFI实现通信,PB0、PB1作为辅助控制。

stm32wifi开发教程,STM32CubeIDE开发实践案例,stm32,arm,WIFI模块,usart通信,stm32cubeIDE

 WIFI模块给出了两个通信接口,一个用来连接MCU(电路板已经连接好了,本文就采用该接口实现MCP串口通信控制WIFI模块),一个用来给外置使用。

stm32wifi开发教程,STM32CubeIDE开发实践案例,stm32,arm,WIFI模块,usart通信,stm32cubeIDE

 与WIFI通信关联的MCU的IO端口设置要求,开发板给出如下:

stm32wifi开发教程,STM32CubeIDE开发实践案例,stm32,arm,WIFI模块,usart通信,stm32cubeIDE

         以及各个IO口具体参数要求stm32wifi开发教程,STM32CubeIDE开发实践案例,stm32,arm,WIFI模块,usart通信,stm32cubeIDE

         打开CubeMX配置页面,按上述要求设置WIFI配置通信接口USART3:

stm32wifi开发教程,STM32CubeIDE开发实践案例,stm32,arm,WIFI模块,usart通信,stm32cubeIDE

         开启USART3外部中断功能:

stm32wifi开发教程,STM32CubeIDE开发实践案例,stm32,arm,WIFI模块,usart通信,stm32cubeIDE

         设置PC4、PC5的IO接口参数

stm32wifi开发教程,STM32CubeIDE开发实践案例,stm32,arm,WIFI模块,usart通信,stm32cubeIDE

         同时芯片图形化配置页面设置PB0、PB1为GPIO_OutPut模式,并进入GPIO配置页面,设置PB0、PB1的IO接口参数:

stm32wifi开发教程,STM32CubeIDE开发实践案例,stm32,arm,WIFI模块,usart通信,stm32cubeIDE

          完成配置点击保存按钮或代码生产按钮生成代码:

stm32wifi开发教程,STM32CubeIDE开发实践案例,stm32,arm,WIFI模块,usart通信,stm32cubeIDE

二、代码设计

        本文基于前一篇博文的串口通信能力基础上来实现的,即已经完成了printf函数映射到lpusart进行串口通信:cubeIDE开发, stm32调试信息串口通信输出显示_py_free的博客-CSDN博客

         我们先实现串口USART3的接收回调实现,在改写ICore目录下的usart.h、usart.c代码文件:

        usart.h内容如下,类似lpusart串口添加了串口USART3的接收辅助变量:

/*
 * usart.h
 *
 *  Created on: Oct 20, 2022
 *      Author: Administrator
 */

#ifndef INC_USART_H_
#define INC_USART_H_

#include "stm32l4xx_hal.h" //HAL库文件声明
#include <string.h>//用于字符串处理的库
#include "print.h"//用于printf函数串口重映射

extern UART_HandleTypeDef hlpuart1;//声明LPUSART的HAL库结构体
extern UART_HandleTypeDef huart3;//声明USART3的HAL库结构体

#define HLPUSART_REC_LEN  256//定义LPUSART最大接收字节数
#define USART3_REC_LEN  256//定义USART3最大接收字节数

extern uint8_t  HLPUSART_RX_BUF[HLPUSART_REC_LEN];//接收缓冲,最大HLPUSART_REC_LEN个字节.末字节为换行符
extern uint16_t HLPUSART_RX_STA;//接收状态标记
extern uint8_t HLPUSART_NewData;//当前串口中断接收的1个字节数据的缓存

extern uint8_t USART3_RX_BUF[USART3_REC_LEN];	//接收缓冲,最大USART_REC_LEN个字节.
extern uint16_t USART3_RX_STA;				//接收状态标记,bit15:接收完成标志,bit14:接收到0x0d,bit11~0:接收到的有效字节数目
extern uint8_t USART3_NewData;					//当前串口中断接收的1个字节数据的缓存

void  HAL_UART_RxCpltCallback(UART_HandleTypeDef  *huart);//串口中断回调函数声明

#endif /* INC_USART_H_ */

        usart.c内容如下,添加了USART3的回调处理,实现接收来自WIFI模块的数据,lpusart和USART3的回调处理几乎一样的,主要就是接收到一个数据,就缓存起来,并再次开启中断接收;在接收到回车字段或缓存溢出是,进行标记(HLPUSART_RX_STA和USART3_RX_STA的前四位可以标记,后12位为数据长度记录)改写,该标记留给外部调用来处理,不再回调函数中进行接收标记复位:

/*
 * usart.c
 *
 *  Created on: Oct 20, 2022
 *      Author: Administrator
 */

#include "usart.h"
#include "wifi.h"

uint8_t  HLPUSART_RX_BUF[HLPUSART_REC_LEN];//接收缓冲,最大HLPUSART_REC_LEN个字节.末字节为换行符
/*
 * bit15:接收到回车(0x0d)时设置HLPUSART_RX_STA|=0x8000;
 * bit14:接收溢出标志,数据超出缓存长度时,设置HLPUSART_RX_STA|=0x4000;
 * bit13:预留
 * bit12:预留
 * bit11~0:接收到的有效字节数目(0~4095)
 */
uint16_t HLPUSART_RX_STA=0;接收状态标记//bit15:接收完成标志,bit14:接收到回车(0x0d),bit13~0:接收到的有效字节数目
uint8_t HLPUSART_NewData;//当前串口中断接收的1个字节数据的缓存

uint8_t USART3_RX_BUF[USART3_REC_LEN];	//接收缓冲,最大USART_REC_LEN个字节.
uint16_t USART3_RX_STA=0;				//接收状态标记,bit15:接收完成标志,bit14:接收到0x0d,bit11~0:接收到的有效字节数目
uint8_t USART3_NewData;					//当前串口中断接收的1个字节数据的缓存

void  HAL_UART_RxCpltCallback(UART_HandleTypeDef  *huart)//串口中断回调函数
{
	if(huart ==&hlpuart1)//判断中断来源(串口1:USB转串口)
    {
		if(HLPUSART_NewData==0x0d){//回车标记
     	  HLPUSART_RX_STA|=0x8000;//标记接到回车
		}else{
			if((HLPUSART_RX_STA&0X0FFF)<HLPUSART_REC_LEN){
				HLPUSART_RX_BUF[HLPUSART_RX_STA&0X0FFF]=HLPUSART_NewData; //将收到的数据放入数组
				HLPUSART_RX_STA++;  //数据长度计数加1
			}else{
				HLPUSART_RX_STA|=0x4000;//数据超出缓存长度,标记溢出
			}
        }
       HAL_UART_Receive_IT(&hlpuart1,(uint8_t *)&HLPUSART_NewData,1); //再开启接收中断
    }
	if(huart ==&huart3)//判断中断来源(串口3:WIFI模块)
	{
		if(USART3_NewData==0x0d){//回车标记
			USART3_RX_STA|=0x8000;//标记接到回车
		}else{
			if((USART3_RX_STA&0X0FFF)<USART3_REC_LEN){
				USART3_RX_BUF[USART3_RX_STA&0X0FFF]=USART3_NewData; //将收到的数据放入数组
				USART3_RX_STA++;  //数据长度计数加1
			}else{
				USART3_RX_STA|=0x4000;//数据超出缓存长度,标记溢出
			}
        }
		HAL_UART_Receive_IT(&huart3,(uint8_t *)&USART3_NewData,1); //再开启接收中断
	}
}

        在ICore目录下创建wifi.h和wifi.c源码文件实现WIFI驱动:

        wifi.h内容如下:

/*
 * wifi.h
 *
 *  Created on:
 *      Author: Administrator
 */

#ifndef WIFI_WIFI_H_
#define WIFI_WIFI_H_

#include "stm32l4xx_hal.h" //HAL库文件声明
#include "usart.h"
#include "main.h"
#include <string.h>//用于字符串处理的库
#include <stdarg.h>
#include <stdlib.h>
#include "stdio.h"

extern UART_HandleTypeDef huart3;//声明UART2的HAL库结构体

void WIFI_printf (char *fmt, ...); //WIFI模块发送
void WIFI_TCP_SEND (char *fmt, ...);//在TCP模式下的发送数据(不处理返回状态的盲发)

#endif /* WIFI_WIFI_H_ */

        wifi.c内容如下,本质上就是调用HAL_UART_Transmit函数对huart3句柄进行写入数据操作,实现发送数据到WIFI模块:

/*
 * wifi.c
 *
 *  Created on:
 *      Author: Administrator
 */

#include "wifi.h"

//WIFI模块通信,使用UART3,这是专用的printf函数
//调用方法:WIFI_printf("123"); //向USART2发送字符123
void WIFI_printf (char *fmt, ...)
{
	char buff[USART3_REC_LEN+1];  //用于存放转换后的数据 [长度]
	uint16_t i=0;
	va_list arg_ptr;
	va_start(arg_ptr, fmt);
	vsnprintf(buff, USART3_REC_LEN+1, fmt, arg_ptr);//数据转换
	i=strlen(buff);//得出数据长度
	if(strlen(buff)>USART3_REC_LEN)i=USART3_REC_LEN;//如果长度大于最大值,则长度等于最大值(多出部分忽略)
	/*HAL_StatusTypeDef ret =*/ HAL_UART_Transmit(&huart3,(uint8_t *)buff,i,0xffff);//串口发送函数(串口号,内容,数量,溢出时间)
    //printf("WIFI_printf Len:%02d\r\n",ret);
    va_end(arg_ptr);
}
//WIFI模块在TCP模式下的数据发送:TCP发送的规定是先发AT+CIPSEND=数量,等待返回“>“后再发送数据内容。
//调用方法:WIFI_TCP_SEND("123\r\n"); //TCP方式发送字符123和回车换行
void WIFI_TCP_SEND (char *fmt, ...)
{
	char buff[USART3_REC_LEN+1];  //用于存放转换后的数据 [长度]
	uint16_t i=0;
	va_list arg_ptr;
	va_start(arg_ptr, fmt);
	vsnprintf(buff, USART3_REC_LEN+1, fmt, arg_ptr);//数据转换
	i=strlen(buff);//得出数据长度
	if(strlen(buff)>USART3_REC_LEN)i=USART3_REC_LEN;//如果长度大于最大值,则长度等于最大值(多出部分忽略)
	WIFI_printf("AT+CIPSEND=%d\r\n",i);//先发送AT指令和数据数量
	HAL_Delay(100);//等待WIFI模块返回">",此处没做返回是不是">"的判断。稳定性要求高的项目要另加判断。
    HAL_UART_Transmit(&huart3,(uint8_t *)buff,i,0xffff);//发送数据内容(串口号,内容,数量,溢出时间)
    va_end(arg_ptr);
}

//所有USART串口的中断回调函数HAL_UART_RxCpltCallback,统一存放在【usart.C】文件中。

        在main.c文件添加WIFI通信实现代码,main.c部分内容如下:

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
//用户编写1
#include "../../ICore/key.h"
#include "../../ICore/led.h"
#include "../../ICore/print.h"
#include "../../ICore/usart.h"   //添加串口usart3接收回调实现的头文件
#include "../../ICore/wifi.h"    //添加串口usart3写入数据实现的头文件
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_LPUART1_UART_Init();
  MX_USART3_UART_Init();
  /* USER CODE BEGIN 2 */
  //用户编写2
  ResetPrintInit(&hlpuart1);
  HAL_UART_Receive_IT(&hlpuart1,(uint8_t *)&HLPUSART_NewData, 1); //再开启接收中断
  HLPUSART_RX_STA = 0;
  HAL_UART_Receive_IT(&huart3,(uint8_t *)&USART3_NewData, 1); //usart3开启接收中断
  USART3_RX_STA = 0;
  set_led0_val(0);
  set_led1_val(get_key0_val());
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    //用户编写3
        //接收到电脑发送给(lpusart)数据,转身将其发送到给usart3,进而实现送数据给WIFI模块
		if(HLPUSART_RX_STA&0xC000){//溢出或换行,重新开始
			WIFI_printf("%.*s\r\n",HLPUSART_RX_STA&0X0FFF, HLPUSART_RX_BUF);
			HLPUSART_RX_STA=0;//接收错误,重新开始
			HAL_Delay(100);//等待
		}
        //接收到WIFI模块发送给(usart3)数据,转身将其发送到给lpusart,进而实现送数据给电脑终端
		if(USART3_RX_STA&0xC000){//溢出或换行,重新开始
			printf("%.*s\r\n", USART3_RX_STA&0X0FFF, USART3_RX_BUF);
			USART3_RX_STA=0;//接收错误,重新开始
			HAL_Delay(100);//等待
		}
    /*
	  if(KEY_0())//按下KEY0判断
	  {
		  printf("KEY0被按下\r\n");
		  WIFI_printf("AT+UARTE?\r\n");//发送AT指令
		  HAL_Delay(100);//等待
	  }
    */

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

三、编译及测试

        点击编译及运行按钮,

stm32wifi开发教程,STM32CubeIDE开发实践案例,stm32,arm,WIFI模块,usart通信,stm32cubeIDE

         如果编译及下载无异常,采用串口助手连接开发板,本文将开发板作为Station 模式连接家里的路由,设置账号密码及查询是否成功:

stm32wifi开发教程,STM32CubeIDE开发实践案例,stm32,arm,WIFI模块,usart通信,stm32cubeIDE

stm32wifi开发教程,STM32CubeIDE开发实践案例,stm32,arm,WIFI模块,usart通信,stm32cubeIDE

 测试运行结果如下:

stm32wifi开发教程,STM32CubeIDE开发实践案例,stm32,arm,WIFI模块,usart通信,stm32cubeIDE

         访问家里的路由控制界面查看如下:

stm32wifi开发教程,STM32CubeIDE开发实践案例,stm32,arm,WIFI模块,usart通信,stm32cubeIDE

四、关于WIFI模块的串口应用

        通过上面的实现,市面上大部分WIFI模块都能适用。只要AT指令能直达WIFI模块,无论是从MCU还是从电脑端,对于WIFI模块的操作就是看AT指令支持的情况及我们对AT指令的组合应用,可以实现项目开发中各种对WIFI使用的要求。当然在具体项目中,对于WIFI模块的选型就是看他们WIFI模块给的AT指令能否直接或间接组合满足项目要求。

        2022-11-21补充下面给出MW31模块的AT指令及部分测试演示。

【1】基础指令

stm32wifi开发教程,STM32CubeIDE开发实践案例,stm32,arm,WIFI模块,usart通信,stm32cubeIDE

【2】UASRT管理

 stm32wifi开发教程,STM32CubeIDE开发实践案例,stm32,arm,WIFI模块,usart通信,stm32cubeIDE

 【3】WIFI管理

stm32wifi开发教程,STM32CubeIDE开发实践案例,stm32,arm,WIFI模块,usart通信,stm32cubeIDE

【4】 TCP/UDP通信

stm32wifi开发教程,STM32CubeIDE开发实践案例,stm32,arm,WIFI模块,usart通信,stm32cubeIDE

 关键指令测试演示:

1)部分查询指令测试:

stm32wifi开发教程,STM32CubeIDE开发实践案例,stm32,arm,WIFI模块,usart通信,stm32cubeIDE

2)部分TCP通信测试

stm32wifi开发教程,STM32CubeIDE开发实践案例,stm32,arm,WIFI模块,usart通信,stm32cubeIDE

  备注:另外发现博文发出不久,就有几个地方转载过去了,请标明转载出处,别习惯拿来主义,谢谢。文章来源地址https://www.toymoban.com/news/detail-763974.html

到了这里,关于STM32CubeIDE开发(二十七), stm32的WIFI通信设计(基于AT指令)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32Cube开发记录】1-下载和安装STM32CubeIDE

    【STM32Cube开发记录】1-下载和安装STM32CubeIDE 【STM32Cube开发记录】2-STM32CubeProgrammer的使用 【STM32Cube开发记录】3-STM32CubeMX的使用 【STM32Cube开发记录】4-标准库 HAL库 LL库 【STM32Cube开发记录】5-寄存器和存储器映射 【STM32Cube开发记录】6-STM32核心功能 【STM32Cube开发记录】7-Debug调试功

    2024年01月17日
    浏览(43)
  • 开发环境搭建-stm32CubeIDE配置

    使用方法如下: 在CubeIDE的安装路径STM32CubeIDEplugins下找到org.eclipse.cdt.ui_7.3.201.202205131409.jar,并将此文件改名备份,然后,将下载的同名插件文件复制到该路径下,重新启动STM32CubeIDE即可。 百度地址 链接: https://pan.baidu.com/s/17qxUiMLNhVgsV0rx0f2U5g 提取码: a5yf Window-preferences-General

    2024年02月09日
    浏览(41)
  • STM32CubeIDE开发(十一), STM32实时时钟(RTC)写入及读取日历时间开发要点

    目录 一、RTC简介 二、工程创建及配置  三、驱动代码设计实现 四、编译及测试         实时时钟的缩写是RTC(Real_Time Clock),核心是晶振,晶振频率一般为32768 Hz 。它为分频计数器提供精确的与低功耗的实基信号。它可以用于产生秒、分、时、日等信息。为了确保时钟长期

    2024年01月16日
    浏览(42)
  • STM32CubeIDE开发实践案例-专栏总述

    STM32CubeIDE开发专栏总述 目录 一、本专栏基本结束 二、专栏内容及博文索引(共36篇)         2.1 基础知识         2.2 日志打印输出         2.3 内部功能         2.4 各种外设         2.5 RTOS系统结合         2.6 人工智能-cube.AI         2.7 篇外-RTThrea

    2024年02月15日
    浏览(33)
  • STM32CubeIDE开发(一),快速开发流程初体验

    目录 一、cubeIDE下载、安装  二、创建工程及配置芯片引脚 三、编码及编译 四、加载已编译程序到硬件及测试 五、程序运行效果 一、cubeIDE下载、安装         STM32CubeIDE是STM32Cube软件生态系统的一部分,是面向st芯片的高级C/C++开发平台,具有STM32微控制器和微处理器的外

    2024年02月02日
    浏览(48)
  • STM32CubeIDE开发(三十一), stm32人工智能开发应用实践(Cube.AI).篇一

    目录 一、cube.AI简介及cubeIDE集成        1.1 cube.AI介绍        1.2 cube.AI与cubeIDE集成与安装         1.3 cube.AI支持硬件平台         1.4 cube.AI应用的好处  二、FP-AI-SENSING1        2.1 FP-AI-SENSING1简介           2.2 FP-AI-SENSING1软件包支持硬件平台 三、FP-AI-SENSING1部署        

    2024年01月22日
    浏览(42)
  • STM32CubeIDE开发(三十三), stm32人工智能开发应用实践(Cube.AI).篇三

    目录 一、cube.AI实际项目应用 二、创建工程 2.1 工程配置 2.2 外设代码设计 2.3 传感器数据采集与输出源码设计 2.4 编辑下载程序,采集数据  三、模型训练 四、cube.AI配置及c模型生成 五、模型调用及测试         接篇二,前文都是采用FP-AI-SENSING1案例和配套的B-L475E-IOT01A开

    2024年01月17日
    浏览(64)
  • STM32CubeIDE开发(十九),结合图片取模工具,stm32程序在LCD显示图片

    目录 一、图片取模工具(imag2lcd) 二、 工程设计 三、图片显示实现过程 四、编译及下载         我们前面将汉字显示时说过,嵌入式LCD屏显示就是通过LCD屏幕数据接口给每个屏幕像素给出一个颜色值实现实时渲染显示出来。只不过文字显示时,给出的是一个二进制点阵

    2024年02月16日
    浏览(37)
  • STM32CubeIDE开发(二), 全面解析cubeMX图形配置工具

    目录 一、cubeIDE 集成cubeMX 二、STM32CubeMX界面简介         2.1 总界面及支持功能        【1】 功能页面          【2】支持配置的功能栏目          2.2 通信接口外设配置         【1】CAN外设          【2】FMC外设         【3】I2C外设         【4】串

    2023年04月12日
    浏览(79)
  • 嵌入式系统开发笔记104:在STM32CubeIDE中导入工程

      本文讲述如何在STM32CubeIDE中导入现有工程。

    2024年02月16日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包