使用STM32CubeMX配置串口各种功能

使用STM32CubeMX配置串口各种功能

  • STM32CubeMX软件的安装
  • 接收+空闲中断
    • STM32CubeMX配置
      • 1.新建工程
      • 2. 选择芯片
      • 3. 选择时钟和下载方式
      • 4. 配置串口
      • 5.设置工程消息
      • 6.生成代码
      • 7.修改生成的代码
  • 空闲中断+DMA转运
    • STM32CubeMX配置
      • 4.配置串口
      • 5.设置工程消息
      • 6.生成代码
      • 7.修改生成的代码

STM32CubeMX软件的安装

STM32CubeMX软件的具体安装过程这篇博客里STM32CubeMX-下载及使用。这里就不在叙述了。

接收+空闲中断

将串口配置为接收和空闲中断,来接收不定长的数据。
原理:两帧数据直接会出现时间间隔。而空闲中断就是当数据在连续接收后有一段时间没有接收到数据时产生的中断。可以依次作为每帧数据的区分。

STM32CubeMX配置

1.新建工程

在这里插入图片描述

2. 选择芯片

在这里插入图片描述

3. 选择时钟和下载方式

1.时钟外部8m晶振
在这里插入图片描述
在这里插入图片描述

2.下载方式-st-link
在这里插入图片描述

4. 配置串口

在这里插入图片描述

5.设置工程消息

在这里插入图片描述
在这里插入图片描述

6.生成代码

在这里插入图片描述
在这里插入图片描述

7.修改生成的代码

在usart.c的文件中找到void MX_USART1_UART_Init(void);这个函数,在里面添加这两句。
含义是打开接收,空闲中断。

	__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);

在这里插入图片描述
接着找到中断函数。在stm32f1xx_it.c这个文件夹里,大概在204行的位置。写接收的代码

void USART1_IRQHandler(void)
{static uint8_t i=0;/* USER CODE BEGIN USART1_IRQn 0 */if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE) == SET ){RxBuff[i++] = READ_REG(huart1.Instance->DR);if(i==149){i=0;}}if( __HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) == SET  ){__HAL_UART_CLEAR_IDLEFLAG(&huart1);Rx_Flag[0]=1;Rx_Flag[1]=i;i=0;}/* USER CODE END USART1_IRQn 0 */HAL_UART_IRQHandler(&huart1);/* USER CODE BEGIN USART1_IRQn 1 *//* USER CODE END USART1_IRQn 1 */
}

这段代码的意思是,将接收到的数据放到RxBuff[]数组里。当一帧数据全部发送完成时,进入到空闲中断也就是下面那个if判断函数里,在这里首先清除了空闲中断的标志位,接着将Rx_Flag[0]接收完成的标志位给置一,并且将i的值赋给Rx_Flag[1]表示接收了多长的数据。最后把i的值给清理,为下次接收做准备。

在主函数里判断Rx_Flag[0]接收完成标志位,等于1时,将接收到的数据再发送出去,并且清零这个标志位。
在这里插入图片描述

		if( Rx_Flag[0]==1){	Rx_Flag[0]=0;HAL_UART_Transmit(&huart1,RxBuff,Rx_Flag[1],0xffff);}

空闲中断+DMA转运

当数据较多,且频繁发送时,如果还采用来一个数据,进一次中断接收一下的这种方法,会造成频繁进中断,影响主函数的正常运行。那么该怎么接收这类数据呢?这时可以采用空闲+DMA的方式。空闲中断和上面的一样都是为了分开每帧数据,同时告诉我们数据接收完成的。
而DMA则可以直接进行外设到储存的数据转运。他就相当于一个大机器人里分出的一队小机器人。大机器人正常干自己的事,而分出来的小机器人则专心进行数据的搬运,把接收到数据搬到指定的位置。

STM32CubeMX配置

STM32CubeMX配置前3个步骤和上面的一样,这里直接从第4步开始。

4.配置串口

在这里插入图片描述
在这里插入图片描述

5.设置工程消息

6.生成代码

设置工程和生成代码的步骤和上面的一样,这里也不截图了。

7.修改生成的代码

同样在usart.c这个文件中的void MX_USART1_UART_Init(void)函数里添加这两句函数。

__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart1,Rx_Buff,150);

第一句是开启空闲中断。
第二句是开启MDA接收,将串口接收到的数据转运到Rx_Buff里,一共需要转运150个数据。
在这里插入图片描述
接着在中断函数里填写处理函数。

	if(__HAL_UART_GET_FLAG(&huart1 , UART_FLAG_IDLE) == SET ){__HAL_UART_CLEAR_IDLEFLAG(&huart1);uint8_t  len=150-__HAL_DMA_GET_COUNTER(huart1.hdmarx);HAL_UART_Transmit_DMA(&huart1,Rx_Buff,len);HAL_UART_Receive_DMA(&huart1,Rx_Buff,150);}

这一段的含义是首先判断是否有空闲中断的产生。有的话,清除控制中断标志位。同时接收了多少个数据。__HAL_DMA_GET_COUNTER(huart1.hdmarx);函数的意思是还剩余多少个空间没有进行转运。用全空间150减去剩余的空间等于已经转运的空间,也就是DMA转运了多少个,串口接收了多少个数据。
接着将接收到的数据再通过DMA进行转运到tx上转发出去。
最后再次设置DMA转运的地址和个数。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux详解:文件权限

文章目录 前言Linux文件权限基础文件成员与三组权限字符 权限的修改修改文件所有者总结 前言 在浩瀚的操作系统世界中,Linux以其开源、灵活和强大的特性,成为了服务器、开发环境以及众多个人用户的首选。而在Linux的众多特性中,文件权限机制…

openEuler 22.03 使用cephadm安装部署ceph集群

目录 目的步骤规格步骤ceph部署前准备工作安装部署ceph集群ceph集群添加node与osdceph集群一些操作组件服务操作集群进程操作 目的 使用ceph官网的cephadm无法正常安装,会报错ERROR: Distro openeuler version 22.03 not supported 在openEuler上实现以cephadm安装部…

xiaolin coding 图解 MySQL笔记——事务篇

1. 事务隔离级别是怎么实现的? 数据库中的**事务(Transaction)**先开启,然后等所有数据库操作执行完成后,才提交事务,对于已经提交的事务来说,该事务对数据库所做的修改将永久生效,…

掌握 Spring Boot 中的缓存:技术和最佳实践

缓存是一种用于将经常访问的数据临时存储在更快的存储层(通常在内存中)中的技术,以便可以更快地满足未来对该数据的请求,从而提高应用程序的性能和效率。在 Spring Boot 中,缓存是一种简单而强大的方法,可以…

408——数据结构(持续更新)

文章目录 一、绪论1.1 相关概念1.2 数据结构三要素1.3 相关习题1.4 复杂度1.4.1 时间复杂度1.4.2 复杂度相关习题 二、线性表 一、绪论 1.1 相关概念 数据:数据是信息的载体,所有能被输入到计算机中,且能被计算机处理的符号的集合。如图片、…

深入浅出:开发者如何快速上手Web3生态系统

Web3作为互联网的未来发展方向,正在逐步改变传统互联网架构,推动去中心化技术的发展。对于开发者而言,Web3代表着一个充满机遇与挑战的新领域,学习和掌握Web3的基本技术和工具,将为未来的项目开发提供强大的支持。那么…

C++学习日记---第16天

笔记复习 1.C对象模型 在C中,类内的成员变量和成员函数分开存储 我们知道,C中的成员变量和成员函数均可分为两种,一种是普通的,一种是静态的,对于静态成员变量和静态成员函数,我们知道他们不属于类的对象…

Leetcode 每日一题 205.同构字符串

目录 问题描述 过题图片 示例 解决方案 代码实现 题目链接 总结 问题描述 给定两个字符串 s 和 t,判断它们是否是同构的。如果 s 中的字符可以按某种映射关系替换得到 t,那么这两个字符串是同构的。具体来说,每个出现的字符都应当映射…

C# 集合(Collection)

文章目录 前言一、动态数组(ArrayList)二、哈希表(Hashtable)三、排序列表(SortedList)四、堆栈(Stack)五、队列(Queue)六、点阵列(BitArray&…

2.5 特征降维(机器学习)

2.5 特征降维 2.5.1 降维 降维:是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程。 ndarray 维数 嵌套的层数 0维 标量 1维 向量 2维 矩阵 3维 n维 二维数组 降低的维度…

【小白学机器学习41】如何从正态分布的总体中去抽样?比较不同的取样方差的差别

目录 1 目标:使用2种方法,去从正态分布的总体中去抽样,获得样本 1.1 step1: 首先,逻辑上需要先有符合正态分布的总体population 1.2 从总体中取得样本,模拟抽样的过程 2 从正态分布抽样的方法1 3 从正态分布抽样…

框架5:SpringBoot 2 - 核心功能

SpringBoot2 - 基础入门【一 ~ 五】,详见: 六、配置文件 6.1 properties文件格式 同之前的用法。 6.2 yaml文件格式【推荐】 YAML本意:“YAML”不是一种标记语言。但在开发中,实际把它理解为:“Yet Another Markup Lan…

行为型设计模式之《责任链模式》实践

定义 责任链模式(Chain Of Responsibility Pattern)顾名思义,就是为请求创建一条处理链路,链路上的每个处理器都判断是否可以处理请求,如果不能处理则往后走,依次从链头走到链尾,直到有处理器可…

Vue前端开发-路由树配置

一个配置路由的文件由导入路由模块、创建路由对象和导出路由对象三个部分组成,在创建路由对象时,需要构建路由数组,路由数组中包括一级、二级和多级路由结构,因此,这种结构的路由配置,又称为路由树配置。 …

2.mysql 中一条更新语句的执行流程是怎样的呢?

前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。 相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。 那么,一条更新语句的执行流程又…

JavaScript根据数据生成柱形图

分析需求 // 定义一个数组来存储四个季度的数据 dataArray = []// 循环4次,获取用户输入的数据并存储到数组中 for i from 0 to 3// 获取用户输入的数据inputData = 获取用户输入的第(i + 1)季度的数据// 将数据存入数组dataArray[i] = inputData// 遍历数组,根据数据生成柱…

实验13 使用预训练resnet18实现CIFAR-10分类

1.数据预处理 首先利用函数transforms.Compose定义了一个预处理函数transform,里面定义了两种操作,一个是将图像转换为Tensor,一个是对图像进行标准化。然后利用函数torchvision.datasets.CIFAR10下载数据集,这个函数有四个常见的…

【AI系统】代数简化

代数简化 代数简化(Algebraic Reduced)是一种从数学上来指导我们优化计算图的方法。其目的是利用交换率、结合律等规律调整图中算子的执行顺序,或者删除不必要的算子,以提高图整体的计算效率。 代数化简可以通过子图替换的方式完…

多人聊天室项目 BIO模型实现

BIO模型聊天室项目大体设计 BIO编程模型 Acceptor是服务器端负责监听具体端口的Socket每有一个客户端Client连接到服务器端,Acceptor就创建一个新的线程Handler来处理客户端发送的消息每一个客户端都有一个唯一的Handler来对应处理其事务为保证线程安全&#xff0c…

腾讯云平台 - Stable Diffusion WebUI 下载模型

1)进入控制台,点击算力连接 》 JupyterLab 2)进入模型目录(双击) 3)上传模型 例如:我要上传大模型