STM32 HAL 库驱动 ESP8266 WiFi 模块

news2024/11/15 5:54:00

STM32 HAL 库驱动 ESP8266 WiFi 模块

实验原理

关于 ESP8266 WiFi 模块使用原理可以看我前面的博客

WiFi 驱动代码连接将会放到文末

这里我们将芯片换为 STM32F103ZET6,别问为什么,问就是引脚资源多

CubeMX 配置

USART2 与 USART3 配置

这里我们使用的配置与前面我们配置 USART1 的方式完全一致:

USART3 同理,这里不再进行展示

GPIO 配置

这里我们直接设置好名字,我们就不需要修改驱动代码

代码设计

代码生成

首先,由于给定的驱动是基于 LL 库实现的,所以这里我们使用的 USART2 和 USART3 需要生成 LL 库对应的代码:

驱动代码移植

重写 printf 函数,这里主要用 com3 作为输出串口

int fputc(int ch,FILE *f)
{
	uint8_t temp[1]={ch};
	LL_USART_TransmitData8(USART3,temp[0]);
	while(!LL_USART_IsActiveFlag_TXE(USART3));//需要等待发送完成
	return(ch);
}

下载对应的驱动代码,然后添加到我们的项目中:

代码中已经存在了我们需要进行配置的函数,我们直接调用即可:

注意:这里我们需要按照个人配置来修改 WiFi 及 IP 信息

注意:这里还需要注意的是,我们需要应用 rt_thread.h 头文件,将驱动函数中的所有延时函数 HAL_Delay() 全部替换为 rt_thread_delay() 函数,不然会遇到进程终止或无法继续执行的问题

USART 功能设计

打开 usart.c 源文件,我们在函数 MX_USART2_UART_Init()、MX_USART3_UART_Init() 最后面添加 USART 接收中断使能

// USART2
  /* USER CODE BEGIN USART1_Init 2 */
  LL_USART_EnableIT_RXNE(USART2);
  LL_USART_EnableIT_IDLE(USART2);
  /* USER CODE END USART1_Init 2 */

// USART3
  /* USER CODE BEGIN USART1_Init 2 */
  LL_USART_EnableIT_RXNE(USART3);
  LL_USART_EnableIT_IDLE(USART3);
  /* USER CODE END USART1_Init 2 */

现在我们已经成功使能了 USART2、USART3 的中断,对应函数在 stm32f1xx_it.c 中,下面进行中断函数的实现

首先我们编写 USART2 的中断函数

/**
  * @brief This function handles USART2 global interrupt.
  */
void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */
  uint8_t ucCh;
	if (LL_USART_IsActiveFlag_RXNE(USART2) != RESET) {
	ucCh = LL_USART_ReceiveData8(USART2);

	if ( strEsp8266_Fram_Record .InfBit .FramLength < ( RX_BUF_MAX_LEN - 1 ) )                       //预留1个字节写结束符
		strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ++ ]  = ucCh;

	}
  /* USER CODE END USART2_IRQn 0 */
  /* USER CODE BEGIN USART2_IRQn 1 */
	if (LL_USART_IsActiveFlag_IDLE(USART2) == SET) {
		strEsp8266_Fram_Record .InfBit .FramFinishFlag = 1;

		ucCh = LL_USART_ReceiveData8(USART2);                 //获取连接状态
		ucTcpClosedFlag = strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "CLOSED\r\n" ) ? 1 : 0;
	}
  /* USER CODE END USART2_IRQn 1 */
}

接着我们编写 USART3 的中断函数

/**
  * @brief This function handles USART1 global interrupt.
  */
void USART3_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
  uint8_t ucCh;
	if ( LL_USART_IsActiveFlag_RXNE(USART3) != RESET )
	{
		ucCh  = LL_USART_ReceiveData8( USART3 );
		
		if ( strUSART_Fram_Record .InfBit .FramLength < ( RX_BUF_MAX_LEN - 1 ) )                       //预留1个字节写结束符
			   strUSART_Fram_Record .Data_RX_BUF [ strUSART_Fram_Record .InfBit .FramLength ++ ]  = ucCh;
	}
  /* USER CODE END USART1_IRQn 0 */
  /* USER CODE BEGIN USART1_IRQn 1 */
	if ( LL_USART_IsActiveFlag_IDLE( USART3) == SET )     //数据帧接收完毕
	{
		strUSART_Fram_Record .InfBit .FramFinishFlag = 1;
		ucCh = LL_USART_ReceiveData8( USART3 );
  }
  /* USER CODE END USART1_IRQn 1 */
}

测试 WiFi

现在代码移植工作已经完成了,下面进行验证驱动环节

在 app_rt_thread.c 中引用相关头文件

#include "bsp_esp8266_test.h"

在主进程函数中添加以下内容

//初始化ESP8266
  ESP8266_Init();
  //ESP8266进行透传模式
  ESP8266_StaTcpClient_Unvarnish_ConfigTest();

烧录测试

当我们烧录测试之后,能够正常运行并输出如下,则说明 WiFi 已经连接成功

当我们成功连接 WiFi 后,我们开始测试我们的 udp 传输,由于我们是继续前面的倒车系统进行的,所以这里我们直接输出超声波测距数据:

这里我们使用自治的测试工具进行测试:

这里我们开始测距输出一个 start 表示开始,在测距结束时输出一个 stop 表示停止,图中已经获取到输出与发送数据的 IP 和端口号,说明我们的程序就已经成功了

下载地址

HAL库 ESP8266 WiFi 驱动

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/689216.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python解ODE:优雅地解决微分方程

Python解ODE&#xff1a;优雅地解决微分方程 介绍 ODE&#xff08;Ordinary Differential Equation&#xff0c;常微分方程&#xff09;是数学中一个核心领域。为了求解ODE&#xff0c;需要一些高深的数学知识和专业的工具。然而&#xff0c;如果你是一位Python程序员&#x…

RuntimeError: expected scalar type Long but found Float报错解决

在torch模型转onnx模型&#xff0c;我会生成一个随机序列&#xff0c;通过模型预测看输出的维度是否一致吗但是遇到这个报错 我是这样生成的 dummy_input torch.randn(1,1,1200) dummy_output model_pytorch(dummy_input) print(dummy_output.shape) RuntimeError: expec…

SpringBoot基于Mybatis或Mybatis-Plus自定义实现完整SQL打印和执行耗时

注释相当完善了&#xff0c;不啰嗦。直接上代码&#xff1a; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.ibatis.executor.parameter.ParameterHandler; impor…

移远通信率先完成5G RedCap运营商实网测试,为商用部署奠定良好基础

近日&#xff0c;移远通信Rx255C 5G RedCap系列模组在上海率先完成了运营商RedCap实网环境下的测试&#xff0c;并成功验证了RedCap网络接入等一系列能力&#xff0c;为加速RedCap在中高速物联网领域的商用部署奠定了良好的基础。 位于上海市嘉定区的RedCap实网测试现场 本次外…

​价值驱动-数据分析价值逻辑与实践思考

月説小飞象交流会 未来是一片迷雾&#xff0c;令人胆怯&#xff0c;但不妨走下去&#xff0c;看看命运给我们准备了什么。 内部交流│25期 价值驱动 数据分析价值逻辑与实践思考 data analysis ●●●● 分享人&#xff1a;黄小伟 当今的企业&#xff0c;随着数字化技术日新月异…

机器学习——深度学习

1 感知机 y f ( ∑ i 1 n w i x i − b ) yf(\sum\limits_{i1}^{n}w_ix_i-b) yf(i1∑n​wi​xi​−b) 其中&#xff0c; f f f 常常取阶跃函数或 Sigmoid 函数。 学习规则&#xff1a; Δ w i η ( y − y ^ ) x i w i ← w i Δ w i \Delta w_i\eta(y-\hat{y})x_i\\ w_i…

C高级重点

1、请简要描述一下Linux文件系统的层级结构&#xff0c;包括不同目录的作用和功能。 Linux的文件系统结构是一个倒插树结构&#xff0c;所有的文件都从根目录出发。 2、find指令的用途 find 查找的路径 -name 文件名 ----->在指定路径下&#xff0c;以文件名为条件查找文…

windows gcc、g++和cmake安装

1、gcc gwindows版本工具mingw下载安装 参考&#xff1a;https://blog.csdn.net/didi_ya/article/details/111240502 https://blog.csdn.net/weixin_46416035/article/details/127387170 ##看这个 下载&#xff1a; https://sourceforge.net/projects/mingw-w64/files/mingw…

图书搜索领域重大突破!用Apache SeaTunnel、Milvus和OpenAI提高书名相似度搜索精准度和效率

作者 | 刘广东&#xff0c;Apache SeaTunnel Committer 背景 目前&#xff0c;现有的图书搜索解决方案&#xff08;例如公共图书馆使用的解决方案&#xff09;十分依赖于关键词匹配&#xff0c;而不是对书名实际内容的语义理解。因此会导致搜索结果并不能很好地满足我们的需…

nodejs安装记录

1.更改安装目录 D:\env\nodejs 2.命令行输入 node -v 查看nodejs的版本号 3.命令行输入 npm -v查看npm的版本号 4.修改模块安装和缓存路径 之前的设置&#xff1a; 在nodejs安装目录下新建一个文件夹&#xff0c;命名为 node_cache 使用命令修改config配置&#xff0c;首先…

【超简单】Windows 使用 mstsc 远程连接 Ubuntu桌面

登录网站下载 《xrdp-installer-1.4.7.zip》 xRDP Installation Script (free)&#xff1a;https://c-nergy.be/repository.html 在Ubuntu 下&#xff0c;解压&#xff0c;添加x 权限后执行安装 chmod 777 xrdp-installer-1.4.7.sh ./xrdp-installer-1.4.7.sh安装完毕后&…

【嵌入式模型转换】2. 算能盒子SE5 芯片板子BM1684 sophon-pipeline

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1. 开始安装 前言 文章1&#xff0c;我们在SE5上实现了&#xff0c;SOC模式下的 C 和 python-sail的模型转换&#xff0c;文章连接&#xff1a; 【嵌入式模型转…

VUE L ∠脚手架新生命周期过度动画 ⑩⑦

目录 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持✨ V u e j s Vuejs Vuejs初识 V u e C L I VueCLI VueCLI C L I CLI CLI n e x t T i c k nextTick nextTick C L I CLI CLI V u e Vue Vue封装的过度与动画 C L I CLI …

第十五章 Swin-Transformer网络详解

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…

Selenium教程__获取界面handle、title和url(7)

本文将介绍如何使用Selenium来获取界面的句柄、标题和URL&#xff0c;并展示一些实际应用场景。 学习本文内容将能够轻松地获取并利用界面的句柄、标题和URL&#xff0c;从而更好地跟踪和管理UI的状态和行为。 from selenium import webdriverdriver webdriver.Chrome() dr…

dlib 人脸识别

其实很不明白&#xff0c;这个库存在这么久了&#xff0c;但csdn有关其的资料那么少&#xff0c;这里写点抛砖引玉。 代码思路&#xff1a; 获取人脸人脸对齐对齐后的人脸转128维向量人脸识别&#xff08;计算向量的距离&#xff09; 效果&#xff1a; dlib检测人脸确实有点慢…

VLAN间通信之VLANIF虚接口

VLAN间通信之VLANIF虚接口 说明&#xff1a;想要实现VLAN间互访有很多解决方案&#xff1a; 1&#xff09;VLAN终结--也称单臂路由 2&#xff09;VLANIF虚接口---最受欢迎的解决方案 1、VLANIF虚接口 1&#xff09;VLANIF接口是一种三层虚拟接口&#xff0c;可以实现VLAN间的…

浏览器F12开发者工具

浏览器F12开发者工具 1.介绍2.工具附录 1.介绍 F12常用于网站界面测试、调试&#xff0c;分析问题&#xff0c;查看HTML元素、查看响应事件和数据等&#xff0c;还可帮助测试工程师定位前后端Bug&#xff1b; 其中使用最多的功能页面是&#xff1a;元素&#xff08;Elements&…

数据结构--顺序表的定义

数据结构–顺序表的定义 知识总览 顺序表 \color{red}顺序表 顺序表―一用 顺序存储 \color{red}顺序存储 顺序存储的方式实现线性表 顺序存储。把 逻辑上相邻 \color{red}逻辑上相邻 逻辑上相邻的元素存储在 物理位置上也相邻 \color{red}物理位置上也相邻 物理位置上也相邻的…

设计模式第16讲——迭代器模式(Iterator)

目录 一、什么是迭代器模式 二、角色组成 三、 优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 代码结构 5.1 Student——学生实体类 5.2 StudentIterator——抽象迭代器&#xff08;Iterator&#xff09; 5.3 StudentListIterator——具体迭代器…