STM32数据搬运工DMA
DMA,全称为:Direct Memory Access,即直接存储器访问。DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大为提高。


● 5 个独立的可配置通道 ( 请求 )
● 每个通道都直接连接专用的硬件 DMA 请求
● 在同一个 DMA 模块上,多个请求间的优先权可以通过软件编程设置 ( 共有四级:很高、高、
中等和低 )
● 独立数据源和目标数据区的传输宽度 ( 字节、半字、全字 ) 源
和目标地址必须按数据传输宽度对齐
● 支持循环的缓冲器管理
● 每个通道都有 3 个事件标志 (DMA 半传输、 DMA 传输完成和 DMA 传输出错 )
● 存储器和存储器间的传输
● 外设到存储器和存储器到外设,外设到外设间的传输
● 闪存、 SRAM 、 APB 和 AHB 外设均可作为访问的源和目标
● 可编程的数据传输数目:最大为 65536

注:可修改SYSCFG_CFGR1来配置通道的映射关系
DMA通道优先级
仲裁器根据优先级管理着通道的请求和启动外设 / 存储器的访问
优先级管理分两个方面:
● 软件:可通过 DMA_CCRx 寄存器配置每个通道的优先级,优先级分4个等级:
- 最高优先级
- 高优先级
- 中等优先级
- 低优先级
● 硬件:如果 2 个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有较高
的优先权。举个例子,通道 2 优先于通道 4
传输模式
1个DMA控制器,5个可独立配置的通道。所有通道都支持memory to memory的传输、外设到外设的传输、以及外设和memory之间的传输
源、目的、长度
l DMA_CPARx 寄存器: 设置外设寄存器地址l DMA_CMARx 寄存器:设置存储器地址l DMA_CCRx 寄存器 : 配置数据的传输方向如果是存储器到存储器模式,需配置DMA_CCRx的MEM2MEM位
l DMA_CNDTRx 寄存器: 写入需要传输的数据量, (0 到 65535)l DMA_CCRx 寄存器中的 PSIZE 和 MSIZE 位:设置源和目的的数据宽度,两边的位宽尽量保持一致

增量设置
l 通过设置 DMA_CCRx 寄存器中的 PINC 和 MINC 标志位,外设和存储器的指针在每次传输后可以有选择地完成自动增量l 当设置为增量模式时,下一个要传输的地址将是前一个地址加上增量值,增量值取决与所选的数据宽度为 1 、 2 或 4 。
循环模式
l 循环模式用于处理循环缓冲区和连续的数据传输 ( 如 ADC 的扫描模式 ) 。在 DMA_CCRx 寄存器中的 CIRC 位用于开启这一功能。l 当启动了循环模式,一组的数据传输完成时,计数寄存器将会自动地被恢复成配置该通道时设置的初值, DMA 操作将会继续进行

中断
每个 DMA 通道都可以在 DMA 传输过半、传输完成和传输错误时产生中断。为应用的灵活性考虑,通过设置寄存器的不同位来打开这些中断

注:这些标志位都在中断状态寄存器DMA_ISR中设置
实验要求:
利用ADC采集按键以及光照传感器的数据,在按键中断处理程序中启动DMA传输,
最后在DMA完成中断中打印采集到的数据



F0没有FIFO,高端一些的单片机有,可以解决源和目的位数不一致问题
extern uint16_t adc_value[2];void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){printf("key adc value = %d\n",adc_value[0]);printf("light adc value = %d\n",adc_value[1]);memset(adc_value,0,sizeof(adc_value));HAL_ADC_Stop_DMA(hadc);}
uint16_t adc_value[2] = {0};void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin == GPIO_PIN_8){HAL_ADC_Start_DMA(&hadc, (uint32_t *)adc_value, 2);}
}
int fputc(int ch, FILE *f)
{while(!(USART1->ISR & (1<<7)));USART1->TDR = ch;return ch;
}
---------------------------------------------------------------------------------------------------------------------------------
解决一下我的timer2定时器问题
用cubemx生成的RCC时钟配置自动选择了两个源
HSI和HSE,正常应该只是用HSE的不知道是不是cubemx的bug
相关文章:
STM32数据搬运工DMA
DMA的概念DMA,全称为:Direct Memory Access,即直接存储器访问。DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路ÿ…...
4、操作系统——进程间通信(2)(system V-IPC介绍)
目录 一、system V-IPC常识 1、key和ID 2、文件描述符 3、函数(ftok) ftok产生IPC对象的健值key(类似文件路径) 4、例子 5、使用命令查看或删除当前系统中的IPC对象 一、system V-IPC常识 1、key和ID (1&#x…...
基于CentOS Stream 9平台搭建Nacos2.0.4集群以及OpenResty反向代理
目录展示Nacos2.0.4集群搭建1. 下载2. 解压3.修改配置3.1分别修改下启动类中JDK路径以及启动大小3.2 分别配置数据源3.3 创建nacos数据库3.4 修改cluster.conf配置3.4.1 复制并修改3.4.2 编辑文件,修改三台主机地址3.4.3 分别放入另外两个nacos的conf目录下:4. 启动…...
老杜MySQL入门基础 第二天
导入演示数据 1、连接MySQL 2、创建"bjpowernode"数据库 create database bjpowernode;3、选择数据库 use bjpowernode4、导入数据 source D:\bjpowernode.sql(文件的路径)1 去除重复记录(把查询结果去除重复记录)(原表数据不会改变) 使用关键字dist…...
Python深度学习实战:人脸关键点(15点)检测pytorch实现
引言 人脸关键点检测即对人类面部若干个点位置进行检测,可以通过这些点的变化来实现许多功能,该技术可以应用到很多领域,例如捕捉人脸的关键点,然后驱动动画人物做相同的面部表情;识别人脸的面部表情,让机…...
linux简单入门
目录Linux简介Linux目录结构Linux文件命令文件处理命令文件查看命令常用文件查看命令Linux的用户和组介绍Linux权限管理Linux简介 Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯本纳第克特托瓦兹࿰…...
给准备面试网络工程师岗位的应届生一些建议
你听完这个故事,应该会有所收获。最近有一个23届毕业的大学生和我聊天,他现在网络工程专业大四,因为今年6、7月份的时候毕业,所以现在面临找工作的问题。不管是现在找一份实习工作,还是毕业后找一份正式工作࿰…...
主线程与子线程之间相互通信(HandlerThread)
平时,我们一般都是在子线程中向主线程发送消息(要在主线程更新UI),从而完成请求的处理。那么如果需要主线程来向子线程发送消息,希望子线程来完成什么任务。该怎么做?这就是这篇文章将要讨论的内容。 一、…...
13基于双层优化的电动汽车日前-实时两阶段市场竞标
MATLAB代码:基于双层优化的电动汽车日前-实时两阶段市场竞标 关键词:日前-实时市场竞标 电动汽车 双层优化 编程语言:MATLAB平台 参考文献:考虑电动汽车可调度潜力的充电站两阶段市场投标策略_詹祥澎 内容简介:…...
REDIS19_zipList压缩列表详解、快递列表 - QuickList、跳表 - SkipList
文章目录①. 压缩列表 - zipList②. 快递列表 - QuickList③. 跳表 - SkipList①. 压缩列表 - zipList ①. ZipList是一种特殊的"双端链表",由一系列特殊编码的连续内存块组成。可以在任意一端进行压入/弹出操作,并且该操作的时间复杂度为O(1) (oxff:11111111) type…...
JavaScript 基础 - 第3天
文章目录JavaScript 基础 - 第3天笔记数组数组的基本使用定义数组和数组单元数据单元值类型数组长度属性操作数组JavaScript 基础 - 第3天笔记 数组 数组的基本使用 定义数组和数组单元 <script>// 1. 语法,使用 [] 来定义一个空数组// 定义一个空数组let…...
23.3.26总结
康托展开 是一个全排列与自然数的映射关系,康托展开的实质是计算当前序列在所有从小到大的全排列中的顺序,跟其逆序数有关。 例如:对于 1,2,3,4,5 来说,它的康托展开值为 0*4!0*3!0*2!0*1&…...
【Java学习笔记】37.Java 网络编程
Java 网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。 java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题&…...
Azure OpenAI 官方指南03|DALL-E 的图像生成功能与安全过滤机制
2021年1月,OpenAI 推出 DALL-E。这是 GPT 模型在图像生成方面的人工智能应用。其名称来源于著名画家、艺术家萨尔瓦多 • 达利(Dal)和机器人总动员(Wall-E)。DALL-E 图像生成器,能够直接根据文本描述生成多…...
【数据结构】堆
文章目录前言堆的概念及结构堆初始化堆的判空堆的销毁插入数据删除数据堆的数据个数获取堆顶数据用数组创建堆对数组堆排序有关topk问题整体代码展示写在最后前言 🚩前面了解了树(-> 传送门 <-)的概念后,本章带大家来实现一…...
电脑硬盘文件数据误删除/格式化为什么可以恢复? 怎么恢复?谈谈文件删除与恢复背后的原理
Hello 大家好, 我是元存储~ 主页:元存储的博客_CSDN博客 1. 硬盘数据丢失场景 我们在每天办公还是记录数据的时候,文件存储大多数都是通过硬盘进行存储的,因此,使用多了,各种问题就会出现,比如…...
Gateway服务网关
Spring Cloud Gateway为微服务架构提供一种简单有效的统一的 API 路由管理方式。Gateway网关是所有微服务的统一入口。网关的核心功能特性:请求路由和负载均衡:一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则&am…...
K8S + GitLab + Jenkins自动化发布项目实践(一)
K8S GitLab Jenkins自动化发布项目实践(一)发布流程设计安装Docker服务部署Harbor作为镜像仓库部署GitLab作为代码仓库常用Git命令发布流程设计 #mermaid-svg-pe9VmFytb9GmqMvG {font-family:"trebuchet ms",verdana,arial,sans-serif;font-…...
【数据结构篇C++实现】- 堆
文章目录🚀一、堆的原理精讲⛳(一)堆的概念⛳(二)看图识最大堆⛳(三)详解堆是用数组表示的树🚀二、堆的向下调整算法🚀三、堆的向上调整算法🚀四、将任意一棵…...
C++笔试题
作用域运算符(::)的作用:1.存在具有相同名称的局部变量时,访问全局变量。2.在类之外定义类相关函数。3.访问类的静态变量。4.在多重继承的情况下,如果两个基类中存在相同的变量名,可以使用作用域运算符来进行区分。5.限定成员函数…...
二进制魔法:解密Windows平台消息防撤回的底层实现
二进制魔法:解密Windows平台消息防撤回的底层实现 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://gitcode.com/Gi…...
异步流式响应总卡顿、丢帧、OOM?FastAPI 2.0三大核心配置必须在上线前重写,否则AI服务将不可用
第一章:FastAPI 2.0异步AI流式响应的典型故障图谱在 FastAPI 2.0 中启用异步流式响应(如 StreamingResponse 配合 async generator)处理大语言模型推理输出时,常见故障并非源于逻辑错误,而是由异步生命周期、客户端兼容…...
Qwen2.5-72B-GPTQ-Int4开源镜像:Chainlit前端定制化开发入门指南
Qwen2.5-72B-GPTQ-Int4开源镜像:Chainlit前端定制化开发入门指南 想快速搭建一个功能强大、界面美观的AI对话应用吗?今天,我们就来聊聊如何基于Qwen2.5-72B-GPTQ-Int4这个顶级开源大模型,以及Chainlit这个轻量级前端框架…...
Java 代码质量保障:静态分析与代码审查实践
Java 代码质量保障:静态分析与代码审查实践代码质量不是测试阶段才考虑的事情,而是应该从第一行代码开始。作为一名经历过多次代码重构的 Java 开发者,我深刻体会到:预防胜于治疗。今天分享一套完整的代码质量保障体系,…...
Git子模块克隆总失败?试试这个国内镜像源+分步克隆的保姆级方案
Git子模块克隆失败?国内镜像源分步克隆的终极解决方案 每次看到终端里那个刺眼的"fatal: clone of https://github.com/xxx/yyy.git into submodule path failed"错误提示,我都忍不住想砸键盘。作为一个常年需要从GitHub拉取各种开源项目的开发…...
比迪丽WebUI保姆级教程:从服务器IP获取到首张图生成全过程
比迪丽WebUI保姆级教程:从服务器IP获取到首张图生成全过程 1. 前言:为什么选择比迪丽WebUI? 如果你对《龙珠》里的比迪丽(Videl)这个角色情有独钟,想用AI画出她的各种形象,那么今天这个教程就…...
3个变革性步骤:用163MusicLyrics彻底解决歌词获取难题
3个变革性步骤:用163MusicLyrics彻底解决歌词获取难题 【免费下载链接】163MusicLyrics Windows 云音乐歌词获取【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 在数字化音乐时代,歌词已不再是简单的文字附…...
Illustrator脚本大全:30个免费工具彻底改变你的设计工作流
Illustrator脚本大全:30个免费工具彻底改变你的设计工作流 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 如果你是一名Adobe Illustrator用户,每天重复着相…...
GME-Qwen2-VL-2B-Instruct效果扩展:多风格艺术画作的理解与情感分析展示
GME-Qwen2-VL-2B-Instruct效果扩展:多风格艺术画作的理解与情感分析展示 最近在玩一个挺有意思的视觉语言模型,叫GME-Qwen2-VL-2B-Instruct。它个头不大,但能力挺让人意外。我突发奇想,把它当成了一个“数字艺术评论员”…...
告别VirtualBox默认20G!保姆级教程:从创建到动态扩容,打造你的专属开发环境
从零规划VirtualBox磁盘空间:开发环境搭建的黄金法则 刚接触VirtualBox的新手开发者们,是否曾在项目进行到一半时突然发现磁盘空间不足?那种被迫中断工作流程去处理存储问题的体验,足以毁掉一天的开发效率。本文将带你从源头规避这…...
