【温酒笔记】DMA
参考文档:野火STM32F103
1. Direct Memory Access-直接内存访问
DMA控制器独立于内核
是一个单独的外设
- DMA1有7个通道
- DMA2有5个通道
- DMA有四个等级,非常高,高,中,低四个优先级
- 如果优先等级相同,通道编号越小优先级越高
- 数据流向: 存储器到存储器,存储器到外设,外设到存储器
- 单次传输或循环传输
- 传输过半中断,传输完成中断,传输错误中断
2. 串口示例
- 初始化
// 定义一个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 */
}
- DMA发送
/* USART1 向 DMA发出TX请求 */HAL_UART_Transmit_DMA(&UartHandle, (uint8_t *)SendBuff ,SENDBUFF_SIZE);
- 使用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是计算机的大脑,专门用于执行各种通用任务,如操作系统管理、数据处理、多任务处理等。它的架构设计旨在适应多种任务,…...
新兴斗篷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. 触摸屏幕…...
Milvus 与 Faiss:选择合适的向量数据库
向量数据库 Milvus 和 Faiss 都是处理大规模向量数据的工具,尤其适用于需要相似性搜索的场景,比如推荐系统、图像检索和自然语言处理等。但它们各自的设计初衷和功能有所不同,适用于不同的使用场景。下面,我们从性能、功能特性、部…...
2024最全CTF入门指南、CTF夺旗赛及刷题网站(建议收藏!)
文章目录 一、赛事介绍二、竞赛模式三、CTF各大题型简介四、赛题情况分析CTF 工具集合Web | Web 安全🕸 MISC | 杂项❆ 基础工具❆ 解题工具❆ 开源脚本🔑 Crypto | 密码学 💫 Reverse | 逆向基础工具💥 PWN | 二进制 ὄ…...
【论文阅读】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主要是异步 例子 参考一个源码: https://blog.csdn.net/qq_43923045/article/details/106309432?spm1001.2014.3001.5506 GetMapping("/delay1")public Mono<RestResult> delayResult() {long l System.currentTimeMillis();…...
解锁开源卡牌游戏的自定义潜能:探索无名杀的无限创造空间
解锁开源卡牌游戏的自定义潜能:探索无名杀的无限创造空间 【免费下载链接】noname 项目地址: https://gitcode.com/GitHub_Trending/no/noname 在卡牌游戏的世界里,你是否曾梦想过创造属于自己的武将角色?设计独一无二的卡牌技能&…...
Python 3.14 JIT vs PyPy 8.3 vs GraalPython:金融风控场景下GC暂停时间对比实测(数据全部脱敏)
第一章:Python 3.14 JIT vs PyPy 8.3 vs GraalPython:金融风控场景下GC暂停时间对比实测(数据全部脱敏)为评估新一代Python运行时在低延迟金融风控场景中的实际表现,我们在统一硬件环境(Intel Xeon Platinu…...
Monocle2拟时基因富集分析实战:从热图模块到通路解析
1. Monocle2拟时分析基础回顾 如果你正在做单细胞转录组分析,肯定对拟时分析(Pseudotime Analysis)不陌生。简单来说,这就像给细胞拍"成长视频",把静态的细胞状态连成动态的发展轨迹。Monocle2作为这个领域的…...
Simple Form终极指南:如何快速构建高效Rails表单验证系统
Simple Form终极指南:如何快速构建高效Rails表单验证系统 【免费下载链接】simple_form Forms made easy for Rails! Its tied to a simple DSL, with no opinion on markup. 项目地址: https://gitcode.com/gh_mirrors/si/simple_form Simple Form是一款强大…...
从零开始:LabelImg图像标注工具的完整实战指南
从零开始:LabelImg图像标注工具的完整实战指南 【免费下载链接】labelImg LabelImg is now part of the Label Studio community. The popular image annotation tool created by Tzutalin is no longer actively being developed, but you can check out Label Stu…...
国风美学模型与卷积神经网络(CNN)结合:风格迁移与质量增强
国风美学模型与卷积神经网络(CNN)结合:风格迁移与质量增强 最近在尝试用AI生成国风图像时,我遇到了两个挺实际的问题。一个是生成的图片虽然意境不错,但风格上总觉得少了点传统水墨丹青的韵味;另一个是&am…...
AI 模型推理性能瓶颈与优化方向
AI模型推理性能瓶颈与优化方向 随着AI技术在各行业的广泛应用,模型推理性能成为影响落地效果的关键因素。无论是实时交互场景还是大规模数据处理,推理效率直接决定了用户体验和成本控制。受限于计算资源、算法复杂度及硬件适配性等因素,AI模…...
Vant4移动端电商实战:用Card和Cell组件打造订单详情页(附完整代码)
Vant4移动端电商实战:用Card和Cell组件打造订单详情页(附完整代码) 在移动电商应用开发中,订单详情页是用户查看购买信息的重要界面。Vant4作为轻量、可靠的移动端组件库,其Card和Cell组件能够快速构建清晰、美观的订单…...
Phi-3-mini-4k-instruct与Vue3前端框架集成实战
Phi-3-mini-4k-instruct与Vue3前端框架集成实战 1. 引言 前端开发正在经历一场智能化变革,传统的静态页面已经无法满足用户对个性化、智能化交互的需求。想象一下,如果你的Vue3应用能够理解用户意图、自动生成内容、提供智能建议,那会是怎样…...
别再让Bug溜走!手把手教你用SVA在UVM里给芯片验证加个“监控探头”
芯片验证工程师的"电子眼":用SVA在UVM中构建智能监控体系 想象一下,你正在负责一个复杂SoC芯片的验证工作。随着设计规模不断扩大,传统的测试方法就像在黑暗的房间里寻找掉落的针——效率低下且容易遗漏关键问题。这时,…...
