当前位置: 首页 > news >正文

【温酒笔记】DMA

参考文档:野火STM32F103

1. Direct Memory Access-直接内存访问

DMA控制器独立于内核
是一个单独的外设

  • DMA1有7个通道
  • DMA2有5个通道
  • DMA有四个等级,非常高,高,中,低四个优先级
  • 如果优先等级相同,通道编号越小优先级越高
  • 数据流向: 存储器到存储器,存储器到外设,外设到存储器
  • 单次传输或循环传输
  • 传输过半中断,传输完成中断,传输错误中断

2. 串口示例

  1. 初始化

// 定义一个GPIO初始化结构体,并初始化为0
GPIO_InitTypeDef GPIO_InitStruct = {0};// 检查当前USART实例是否为USART1
if(uartHandle->Instance==USART1)
{// 用户自定义代码区域开始(USART1_MspInit 0)/* USER CODE BEGIN USART1_MspInit 0 */// 用户自定义代码区域结束(USART1_MspInit 0)/* USER CODE END USART1_MspInit 0 */// 使能USART1时钟__HAL_RCC_USART1_CLK_ENABLE();// 使能GPIOA时钟__HAL_RCC_GPIOA_CLK_ENABLE();// USART1 GPIO配置说明/**USART1 GPIO ConfigurationPA9     ------> USART1_TXPA10     ------> USART1_RX*/// 配置GPIO引脚GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; // 选择PA9和PA10引脚GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;       // 设置为复用推挽输出模式GPIO_InitStruct.Pull = GPIO_NOPULL;           // 不使用上拉或下拉电阻GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; // 设置最高频率GPIO_InitStruct.Alternate = GPIO_AF4_USART1;  // 选择USART1复用功能HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);       // 初始化GPIO// USART1 DMA初始化// USART1_TX DMA通道初始化hdma_usart1_tx.Instance = DMA1_Channel2;      // 选择DMA1通道2hdma_usart1_tx.Init.Request = DMA_REQUEST_3;  // 选择DMA请求3hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; // 数据传输方向:内存到外设hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;     // 禁用外设地址递增hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;         // 启用内存地址递增hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; // 外设数据对齐方式:字节hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;   // 内存数据对齐方式:字节hdma_usart1_tx.Init.Mode = DMA_NORMAL;                 // 设置为普通模式hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;       // 设置优先级为低if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)           // 初始化DMA{Error_Handler();                                     // 如果初始化失败,调用错误处理函数}// 将DMA与USART1_TX关联__HAL_LINKDMA(uartHandle,hdmatx,hdma_usart1_tx);// USART1中断初始化HAL_NVIC_SetPriority(USART1_IRQn, 2, 0);               // 设置USART1中断优先级HAL_NVIC_EnableIRQ(USART1_IRQn);                       // 使能USART1中断// 用户自定义代码区域开始(USART1_MspInit 1)/* USER CODE BEGIN USART1_MspInit 1 */// 用户自定义代码区域结束(USART1_MspInit 1)/* USER CODE END USART1_MspInit 1 */
}
  1. DMA发送
/* USART1 向 DMA发出TX请求 */HAL_UART_Transmit_DMA(&UartHandle, (uint8_t *)SendBuff ,SENDBUFF_SIZE);
  1. 使用DMA传输完成中断
//初始化
void MX_DMA_Init(void)
{// 使能DMA控制器时钟__HAL_RCC_DMA1_CLK_ENABLE();// DMA中断初始化// 配置DMA1通道2和3的中断HAL_NVIC_SetPriority(DMA1_Channel2_3_IRQn, 2, 0); // 设置DMA1通道2和3中断的优先级为2,子优先级为0HAL_NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);         // 使能DMA1通道2和3的中断
}
//中断服务函数
/*** @brief This function handles DMA1 channel 2 and channel 3 interrupts.*/
void DMA1_Channel2_3_IRQHandler(void)
{/* USER CODE BEGIN DMA1_Channel2_3_IRQn 0 *//* USER CODE END DMA1_Channel2_3_IRQn 0 */HAL_DMA_IRQHandler(&hdma_usart1_tx);/* USER CODE BEGIN DMA1_Channel2_3_IRQn 1 *//* USER CODE END DMA1_Channel2_3_IRQn 1 */
}
//中断回调函数-打印传输完成结果void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{if(huart == &huart1){printf(" dma_ok\r\n");}
}
//主函数while (1){HAL_UART_Transmit_DMA(&huart1, Tx_buff, 10);HAL_Delay(1000);}

结果:传输完数据到中断回调函数中打印 : dma ok
在这里插入图片描述

3. 库函数备注

串口发送/接收函数
HAL_UART_Transmit():串口发送数据,使用超时管理机制
HAL_UART_Receive():串口接收数据,使用超时管理机制
HAL_UART_Transmit_IT():串口中断模式发送
HAL_UART_Receive_IT():串口中断模式接收
HAL_UART_Transmit_DMA():串口DMA模式发送
HAL_UART_Transmit_DMA():串口DMA模式接收串口中断函数
HAL_UART_IRQHandler(UART_HandleTypeDef *huart); //串口中断处理函数
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); //串口发送中断回调函数
HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); //串口发送一半中断回调函数(用的较少)
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); //串口接收中断回调函数
HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//串口接收一半回调函数(用的较少)
HAL_UART_ErrorCallback();串口接收错误函数

相关文章:

【温酒笔记】DMA

参考文档:野火STM32F103 1. Direct Memory Access-直接内存访问 DMA控制器独立于内核 是一个单独的外设 DMA1有7个通道DMA2有5个通道DMA有四个等级,非常高,高,中,低四个优先级如果优先等级相同,通道编号越…...

力扣判断字符是否唯一(位运算)

文章目录 给一个数n,判断它的二进制位中第x位是0还是1(从0开始计数)将一个数n的二进制位第X位修改为1(从0开始计数)将一个数n的二进制第x位修改为0(从0开始计数)提取一个数n二进制中最右侧的1去掉一个数n二进制表示中最右侧的1 今天我们通过判断字符是否唯一这个题来了解位运算…...

GPU和CPU区别?为什么挖矿、大模型都用GPU?

GPU(图形处理单元)和CPU(中央处理单元)是计算机中两种不同类型的处理器,它们在设计和功能上有很大的区别。 CPU是计算机的大脑,专门用于执行各种通用任务,如操作系统管理、数据处理、多任务处理等。它的架构设计旨在适应多种任务&#xff0c…...

新兴斗篷cloak技术,你了解吗?

随着互联网技术的飞速发展,网络营销领域也经历了翻天覆地的变革。 从最早的网络横幅广告到如今主流的搜索引擎和社交媒体营销,广告形式变得越来越多样。 其中,搜索引擎广告一直以其精准投放而备受青睐,但近年来,一项名…...

【抽代复习笔记】34-群(二十八):不变子群的几道例题

例1:证明,交换群的任何子群都是不变子群。 证:设(G,o)是交换群,H≤G, 对任意的a∈G,显然都有aH {a o h|h∈H} {h o a|h∈H} Ha。 所以H⊿G。 【注:规范的不变子群符号是一个顶角指向左边…...

Chrome和Firefox如何保护用户的浏览数据

在当今数字化时代,保护用户的浏览数据变得尤为重要。浏览器作为我们日常上网的主要工具,其安全性直接关系到个人信息的保密性。本文将详细介绍Chrome和Firefox这两款主流浏览器如何通过一系列功能来保护用户的浏览数据。(本文由https://chrom…...

CentOS 7镜像下载

新版本系统镜像下载(当前最新是CentOS 7.4版本) CentOS官网 官网地址 http://isoredirect.centos.org/centos/7.4.1708/isos/x86_64/ http://mirror.centos.org/centos/7/isos/ 国内的华为云,超级快:https://mirrors.huaweiclou…...

opencv-windows-cmake-Mingw-w64,编译opencv源码

Windows_MinGW_64_OpenCV在线编译动态库,并使用在C项目: (mingw-w64 cmakegithub actions方案) 修改版opencv在线编译: 加入opencv-contrib库, 一起编译生成动态库,在线编译好的opencv动态库,可以下载使用.验证opencv动态库是否可用的模板项目,测试opencv动态库是否可用的模板…...

Puppeteer点击系统:解锁百度流量点击率提升的解决案例

在数字营销领域,流量和搜索引擎优化(SEO)是提升网站可见性的关键。我开发了一个基于Puppeteer的点击系统,旨在自动化地提升百度流量点击率。本文将介绍这个系统如何通过模拟真实用户行为,优化关键词排名,并…...

Kyber原理解析

Kyber是一种IND-CCA2安全的密钥封装机制。Kyber的安全性基于在模格(MLWE问题)中解决LWE问题的难度。Kyber的构造采⽤两阶段⽅法:⾸先介绍⼀种⽤来加密固定32字节⻓度的消息原⽂的IND-CPA安全性的公钥加密⽅案,我们称之为 CPAPKE&a…...

2024 CCF CSP-J/S 2024 第二轮认证 真题试卷

2024年信息学奥赛CSP-J2入门级复赛真题试卷 题目总数:4 总分数:400 编程题 第 1 题 问答题 扑克牌(poker) 【题目描述】 小 P 从同学小 Q 那儿借来一副 n 张牌的扑克牌。 本题中我们不考虑大小王,此时每张牌具有两个属性:花色和…...

Android 无障碍服务常见问题梳理

android 无障碍服务本意是为了帮助盲人操作手机而设计,但是现在也有人利用这个做自动化操作。 本片文章讲述的主要用作自动化方面。 官方文档 关于配置方法和接口列表,参考 无障碍 比较常用的接口: 1. 执行点击操作 2. 触摸屏幕&#xf…...

Milvus 与 Faiss:选择合适的向量数据库

向量数据库 Milvus 和 Faiss 都是处理大规模向量数据的工具,尤其适用于需要相似性搜索的场景,比如推荐系统、图像检索和自然语言处理等。但它们各自的设计初衷和功能有所不同,适用于不同的使用场景。下面,我们从性能、功能特性、部…...

2024最全CTF入门指南、CTF夺旗赛及刷题网站(建议收藏!)

文章目录 一、赛事介绍二、竞赛模式三、CTF各大题型简介四、赛题情况分析CTF 工具集合Web | Web 安全🕸 MISC | 杂项❆ 基础工具❆ 解题工具❆ 开源脚本🔑 Crypto | 密码学 💫 Reverse | 逆向基础工具💥 PWN | 二进制 &#x1f44…...

【论文阅读】ESRGAN+

学习资料 论文题目:进一步改进增强型超分辨率生成对抗网络(ESRGAN : FURTHER IMPROVING ENHANCED SUPER-RESOLUTION GENERATIVE ADVERSARIAL NETWORK)论文地址:2001.08073代码:ncarraz/ESRGANplus: ICASSP …...

北京市首发教育领域人工智能应用指南,力推个性化教育新篇章

近年来,人工智能在全球教育领域的应用呈现蓬勃发展之势,各国都在探索如何将其更好的融入教育体系,在这一背景下,北京市于10月26日发布《北京市教育领域人工智能应用指南》(以下简称《指南》),推…...

【Java并发编程】信号量Semaphore详解

一、简介 Semaphore(信号量):是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。 Semaphore 一般用于流量的控制,特别是公共资源有限的应用场景。例如数据库的连接&am…...

window11使用wsl2安装Ubuntu22.04

目录 1、快速了解wsl2 安装子系统linux流程(B站视频) 2、wsl2常用命令 3、windows与子系统Linux文件访问方法 4、子系统linux使用windows网络代理、网络配置(镜像网络,非NAT) 5、wsl2 Ubuntu miniconda 安装 6、…...

虚拟滚动 - 从基本实现到 Angular CDK

简介 在大数据列表的处理上,虚拟滚动是一种优化性能的有效方式。本篇文章将详细介绍两种常见的虚拟滚动实现方式:使用 transform 属性和 Intersection Observer。重点讲解如何通过 transform 属性实现高效的虚拟滚动,并对比Angular CDK中的实…...

Spring WebFlux学习笔记(一)

核心思想 WebFlux主要是异步 例子 参考一个源码&#xff1a; https://blog.csdn.net/qq_43923045/article/details/106309432?spm1001.2014.3001.5506 GetMapping("/delay1")public Mono<RestResult> delayResult() {long l System.currentTimeMillis();…...

富格林:正确追损思维安全交易

富格林指出&#xff0c;对于如何正确追损的这个问题是需要持续付出时间和精力的&#xff0c;发现具备耐心的投资者往往在正确追损的路上更加游刃有余。他们总是可以保持较为平和的心态&#xff0c;不急不躁地分析原因并通过自身掌握的安全应对措施来进行交易。富格林在以下分享…...

前端vue2迁移至uni-app

1.确定文件存放位置 components: 继续沿用 pages: views内容移动到pages static: assets内容移动到static uni_modules: uni-app的插件存放位置 迁移前 src├─assets│ └─less├─components│ ├─common│ │ ├─CommentPart│ │ └─MessDetail│ ├─home│…...

恋爱脑学Rust之闭包三Traits:Fn,FnOnce,FnMut

在Rust中&#xff0c;FnOnce、FnMut和Fn是三个用于表示闭包&#xff08;closure&#xff09;类型的trait。闭包是一种特殊的函数&#xff0c;它可以捕获其环境变量&#xff0c;即在其定义时所处的作用域中的变量。以下是关于这三个trait的详细介绍&#xff1a; 1. FnOnce&#…...

区块链介绍

区块链&#xff08;英文名&#xff1a;blockchain或block chain&#xff09;是一种块链式存储、不可篡改、安全可信的去中心化分布式账本&#xff0c;它结合了分布式存储、点对点传输、共识机制、密码学等技术&#xff0c;通过不断增长的数据块链&#xff08;Blocks&#xff09…...

git回滚间隔的提交

如果你需要回滚几个非连续的提交&#xff0c;可以使用 git revert 来选择性地撤销这些提交。这样做不会改变提交历史&#xff0c;只是会在当前分支上创建新的提交来反转指定的更改。 ### 使用 git revert 回滚间隔的提交 1. **查看提交历史**&#xff1a; 首先&#xff0c…...

Map和Set(数据结构)

一、概念 Map 和 set 是一种专门用来进行搜索的容器或者数据结构&#xff0c;其搜索的效率与其具体的实例化子类有关。 Map 和 Set 是一种适合动态查找的集合容器。 模型 一般把搜索的数据称为关键字&#xff08; Key &#xff09;&#xff0c;和关键字对应的称为值&#xff0…...

vue3uniapp实现自定义拱形底部导航栏,解决首次闪烁问题

前言&#xff1a; 我最初在网上翻阅查找了很多方法&#xff0c;发现大家都是说在page.json中tabbar中添加&#xff1a;"custom": true,即可解决首次闪烁的问题&#xff0c;可是添加了我这边还是会闪烁&#xff0c;因此我这边改变了思路&#xff0c;使用了虚拟页面来解…...

新需求编码如何注意低级错误代码

1. 日常开发常见错误问题 变量拷贝未修改变量定义的值刚开始是随意写的一个值&#xff0c;想等到上线的时候再改成正确的&#xff0c;但是上线的时候忘记改了程序常量配置的错误逻辑关系判断错误 常见的如都不为null、都不为空集合判断不为空逻辑取反了多个关系的 && …...

系统架构图设计(行业领域架构)

物联网 感知层&#xff1a;主要功能是感知和收集信息。感知层通过各种传感器、RFID标签等设备来识别物体、采集信息&#xff0c;并对这些信息进行初步处理。这一层的作用是实现对物理世界的感知和初步处理&#xff0c;为上层提供数据基础网络层&#xff1a;网络层负责处理和传输…...

windows 文件监控 c++ 11及以上版本可用

在该版本上稍微改了一下https://blog.csdn.net/weixin_50964512/article/details/125002563 #include<iostream> #include<string> #include<Windows.h> #include<list> #include<locale> using namespace std;class WatchFolder {HANDLE m_hFi…...

在网站留外链怎么做/许昌seo公司

场景&#xff1a;多个相同的Windows服务(部署在不同的服务器上&#xff0c; 仅配置文件不同)需要附加WCF服务&#xff0c; 而网站在访问这些类似的WCF服务时&#xff0c; 不知道其明确地址所以无法直接引用。于是&#xff0c; 无配置便成了必然的选择&#xff01; 下面是无配置…...

主流网站编程语言/怎么搜索关键词

软件介绍MIHTool 是前端工程师在iOS设备上调试和优化页面的得力助手.功能特性&#xff1a;iPad版1.内嵌 Web inspector(类似于 Chrome DevTool 或 FireBug):有 Elements,Resources,Network,Timeline,Console 面板.2.远程打开Web inspector调试:在电脑(window,mac,linux,仅需装有…...

菜鸟做网站/百度一下网页版浏览器百度

安全的,稳定的,有效的(已证实).....调整分区,磁盘调整... 神级软件.... 刚刚调整完C盘大小,并安装了VS2010(用时33分),正在安装MSDN 需要注意的问题是: 如有 C,D,E...盘 如果想增加C盘空间,需要减少D盘的大小,并且腾出D盘的前边的部分(可拖动)! 否则..不能增加C盘大小 ,这个问…...

沈阳做网站找黑酷科技/互联网产品营销策划方案

前言 系统环境是CentOS&#xff0c;linux只支持64位版本 yum源安装 rpm包说明 mongodb-org-server 包含mongod进程&#xff0c;关联配置&#xff0c;初始化脚本mongodb-org-mongos 包含mongos代理进程(数据库分片)mongodb-org-shell 包含mongodb shell客户端程序mongodb-org-to…...

我的wordpress网站吗/百度信息流平台

上次已经搭建好了基本的环境了&#xff0c;这次我们稍微再配置下&#xff0c;稍微进阶一下。第一步&#xff0c;我们得把我们sql文件导入到我们的mariadb中&#xff0c;也就是导入到mysql数据库中。mysql -u root -p输入密码进入到数据库中&#xff0c;创建数据库&#xff0c;c…...

wordpress手机登录/百度本地惠生活推广

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;draw()方法经过对View的测量与布局过程后&#xff0c;下面就到了真正的View绘制的过程了。这个过程从调用根View的draw()方法开始&#xff1a;(省略部分代码)12345…...