stm32使用(无线串口)实现收发、判断数据+DMA(HAL库)

目录

前言:

1.    用CubeMX配置串口+DMA所需要的环境

(1)打开CubeMAX,点击红框

 (2)查找stm32F103C8T6的芯片

(3)配置SYS

 (4)配置RCC时钟

(5)配置主频

(6)配置串口

(7)配置DMA

(8)生成工程

2.串口中断与DMA相关重要函数介绍

(1)串口相关 

接收完成回调函数:

 接收串口的函数:

 发送串口的函数:

空闲中断打开函数:

在每次进入中断后,判断是否为空闲中断:

清除空闲标志位

终止当前的接收(会把RxferCount清零)

终止接收回调函数

发送完成回调函数

(2)DMA相关

串口DMA接收函数:

串口DMA发送函数:

3.编写相关代码

(1)项目要求

(2)相关代码编写

1.全局变量

2.main.c

3.stm32f1xx_it.c

4.ATK-LORA-01无线串口的使用

1.使用该无线串口前,需要通过软件调整该串口的参数配置。

2.步骤如下:

总结:


前言:

      本文章使用stm32f103c8t6进行HAL库串口程序的使用,可以解决串口接收发送数据问题,也使用了DMA转运,但没有实现无线数据传输(脑子笨了点),此外,本章也会初步的介绍关于ATK-LORA-01无线串口模块的使用,当然,这也指的是透明传输这一方面。

      STM32的串口收发信息,标准库的代码b站上江协科技我认为已经讲的非常清楚了,但可惜没有hal库的,其他的博主,还有网络上的一些视频,貌似距离如接收“stop”然后发送“”stop”,接着接收“start”然后发送“start”都有些困难,他们通过只接受一个字节然后进入中断,所以我实际用CUbeMX来带领大家来操作一遍,无脑掌握。

     备注:关于串口无限数据传输的方法我认为下面这一篇博客讲的非常厉害,使用串口的空闲中断,而且也给出了解决方法,给了我很大启发,链接如下:超子物联网HAL库笔记:串口篇

1.    用CubeMX配置串口+DMA所需要的环境

(1)打开CubeMAX,点击红框

 (2)查找stm32F103C8T6的芯片

C8T6和C8T6TR都可以,双击。

 

(3)配置SYS

 (4)配置RCC时钟

注意如果这个没有配置好的话,就不能配置72MHz的主频。

(5)配置主频

直接双击改写为72,之后敲下Enter,自动配置完毕。

(6)配置串口

一定要使能串口中断!!接收不到信号。

(7)配置DMA

由于要使用DMA,我们先在这里吧DAM配置好。

配置中等速度其他的不用改。

(8)生成工程

 以上就是CubeMX所有的准备操作啦,下面是实现的代码。

2.串口中断与DMA相关重要函数介绍

(1)串口相关 

HAL库为串口中断提供了很多回调函数。 比如 错误回调、半完成回调、Rx、Tx完成回调。你需要用什么回调,就声明什么回调~

接收完成回调函数:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

其中“RxCpltCallback” 可以分解为以下部分:

  • “Rx” 通常代表 “Receive”,即接收。
  • “Cplt” 通常代表 “Complete”,即完成。
  • “Callback” 即回调,指的是当某个特定事件发生时被调用的函数。

 接收串口的函数:

HAL_UART_Receive_IT(&Uart1,Buff,Rx_Size,200)

他的参数分别为:串口配置结构体地址、接收缓冲区(我们自己定义的数组)、预计接收的字节个数(我们自己定义)、超时时间(单位为ms)

接收串口的函数会有四个返回值:

HAL_OK、 代表此次在200ms内接受到了 200 字节。 (也就是与预计相等)
HAL_ERROR 、代表传参错误、 比如超时时间为0、或者数据缓冲区地址为空
HAL_TIMEOUT 、代表未能在规定时间内接收到 200 个字节
往往分为两种情况: 1、接收了但没接收完、2、一点没接收
HAL_BUSY、代表已经在接受了。在忙

注意!!!当接受完size(预计接受的字节)后就会触发串口中断,但如果没有接收完size个字节,而是少接受了字节,就不会触发串口中断,但是数组缓冲区中仍然有数据,这也就是为什么很多博主喜欢把size设置为1,因为一接触到数据就进一次中断。

 发送串口的函数:

HAL_UART_Transmit_IT(&huart1,txBuff,200);

 他的参数分别为:串口配置结构体地址、发送缓冲区(我们自己定义的数组)、预计发送的字节个数(我们自己定义)。

空闲中断打开函数:

__HAL_UART_ENABLE_IT(&uart1.uart,UART_IT_IDLE);

在每次进入中断后,判断是否为空闲中断:

if(__HAL_UART_GET_FLAG(&uart1.uart, UART_FLAG_IDLE))

清除空闲标志位

__HAL_UART_CLEAR_FLAG(&uart1.uart, UART_FLAG_IDLE);

终止当前的接收(会把RxferCount清零)

HAL_UART_AbortReceive_IT(&uart1.uart);

终止接收回调函数

void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart)

发送完成回调函数

HAL_UART_TxCpltCallback

(2)DMA相关

DMA(Direct Memory Access)是一种直接内存访问技术,

可以在不经过CPU的情况下实现外设与内存之间的数据传输,提高数据传输效率

同时,DMA同样可以触发串口中断,进入串口中断函数处理任务。

串口DMA接收函数:

HAL_UART_Receive_DMA(&huart1, (uint8_t *)&ReBuff,5);

他的参数分别为:串口配置结构体地址、接收缓冲区(我们自己定义的数组)、预计接收的字节个数(我们自己定义)。

其效果和串口接收函数是一样的,注意的要点也一样,这里就不多描述。

串口DMA发送函数:

HAL_UART_Transmit_DMA(&huart1,(uint8_t *)"stop",5);

他的参数分别为:串口配置结构体地址、发送缓冲区(我们自己定义的数组或字符串)、预计发送的字节个数(我们自己定义)。

3.编写相关代码

(1)项目要求

stm32使用(无线串口)实现收发、判断数据+DMA(HAL库),现象如下:

项目开始:单片机通过串口发送: Hello windows! ,后PC端通过串口助手发送stop,单片机接收到后停止Hello windows!发送,PC端再通过串口助手发送start,单片机接收到后同样发送start,并且开始Hello windows!发送。如下图

(2)相关代码编写

1.全局变量

char ReBuff[5];//接收缓冲区
int flag=1;//对于stop和start的判断标志
uint8_t SendBuff[]="Hello windows! ";//字符串"Hello windows! "封装
const char *str1="start";//字符串"start! "封装
const char *str2="stop";//字符串"stop "封装
char *result1 ;//strstr比较结果
char *result2 ;

2.main.c

在while函数上加上HAL_UART_Receive_DMA(&huart1, (uint8_t *)&ReBuff,5);

接收串口信息,当达到5个数组时触发中断。

下面是while里面的函数

/* USER CODE BEGIN 3 */
        result1 = strstr(ReBuff, str1);
    result2 = strstr(ReBuff, str2);
        if(result1)
        {
            flag=1;
        HAL_UART_Transmit_DMA(&huart1,(uint8_t *)"start",5);
            memset(ReBuff, 0, sizeof(ReBuff));   
            result1 =0;
            
        }
        else if(result2)
        {
          flag=0;
            HAL_UART_Transmit_DMA(&huart1,(uint8_t *)"stop",5);
            memset(ReBuff, 0, sizeof(ReBuff));
      result2 =0;            
        }
        if(flag==1)
     {
          HAL_UART_Transmit_DMA(&huart1,(uint8_t *)SendBuff,17);
            HAL_Delay(1000);
     }
  }
  /* USER CODE END 3 */

这里使用的strstr函数,用于查找子字符串在另一个字符串中的第一次出现,使用此函数时要添加下面的头文件才可以使用。

#include "string.h"
#include "stdio.h"

 这里使用的memset函数,用于清零数组。同样要加上述头文件。

下面是,HAL_UART_RxCpltCallback里触发中断后的操作

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance==USART1)//判断是串口1中断被触发
	{
		HAL_UART_Receive_DMA(&huart1, (uint8_t *)&ReBuff,5); //用于再次开启串口中断等待
	}
}

3.stm32f1xx_it.c

主要修改void USART1_IRQHandler(void),其他不需要修改。

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 */
  /* 在每次进入中断后,判断是否为空闲中断 */
    if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE)){
        /* 清除空闲标志位 */
        //__HAL_UART_CLEAR_FLAG(&uart1.uart, UART_FLAG_IDLE);
        __HAL_UART_CLEAR_IDLEFLAG(&huart1);
        /* 终止当前的接收(会把RxferCount清零) */
        HAL_UART_AbortReceive_IT(&huart1);//放弃串口1中断
        HAL_UART_Receive_DMA(&huart1, (uint8_t *)&ReBuff,5);//开启串口1中断
    }
  /* USER CODE END USART1_IRQn 1 */
}

      这里最后放弃串口1中断,是因为不放弃的话,比如串口1接收到长度为4的信号stop,这时候主函数中判断已经发生,且已经将接收缓冲数组中的值清零,但由于没有放弃串口1中断,导致继续接收的数据没有从缓冲数组的首位开始写,使得数据紊乱。所以需要重新关闭再开启接收中断。

      至此,软件部分编写完毕。

4.ATK-LORA-01无线串口的使用

1.使用该无线串口前,需要通过软件调整该串口的参数配置。

2.步骤如下:

(1)用UBS-TTL串口连接无线串口进行参数配置

连接MD0引脚后,在上位机按下

等待出现框中回复时,可进行配置,再按下“保存配置”时,配置成功!

注意!!!通讯中的两个ATK-LORA-01模块都要配置相同信道、波特率、地址、功率。

上位机软件如下:

通过网盘分享的文件:上位机软件.rar
链接: https://pan.baidu.com/s/1qQxlQT5BfZvN-iksfvM45g 提取码: ua25

总结:

       我们学习知识,要理解运用,将所用到的知识化为自己的知识才是重点。此外,串口通常只是单对单的通信,这一点上我认为不如IIC,希望这篇文章能够帮助到大家,谢谢!

       文章程序源码我发在下面了,需要自取。

通过网盘分享的文件:DMA-test1
链接: https://pan.baidu.com/s/1HVK7Me02YbYHvHsmysKrFA 提取码: ike8

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QT入门--QMainWindow

从上向下依次是菜单栏,工具栏,铆接部件(浮动窗口),状态栏,中心部件 菜单栏 创建菜单栏 QMenuBar* mybar1 menuBar(); 将菜单栏放到窗口中 setMenuBar(mybar1); 创建菜单 QMenu *myfilemenu mybar1-…

重构清洁想象,石头科技首创五轴仿生机械手打破传统清洁边界

2月25日,主题为“重构清洁想象”的石头科技2025发布会在上海天文馆正式召开。石头科技清洁产品BU总裁钱启杰在会上宣布,石头科技正式成为上海天文馆授权合作伙伴,希望借助航天科技到家庭科技的跨越,进一步简化家庭清洁工作&#x…

Amazon Outposts:构建混合云的安全堡垒,让数据安全“零距离”

在数字化转型的浪潮中,企业纷纷拥抱混合云架构以兼顾敏捷性与本地化需求。然而,如何确保数据在本地与云端的无缝流转中始终安全可控,成为企业面临的核心挑战。Amazon Outposts 作为AWS推出的混合云解决方案,不仅将原生AWS服务延伸…

详解Redis如何持久化

引言 本文介绍了 Redis 的两种持久化方式:RDB 和 AOF。RDB 按时间间隔快照存储,AOF 记录写操作。阐述了它们的配置、工作原理、恢复数据的方法、性能与实践建议,如降低 fork 频率、控制内存等,还提到二者可配合使用,最…

【Ambari】Ranger KMS

目录 一、Ranger KMS介绍 二、KMS基于Ranger插件安装 一、Ranger KMS介绍 Ranger KMS是把数据存储入后台数据库中。通过Ranger Admin可以集中化管理KMS服务。 Ranger KMS有三个优点 l Key management Ranger admin 提供了创建,更新,删除密钥的Web UI…

vscode设置终端复制快捷键(有坑!!!)

vscode的编辑页面和终端的复制粘贴快捷键是不一样的。 vscode的终端复制快捷键为ctrlshiftC,当然,自己可以自定义设置 vscode设置终端复制快捷键(有坑!!!)_vs code 不能复制-CSDN博客文章浏览…

angular舒尔特方格

说明:我计划用angular实现舒尔特方格的功能,必须是动态的,比如33,55,9*9,而且无论是什么样式的,都必须保持正方形,然后还有时间监听,计算用户完成方格的时间,…

提升数据洞察力:五款报表软件助力企业智能决策

概述 随着数据量的激增和企业对决策支持需求的提升,报表软件已经成为现代企业管理中不可或缺的工具。这些软件能够帮助企业高效处理数据、生成报告,并将数据可视化,从而推动更智能的决策过程。 1. 山海鲸报表 概述: 山海鲸报表…

DistilQwen2.5发布:通义千问蒸馏小模型再升级

01 引言 因高计算成本和复杂性,在例如移动设备和边缘计算场景等资源有限的环境中,限制了大语言模型的普及。如何在保留模型性能的同时提高计算效率并降低部署成本,已成为研究和工业界必须面对的关键挑战。 在此背景下,我们正式…

VS2022配置FFMPEG库基础教程

1 简介 1.1 起源与发展历程 FFmpeg诞生于2000年,由法国工程师Fabrice Bellard主导开发,其名称源自"Fast Forward MPEG",初期定位为多媒体编解码工具。2004年后由Michael Niedermayer接任维护,逐步发展成为包含音视频采…

【前端基础】Day 1 HTML

总结: 1. Web标准的构成 2. 基本标签 目录 1. Web标准的构成 2. 基本标签 2.1快捷键 2.2.1标题标签 2.2.2段落和换行标签 2.2.3文本格式化标签 2.2.4div和span标签 2.3.1 图像标签和路径 2.3.2路径 2.3.3超链接标签 2.4注释标签 2.5特殊字符 1. Web标准…

Android Realm数据库使用与集成指南

本地存储storage集成创建Realm数据模型插入和更新数据模型数据查询统计数据分页查询处理表数据删除操作总结Realm 是一款专为移动端和嵌入式场景设计的高性能、跨平台的 对象数据库(NoSQL),由 MongoDB 团队维护。它的核心思想是将数据模型直接映射到对象(如 Java/Kotlin、S…

(九)趣学设计模式 之 桥接模式!

目录 一、 啥是桥接模式?二、 为什么要用桥接模式?三、 桥接模式的实现方式四、 桥接模式的优缺点五、 桥接模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支…

Day8 蓝桥杯acw讲解

首先先给大家看一道这个题, 我真的是太喜欢y总了,如果大家也是最近在准备蓝桥杯或者计算机相关的比赛,但是得加一个前提就是必须最好基础真的很好,要不然其实买了课,也没啥太大的用处,其实就可以以我本人举…

谷云科技iPaaS×DeepSeek:构建企业智能集成的核心底座

2025年,DeepSeek大模型的爆发式普及,正引领软件行业实现 “智能跃迁”。从代码生成到系统集成,从企业级应用到消费级产品,自然语言交互能力已成为新一代软件的核心竞争力。据行业分析,超60%的软件企业已启动大模型适配…

java面试项目介绍,详细说明

金三银四少走弯路,Java岗面试冲刺,你与大厂只差这篇文章包括面试准备,帮助大家少走弯路,成功入职大厂,并快速成长落地。 祝大家拿到满意的offer!(把许愿的offer发在评论区,一定会实现的) 主要从四大方面:掌握的主要知识、算法、项目、简历 掌握的主要知识 下面是我看过的资料和…

计算机毕业设计SpringBoot+Vue.js墙绘产品展示交易平台(源码+文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

springboot005学生心理咨询评估系统(源码+数据库+文档)

源码地址:学生心理咨询评估系统 文章目录 1.项目简介2.部分数据库结构与测试用例3.系统功能结构4.包含的文件列表(含论文)后台运行截图 1.项目简介 ​ 使用旧方法对学生心理咨询评估信息进行系统化管理已经不再让人们信赖了,把现…

Linux红帽:RHCSA认证知识讲解(二)配置网络与登录本地远程Linux主机

Linux红帽:RHCSA认证知识讲解(二)配置网络与登录本地远程Linux主机 前言一、使用命令行(nmcli 命令)配置网络,配置主机名第一步第二步修改主机名称 二、使用图形化界面(nmtui 命令)配…

【运维】内网服务器借助通过某台可上外网的服务器实现公网访问

背景: 内网服务器无法连接公网,但是办公电脑可以连接内网服务器又可以连接公网。 安装软件 1、frp 2、ccproxy 配置 1、内网服务器 # 内网服务器启动frp服务配置文件参考vi frps.ini# frps.ini [common] bind_port 7000# 备注: bind_port端口可以随意配置。配置完…