DMA实验3-外设到内存搬运

实验要求
 
使用 DMA 的方式将串口接收缓存寄存器的值搬运到内存中,同时闪烁 LED1
CubeMX 配置
DMA 配置:

 

串口中断配置

 

 代码实现

如何判断串口接收是否完成?如何知道串口收到数据的长度?
  • 使用串口空闲中断IDLE)!
  • 串口空闲时,触发空闲中断;
空闲中断标志位由硬件置 1 ,软件清零
利用串口空闲中断,可以用如下流程实现 DMA 控制的任意长数据接收:
1. 使能 IDLE 空闲中断;
2. 使能 DMA 接收中断;
3. 收到串口接收中断, DMA 不断传输数据到缓冲区;
4. 一帧数据接收完毕,串口暂时空闲,触发串口空闲中断;
5. 在中断服务函数中,清除中断标志位,关闭 DMA 传输(防止干扰);
6. 计算刚才收到了多少个字节的数据。
7. 处理缓冲区数据,开启 DMA 传输,开始下一帧接收。  
有三个文件需要修改
main.c
  1. rcvBuf:用于存储接收到数据的缓冲区数组。
  2. rcvLen:记录接收到的一帧数据的长度。
  3. __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE):启用UART1的IDLE(空闲)中断,用于检测接收完成。
  4. HAL_UART_Receive_DMA(&huart1, rcvBuf, 100):通过DMA方式使能UART1的接收中断,将接收到的数据存储到rcvBuf中,每次接收100个字节。
  5. while (1):一个无限循环,在循环体内通过定时器操作,每300毫秒切换GPIOB的引脚状态,用于示例,可以理解为一个简单的心跳或指示灯。while(1) 循环内的点灯操作主要是为了说明在数据通过DMA传输的同时,CPU仍然可以继续执行其他任务。点灯操作是一个简单的示例,用于演示在数据传输的间隙里,CPU可以执行其他任务而不会阻塞。在实际应用中,这个循环内可能包含更复杂的逻辑、任务或者状态管理。
main.h

 

stm32f1xx_it.c

 

  1. USART1_IRQHandler:UART1的中断服务函数。
  2. __HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) == SET:检查IDLE标志位是否被置位,即检测是否接收完成。
  3. __HAL_UART_CLEAR_IDLEFLAG(&huart1):清除IDLE标志位。
  4. HAL_UART_DMAStop(&huart1):停止DMA传输,防止DMA传输干扰。
  5. __HAL_DMA_GET_COUNTER(&hdma_usart1_rx):获取DMA传输的计数器信息,即还有多少数据未被传输。
  6. rcvLen = BUF_SIZE - temp:计算接收到的数据长度。
  7. HAL_UART_Transmit_DMA(&huart1, rcvBuf, rcvLen):通过DMA发送接收到的数据。
  8. HAL_UART_Receive_DMA(&huart1, rcvBuf, BUF_SIZE):重新启动DMA接收,准备接收下一帧数据。

这段代码实现了当UART1接收到一帧完整的数据后,通过DMA将接收到的数据传输到缓冲区,并进行相应的处理。

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

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

相关文章

十一、W5100S/W5500+RP2040之MicroPython开发<MQTT阿里云示例>

文章目录 1. 前言2. 平台操作流程3. WIZnet以太网芯片4. 示例讲解以及使用4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 烧录验证 5. 注意事项6. 相关链接 1. 前言 在这个智能硬件和物联网时代,MicroPython和树莓派PICO正以其独特的优势引领着嵌入式开发…

谷歌 | Duet AI 让洞察、聚类模型和可视化变得简单

迷失在数据的海洋 我们都经历过这样的情况:淹没在数据的海洋中,努力驾驭复杂的管道,感觉数据令人头晕。管理大量充满不同工具和 Google 搜索的选项卡以及花费大量时间筛选数据和代码以创建满足您需求的模型所带来的挫败感,真的会…

探索UX设计师的日常任务,赶紧看看

UX 设计师专注于产品开发的各个方面,包括设计、可用性、功能、甚至品牌和营销。他们的工作涉及用户与产品交互的整个端到端旅程,包括为产品和业务识别新的机会。 鉴于他们广泛的范围,UX 设计师根据公司和项目的要求,执行多种不同…

探索 MajicStudio:一款多功能视频编辑软件

一、产品简介 MajicStudio是一款基于人工智能的图片编辑与设计工具,拥有简洁的界面与丰富功能。采用深度学习和计算机视觉技术可以自动识别图片要素。 二、应用场景 MajicStudio的AI图像功能适用于多场景,包括艺术设计、电商、游戏和文创等场景。 三…

【Proteus仿真】【Arduino单片机】蓝牙遥控小车

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器,使LCD1602液晶,L298电机,直流电机,HC05/06蓝牙模块等。 主要功能: 系统运行后,LCD1602…

数据结构和算法笔记2:二分法

二分法网上有两种写法&#xff0c;一种左闭右闭&#xff0c;一种左闭右开&#xff0c;个人习惯左闭右闭的写法&#xff0c; 有序数组查找数 这是标准二分法&#xff0c;对应力扣的704. 二分查找&#xff1a; 求值为target的索引 int search(vector<int>& nums, i…

Thread类的基本用法

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;JavaEE &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; Thread 1. 线程创建1.1 继承Thread类1.2 实…

arcEngine修改字段标注

修改字段标注 在arcEngine中&#xff0c;有时候需要修改图层要素的标注值&#xff0c;而且每个字段值对应了要修改的内容&#xff0c;如字段值”1“替换成”A“&#xff0c;字段值”2“替换成”B“等&#xff0c;这就需要在替换的图层中&#xff0c;遍历每个要素&#xff0c;查…

LeetCode 21 合并两个有序链表

题目描述 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [],…

「用户与社区的深度对话」2023年度IvorySQL满意度调研

致IvorySQL社区成员&#xff0c; &#x1f3c3;‍♂️2023年即将进入尾声&#xff0c;感谢每一位社区朋友对IvorySQL的支持。我们诚挚地邀请您参与我们的社区满意度调研。您的反馈对我们至关重要&#xff0c;将有助于改进我们的服务&#xff0c;为您提供更好的社区体验&#xf…

[数据结构进阶 C++] 二叉搜索树(BinarySearchTree)的模拟实现

文章目录 1、二叉搜索树1.1 二叉搜索数的概念1.2 二叉搜索树的操作1.2.1 二叉搜索树的查找1.2.2 二叉搜索树的插入1.2.3 二叉搜索树的删除 2、二叉搜索树的应用2.1 K模型2.2 KV模型 3、二叉搜索树的性能分析4、K模型与KV模型完整代码4.1 二叉搜索树的模拟实现&#xff08;K模型…

设计模式(三)-结构型模式(6)-享元模式

一、为何需要享元模式&#xff08;Flyweight&#xff09;? 假如在网页中渲染这样的一个画面&#xff1a;大小不一的星星铺满了整个画布&#xff0c;并且都在不断的进行移动闪烁着。一批星星消失了&#xff0c;另一批又从另一边缘处出现。 要实现这样的渲染效果&#xff0c;在…

C语言之初识C语言

文章目录 前言一、什么是C语言二、第一个C语言程序三、数据类型四、变量&#xff0c;常量1、变量1.1 变量的命名1.2 变量的分类1.3 变量的使用1.4 变量的作用域和生命周期2、变量 五、字符串1. 概念2. 求解字符串的长度【strlen】3. 转义字符【含笔试题】 六、注释七、选择语句…

ESP8266 TCP/串口透传

简介 先在PC上做测试, 使用串口软件对ESP8266 模块进行设置, 使用网络助手软件与串口软件进行自由收发设置 ATRST ## 复位 ATCWMODE_DEF1 ## 设置为Station模式 ATCWJAP_DEF“路由器wifi名称”,“路由器wifi密码” ## 设置ESP连接的路由器名称密码 ATCIPSTART“TCP”,“192.1…

Alpha突触核蛋白神经退行性疾病

Alpha突触核蛋白科研背景 ● Alpha突触核蛋白约 15kDa, 140个氨基酸 ● StressMarq在E. coli中过表达人源基因然后将蛋白从细胞质基质中纯化出来 ● 未折叠的alpha突触核蛋白单体在12% SDS-PAGE上为~15 kDa的条带 StressMarq/欣博盛生物的Alpha突触核蛋白有以下两类&#xf…

[uni-app] mescroll与 page 本身的滚动冲突处理, 动态禁用下拉刷新

参考贴: uniapp动态禁用mescroll-body组件的下拉刷新,或者动态禁用mescroll-body组件的上拉加载 记录问题场景 如图: 搜索和 第二个标签栏, 都是随页面滚动的, 当页面滚动一定距离, 会触发标签栏的吸顶 即如上图, 问题描述 当列表页面数据部满屏时, 且页面已经由于滚动而吸顶…

许可式邮件营销与垃圾邮件的区别:合规与效果的关键区分

接触过邮件营销的人一定不陌生“垃圾邮件”和“许可式邮件营销”这两个名词。在各大电商节到来之际&#xff0c;小编帮助大家弄清楚什么是垃圾邮件&#xff1f;什么是许可式邮件营销&#xff1f;为什么会变成垃圾邮件&#xff1f;怎么做许可式邮件营销&#xff1f;让大家在促销…

极智嘉(Geek+)货到人方案优势显著,助力拆零场景效率提升

众所周知&#xff0c;零售行业所面临的物流挑战比其他行业更为严峻。这是由于零售行业复杂的行业业态、繁多的商品种类、“唯快主义”的配送需求&#xff0c;以及零售行业的终端客户多为个体消费者&#xff0c;购买习惯以单件、多品为主&#xff0c;购买习惯具有周期性和爆发性…

minio 分布式对象存储

分布式文件系统应用 1.1、Minlo 介绍 Minlo 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等&#xff0c;而一个对象…

LVM将多个磁盘组成一个逻辑卷实战

LVM&#xff08;Logical Volume Manager&#xff09;是一种逻辑卷管理器&#xff0c;是Linux系统中的一个重要的存储管理技术。它的主要作用是将若干个硬盘分区或者物理硬盘合并成一个逻辑卷组&#xff08;Volume Group&#xff0c;简称VG&#xff09;&#xff0c;然后再将逻辑…