029 - STM32学习笔记 - ADC(三) 独立模式单通道DMA采集

news2024/11/23 19:25:14

029 - STM32学习笔记 - 单通道DMA采集(三)

在这里插入图片描述

单通道ADC采集在上节中学习完了,这节在上节的内容基础上,学习单通道DMA采集。程序代码以上节的为基础,需要删除NVIC配置函数、中段服务子程序、R_ADC_Mode_Config()函数中使能ADC传输完成中断的配置ADC_ITConfig(R_ADC,ADC_IT_EOC,ENABLE);、以及头文件中关于中断的宏定义。

这节内容中包含DMA的相关知识,不是很清楚的可以看12节~13节的内容。

在使用ADC时,采集到的数据都是存放在DR寄存器中,在ADC_CR2的[8:9]位是用来控制单一ADC模式下DMA的的,其中:

在这里插入图片描述

位 9 DDS: DMA 禁止选择(对于单一ADC模式) (DMA disable selection (for single ADC mode))
0:最后一次传输后不发出新的 DMA 请求(在DMA控制器中进行配置)
1:只要发生数据转换且DMA = 1,便会发出DAM请求
位 8 DMA: 直接存储器访问模式(对于单一ADC模式) (Direct memory access mode (for single
ADC mode))
0:禁止 DMA 模式
1:使能 DMA 模式

这里中断与DMA的区别在于:

1、中断模式下,当发生一次采集后,会触发一次中断,此时需要用户处理数据(中断),当数据(中断)处理完成后,对中断标志位置位后,才会继续下一次采集,否则不会继续采集。

2、DMA模式下,ADC会根据用户设置的采集频率对模拟量进行采集,单次采集完成后,会产生一次DMA请求,数据则会通过DMA通道送至指定的内存地址(变量)中,并不影响下次数据采集,若用户对此次采集的数据未作处理,则会被下次采集的数据覆盖。

相比之下,DMA不需要中断CPU的采集工作,不需要中断服务函数,并且传输速度极快。因此当采集通道较多、采集数据量较大并且对采集频率较高的时候,就需要采用DMA进行数据传输,而非中断模式。

对于使用DMA进行ADC数据采集时,编程步骤如下:

  1. 初始化ADC的GPIO(多通道的时候需要配置多个GPIO);
  2. 配置ADC初始化结构体、DMA初始化结构体;
  3. 配置通道的转换顺序,使能DMA请求、使能DMA、
  4. 打开ADC、触发ADC开始转换;

OK,废话不多说,上代码分析:

本节代码是在上节内容上更改而来,除了需要删除跟中断相关的内容外,大部分代码基本不需要更改。

1、定义与DMA相关的宏定义:

#define R_ADC_DMA_CLK           RCC_AHB1Periph_DMA2				//DMA2时钟
#define R_ADC_DMA_CHANNEL       DMA_Channel_0					//DMA通道0
#define R_ADC_DMA_STREAM        DMA2_Stream0					//DMA流0
//ADC引脚
#define R_ADC_GPIO_PORT         GPIOC
#define R_ADC_GPIO_PIN          GPIO_Pin_3
#define R_ADC_GPIO_CLK          RCC_AHB1Periph_GPIOC

#define R_ADC                   ADC1
#define R_ADC_CLK               RCC_APB2Periph_ADC1
#define R_ADC_CHANNEL           ADC_Channel_13
#define R_ADC_DR_ADDR           ((u32)ADC1+0x4c)        //取ADC_DR的地址,为ADC1的基地址+偏移地址

ADC1的通道流选择,可以到DMA章节查看一下,这里附上表大家看一下,这里我选择的是通道0、流0,当然你也可以选择通道0、流4。

在这里插入图片描述

2、ADC、DMA配置,关于ADC与ADC COMMON结构体的内容各位看一下上一节内容

/** @brief  配置ADC引脚工作模式及DMA
  * @parm   无
  * @retval 无
  */
static void R_ADC_Mode_Config(void)
{
    DMA_InitTypeDef DMA_InitStructure;
    ADC_InitTypeDef ADC_InitStructure;
    ADC_CommonInitTypeDef ADC_CommonInitStructure;
    /***************************DMA Init结构体参数初始化**********************/
    RCC_AHB1PeriphClockCmd(R_ADC_DMA_CLK,ENABLE);           		//开启DMA时钟,使用外设,第一件事一定是开时钟!!!
    DMA_InitStructure.DMA_PeripheralBaseAddr = R_ADC_DR_ADDR;       //设置ADC外设基地址,为ADC数据寄存器地址
    DMA_InitStructure.DMA_Memory0BaseAddr = (u32)&ADC_Value;        //存储器地址,地址为内部SRAM变量
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;         //配置数据传输方向为外设到存储器
    DMA_InitStructure.DMA_BufferSize = 1;                           //配置缓冲区大小,大小取决于一次传输的量
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;    //外设寄存器只有一个,不用递增
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;            //存储器地址也只有一个,不递增
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //外设数据大小为半字(两个字节)
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;     //与外设相同
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                         //循环传输
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;                     //传输优先级为高
    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;                  //采用直连,不使用FIFO
    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;       //FIFO禁止,下面不用配置
    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    DMA_InitStructure.DMA_Channel = R_ADC_DMA_CHANNEL;              //选择DMA通道
    DMA_Init(R_ADC_DMA_STREAM,&DMA_InitStructure);				   //初始化DMA
    DMA_Cmd(R_ADC_DMA_STREAM,ENABLE);							 //使能DMA
    /*****************************************************************/
    RCC_APB2PeriphClockCmd(R_ADC_CLK,ENABLE);               //开启ADC时钟
    ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;        //设置模式为独立模式
    ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;     //设置为4分频
    /*---------------------------------------------------------------*/
    //ADC_ITConfig(R_ADC,ADC_IT_EOC,ENABLE);      //ADC转换结束产生中断,在中断服务程序中读取转换数值,使用DMA不需要此行
    /***********************使能DDS及ADC_DMA功能**************************/
    ADC_DMARequestAfterLastTransferCmd(R_ADC, ENABLE);		//使用单重ADC时使能作用是将DDS位置1,即只要发生数据转换且DMA=1,便会发出 DAM 请求
    ADC_DMACmd(R_ADC,ENABLE);			   //使能ADC_DMA功能
    /*******************************************************************/
    ADC_Cmd(R_ADC,ENABLE);                  //使能ADC
    ADC_SoftwareStartConv(R_ADC);           //开始ADC转换,由软件触发
}

main文件中没有改变,跟上节内容一样,无需改动,输出结果这里就不截图了,各位自行测试即可。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索Python内置类属性__repr__:展示对象的魅力与实用性

概要 在Python中,每个对象都有一个内置的__repr__属性,它提供了对象的字符串表示形式。这个特殊的属性在调试、日志记录和交互式会话等场景中非常有用。本文将详细介绍__repr__属性的使用教程,包括定义、常见应用场景和注意事项,…

机器人向前冲

欢迎来到程序小院 机器人向前冲 玩法:一直走动的机器人,点击鼠标左键进行跳跃,跳过不同的匝道,掉下去即为游戏接续, 碰到匝道铁钉游戏结束,一直往前冲吧^^。开始游戏https://www.ormcc.com/play/gameStart…

C++基础 -10- 类的构造函数

类的构造函数类型一 使用this指针给类内参数赋值 class rlxy {public:int a;rlxy(int a, int b, int c){this->aa;this->bb;this->cc;cout << "rlxy" << endl;}protected:int b;private:int c; };int main() {rlxy ss(10, 20, 30); }类的构造…

使用Accelerate库在多GPU上进行LLM推理

大型语言模型(llm)已经彻底改变了自然语言处理领域。随着这些模型在规模和复杂性上的增长&#xff0c;推理的计算需求也显著增加。为了应对这一挑战利用多个gpu变得至关重要。 所以本文将在多个gpu上并行执行推理&#xff0c;主要包括&#xff1a;Accelerate库介绍&#xff0c;…

在Rust中处理命令行参数和环境变量

1.摘要 Rust的命令行和环境变量处理在标准库中提供了一整套实现方法, 在本文中除了探索标准库的使用方法之外, 也在不断适应Rust独有的语法特点。在本文中, 我们通过标准库函数的返回值熟悉了迭代器的使用方法, 操作迭代器精确控制保存的内容, 包括字符串和键值对的使用方法。…

SpringBoot整合EasyExcel实现复杂Excel表格的导入导出功能

文章目录 &#x1f389;SpringBoot整合EasyExcel实现复杂Excel表格的导入&导出功能 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏&#xff1a;架构设计&#x1f4dc;其他专栏&#xff1a;Java学习路线 Jav…

mysql 性能排查

mysql 下常见遇到的问题有&#xff0c;mysql连接池耗尽&#xff0c;死锁、慢查、未提交的事务。等等我们可能需要看&#xff1b;我们想要查看的可能有 1.当前连接池连接了哪些客户端&#xff0c;进行了哪些操作 2.当前造成死锁的语句有哪些&#xff0c;是哪个客户端上的&#x…

2023网络安全产业图谱

1. 前言 2023年7月10日&#xff0c;嘶吼安全产业研究院联合国家网络安全产业园区&#xff08;通州园&#xff09;正式发布《嘶吼2023网络安全产业图谱》。 嘶吼安全产业研究院根据当前网络安全发展规划与趋势发布《嘶吼2023网络安全产业图谱》调研&#xff0c;旨在进一步了解…

2020年6月16日 Go生态洞察:泛型的下一步

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

选择跨网数据摆渡系统时,你最关注的功能是哪些?

为什么要选择跨网数据摆渡系统呢&#xff1f;因为做了网络隔离后&#xff0c;要有数据交互。那为什么要做网络隔离呢&#xff1f;主要还是安全方面的考虑&#xff0c;一般有以下几个原因&#xff1a; 1、数据安全保护&#xff1a;对于一些重要数据&#xff0c;比如代码数据、隐…

leetCode 39.组合总和 + 回溯算法 + 剪枝 + 图解 + 笔记

39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合 can…

IDEA 配置 gradle6.8.3 解决导入gradle项目下载太慢问题

由于平时用的是springboot 2.7 这里下载gradle-6.8.3 Gradle官网地址&#xff1a;https://services.gradle.org/distributions/ 1.下载gradle后&#xff0c;配置环境变量 GRADLE_HOME {gradle 文件路径} GRADLE_USER_HOME {jar下载路径&#xff0c;可以放maven jar保存路径…

RabbitMQ高级特性2 、TTL、死信队列和延迟队列

MQ高级特性 1.削峰 设置 消费者 测试 添加多条消息 拉取消息 每隔20秒拉取一次 一次拉取五条 然后在20秒内一条一条消费 TTL Time To Live&#xff08;存活时间/过期时间&#xff09;。 当消息到达存活时间后&#xff0c;还没有被消费&#xff0c;会被自动清除。 RabbitMQ…

浏览器触发下载Excel文件-Java实现

目录 1:引入maven 2:代码实现 3.导出通讯录信息到Excel文件 4.生成并下载Excel文件部分解释 1:引入maven 添加依赖:首先,在你的项目中添加EasyExcel库的依赖。你可以在项目的构建文件(如Maven的pom.xml)中添加以下依赖项:<dependency><groupId>com.alib…

医疗影像数据集—CT、X光、骨折、阿尔茨海默病MRI、肺部、肿瘤疾病等图像数据集

最近收集了一大波关于CT、X光等医疗方面的数据集包含骨折、阿尔茨海默病MRI、肺部疾病等类型的医疗影像数据&#xff0c;废话不多说&#xff0c;给大家逐一介绍&#xff01;&#xff01; 1、彩色预处理阿尔茨海默病MRI(磁共振成像)图像数据集 彩色预处理阿尔茨海默病MRI(磁共…

平凯星辰携手教育部教育管理信息中心,助力普惠教育数字化

近日&#xff0c;企业级开源分布式数据库厂商平凯星辰与教育部教育管理信息中心达成合作&#xff0c;TiDB 分布式数据库为全国中小学管理服务平台提供全栈服务。双方将携手深入探索领先的数据库技术在教育行业的新场景与新应用&#xff0c;既夯实教育数字化底座&#xff0c;助力…

“抓机遇,促发展”2024亚洲国际人工智能展览会(世亚智博会)

随着人工智能技术的飞速发展&#xff0c;我们正在见证一个全新的时代。2024年即将到来&#xff0c;这一年是人工智能创新将重塑传统界限的一年。从全球领先的科技大国到各类企业&#xff0c;人工智能技术正在以前所未有的速度融入我们的日常生活&#xff0c;推动行业走向未来&a…

34 - 记一次线上SQL死锁事故:如何避免死锁?

之前我参与过一个项目&#xff0c;在项目初期&#xff0c;我们是没有将读写表分离的&#xff0c;而是基于一个主库完成读写操作。在业务量逐渐增大的时候&#xff0c;我们偶尔会收到系统的异常报警信息&#xff0c;DBA 通知我们数据库出现了死锁异常。 按理说业务开始是比较简…

好用的json处理工具He3 JSON

官网地址&#xff1a;https://he3app.com/zh/ json格式化 https://portal.he3app.com/home/extension/json-to-pretty 其他 https://portal.he3app.com/home/category

笔记-PC端wireshark采集FPGA数据的操作

wireshark采集FPGA的数据 目录 一、准备工作二、操作步骤 一、准备工作 1、软件&#xff1a;wireshark 2、平台&#xff1a;PC&#xff08;本人是win11&#xff09;、带有以太网功能的zynq平台 3、网线: 用网线连接zynq板子和PC的以太口端口 二、操作步骤 1、打开任务管理器…