stm32cubemx adc_STM32CubeMX__Exp5_ADC1_2CH_DMA_TIM3_Trig__简明指导文件__jyb

用定时器TIM3触发DMA方式的双通道ADC定时采样:

拷贝STM32CubeMX工程文件LED_Flash_PC12.ioc,修改为:Exp5_ADC1_2CH_DMA_TIM3_Trig.ioc

(1)配置ADC1的通道和参数

0b11ce658dfae01654e3878313d20281.png

配置ADC通道参数

(2)配置ADC1的DMA

①通过点"Add"按钮,添加ADC1---DMA1 Channel 1。选择后ADC1后自动添加其DMA通道。

② DMA Request Settings:配置结果如下图所示。

Mode:Circular;设置DMA的传输模式为连续不断的循环模式。若只想访问一次后就不要访问了(或按指令操作来反问,也就是想要它访问的时候就访问,不要它访问的时候就停止),可以设置成通用模式:DMA_Mode_Normal。

Peripheral:Increment Address:不勾选。如果DMA通道有外设,可以通过DMA通道将数据输出。

Memory:勾选。DMA通过地址递增方式将数据存储到内部数据存储器中。

  Data Width:Word。Word是32bits,Half Word是16bits。选择要与ADC转换结果的数据宽度相同。

e5c9a7939ff0a698df0e8a4034f3b880.png

配置ADC的DMA

(3)配置ADC1的NVIC:不做任何选择,按默认即可,如下图所示。DMA1中断已经默认强制选择了。我们在这里是采用TIM3的定时溢出事件触发ADC转换的,在DMA中断服务程序中读取数据,所以不需要使能ADC的中断。

99cd4e3581f519dcc9a05dcf379962b9.png

配置ADC的NVIC

(4)"User Constants"和"GPIO Settings"按默认即可。

(5)配置TIM3。配置结果如下图所示。

76bfbc928316b3753f0a5f9ed2010b96.png

配置TIM3

用其更新事件作为TRGO触发ADC。用鼠标点"Pinout & Configuration"点"Timers"点"TIM3""Mode"选项卡中,"Clock Source"选"Internal Clock""TIM3 Mode and Configuration"的"Configuration"菜单栏中,点"Parameter Settings""Trigger Output(TRGO)Parameters"下拉选项中,"Trigger Event Selection"选择"Update Event"。这样就为ADC的启动提供触发信号。72MHz的时钟信号经过(7199+1)和(39999+1)分频后,频率为0.25Hz,其周期为4秒,也就是说每4秒触发一次ADC转换。

(6) 为了观察程序运行,添加PC12接LED。

(7) ADC的时钟为12MHz

41dbaf3bc5bf9546633d10b0f65a70a6.png

配置ADC的时钟

(8)配置完成,保存STM32CubeMX工程文件,点击"GENERATE CODE",生成代码工程框架并打开。

添加代码

(1) 在main.c里面添加ADC转换的相关变量

/* USER CODE BEGIN PV */

uint32_t ADC_Value[10]; //通道IN6、IN7采样5次的值

uint8_t i,j,ADC_DMA_ConvCpltFlag=0; //ADC1_DMA方式转换结束标志

uint32_t IN6_Value[5],IN7_Value[5]; //从DMA转换值中分离IN6和IN7的值

uint32_t IN6_AverageValue,IN7_AverageValue; //IN6和IN7的平均值

/* USER CODE END PV */

(2)开启定时器TIM3,通过TIM3启动ADC。开启DMA方式的ADC1

/* USER CODE BEGIN 2 */

HAL_TIM_Base_Start(&htim3); //启动TIM3基本定时功能,定时到触发ADC启动

HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 10); //启动DMA方式的ADC转换,采样到10个之后触发DMA方式的ADC中断

/* USER CODE END 2 */

(3)在中断回调函数中做简单的数据处理

/* USER CODE BEGIN 4 */

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle) //DMA方式的ADC中断回调函数

{

// HAL_TIM_Base_Stop(&htim3);

// HAL_ADC_Stop_DMA(&hadc1);

j=0; //将采样到的10个ADC转换值分离给IN6和IN7

for(i = 0; i < 10;i++)

{

IN6_Value[j]=ADC_Value[i];

i++;

IN7_Value[j]=ADC_Value[i];

j++;

}

ADC_DMA_ConvCpltFlag=1; //置DMA方式的ADC转换结束标志

}

/* USER CODE END 4 */

(4)在主程序中做复杂些的数据处理

while (1)

{

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

HAL_GPIO_TogglePin(GPIOB,LED1_Pin); //用LED1指示主程序运行

HAL_Delay(200); //每200msLED1闪烁一次

if(ADC_DMA_ConvCpltFlag==1) //判断DMA方式的ADC转换结束了没有

{

IN6_AverageValue=0; //一次DMA方式的ADC转换结束,计算两个通道的平均值

IN7_AverageValue=0;

for(i =0;i <5;i++)

{

IN6_AverageValue+=IN6_Value[i];

IN7_AverageValue+=IN7_Value[i];

}

IN6_AverageValue=IN6_AverageValue/5;

IN7_AverageValue=IN7_AverageValue/5;

// HAL_TIM_Base_Start(&htim3);

// HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 10);

ADC_DMA_ConvCpltFlag=0; //清除转换结束标志,以便判断下次中断

}

}

/* USER CODE END 3 */

在启动了TIM3定时器后,TIM3计数溢出事件将触发ADC启动转换,ADC转换按照规定的DMA方式进行,先转换IN6通道,再转换IN7通道,这就是扫描转换各个通道一次,等到下一次TIM3溢出事件再次启动ADC转换,这样反复5次,转换得到10个ADC转换值,将触发DMA中断,在DMA中断回调函数中做简单的数据处理,置DMA中断标志。在主程序中,通过LED1指示主程序的运行情况,检测到DMA中断后对采样到的数据做处理,并复位DMA中断标志。

这里你也许会问,DMA中断为什么是void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)这个函数呀?这个函数不是当开启AD的中断的时候才调用的吗? 对,是这样的。我们仔细分析一下开启AD的DMA中断函数,在里面就会发现这个函数也在啊。在main.c中找到HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 10);,在HAL_ADC_Start_DMA上点鼠标右键,跟踪其定义可以找到函数:HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length),该函数中有一句:

/* Set the DMA transfer complete callback */

hadc->DMA_Handle->XferCpltCallback = ADC_DMAConvCplt;

DMA传输完成,自动调用名字为ADC_DMAConvCplt函数,在ADC_DMAConvCplt上点鼠标右键,跟踪其定义,进入到void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma)函数里面可以找到

/* Conversion complete callback */

#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)

hadc->ConvCpltCallback(hadc);

#else

HAL_ADC_ConvCpltCallback(hadc);

#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */

发现DMA方式的ADC转换,按照开辟的数据区大小,转换结果将数据区填满后,转换完成,还是调用HAL_ADC_ConvCpltCallback(hadc); 这个回调函数,在回调函数中对数据做初步处理。今后用到AD,不论是中断方式还是DMA方式,都可以直接调用这个回调函数了,不用再纠结了。需要注意的是,中断方式的ADC在回调函数中需要通过uhADCxConvertedValue = HAL_ADC_GetValue(AdcHandle); 获得ADC的转换值,而DMA方式的ADC,则通过DMA直接将转换值存放在用数组名开辟的片内RAM中,当数组存满数据后会触发DMA中断,在回调函数中直接从数组中取转换结果即可。

以上程序是连续启动ADC转换的,如果要想控制这个转换过程,可以通过以下语句实现:

HAL_TIM_Base_Stop(&htim3); //关闭定时器,停止溢出事件触发ADC

HAL_ADC_Stop_DMA(&hadc1); //停止DMA方式的ADC转换

HAL_TIM_Base_Start(&htim3); //启动定时器,定时溢出事件触发ADC

HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 10); //启动DMA方式的ADC转换,得到10个转换值后中断

第三步:编译、下载、运行

为观察到变化效果,可以先将PA6(IN6)和PA7(IN7)悬空,此时测量到是干扰。程序运行后,可以看到LED持续闪烁,表明主程序一直在运行,不用设置断点,全速运行程序,在观察窗口中添加变量ADC_Value、IN6_Value、IN7_Value、IN6_AverageValue、IN7_AverageValue、i、j,可以看到,每隔4秒钟ADC_Value的值以组(IN6和IN7)为单位变化一次,因为TIM3定时4秒,所以每隔4秒触发一次ADC转换,转换结果通过DMA送给ADC_Value数组。需要20秒后,ADC_Value填满,触发DMA中断,IN6_Value和IN7_Value在中断回调函数中得到各自的转换结果,如下图所示。也可以将PA6和PA7接GND、3.3V,做进一步观察。

dd7901ec89c46f74b9a8a58448c1d9fa.png

观察运行结果

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

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

相关文章

JS 实现 jQuery的$(function(){});

1、浏览器渲染引擎的HTML解析流程 何谓“渲染”&#xff0c;其实就是浏览器把请求到的HTML内容显示出来的过程。渲染引擎首先通过网络获得所请求文档的内容&#xff0c;通常以8K分块的方式完成。下面是渲染引擎在取得内容之后的基本流程&#xff1a; 1&#xff0c;解析html以构…

html 分页_MySQL——优化嵌套查询和分页查询

Java识堂&#xff0c;一个高原创&#xff0c;高收藏&#xff0c;有干货的微信公众号&#xff0c;欢迎关注优化嵌套查询嵌套查询(子查询)可以使用SELECT语句来创建一个单列的查询结果&#xff0c;然后把这个结果作为过滤条件用在另一个查询中。嵌套查询写起来简单&#xff0c;也…

从原理上搞定编码-- Base64编码

开发者对Base64编码肯定很熟悉&#xff0c;是否对它有很清晰的认识就不一定了。实际 上Base64已经简单到不能再简单了&#xff0c;如果对它的理解还是模棱两可实在不应该。大概介绍一下Base64的相关内容&#xff0c;花几分钟时间就可以彻底理解它。文 章下边贴了一个Base64的编…

docker mysql总是退出_Docker提升测试效率之路

现如今&#xff0c;Docker已经成为了很多公司部署应用、服务的首选方案。依靠容器技术&#xff0c;我们能在不同的体系结构之上轻松部署几乎任何种类的应用。作为测试一方&#xff0c;我们应与时俱进&#xff0c;将Docker容器技术应用到测试工作中。为了让小伙伴们可以快速上手…

32位mysql安装包_软件测试基础——Linux系统搭建MySQL数据库

一、mysql下载1. 下载&#xff1a;官方网址:https://dev.mysql.com/downloads/mysql/2. 选择相应的版本&#xff0c;由于cenos是基于红帽的&#xff0c;所以Select Operating System选择Red Hat...。我所用的镜像为cenos7所以Red Hat....linux7&#xff0c;一定要选相应的版本&…

python gevent模块 下载_Python中的多任务,并行,并发,多线程,多进程,协程区别...

多任务CPU承担了所有的计算任务。一个CPU在一个时间切片里只能运行一个程序。当我们想同时运行多于一个程序的时候&#xff0c;就是多任务&#xff0c;例如同时运行微信&#xff0c;QQ&#xff0c;浏览器等等。多任务的目的是提升程序的执行效率&#xff0c;更充分利用CPU的资源…

vue-router 路由嵌套显示不出来_网络协议|OSI模型第三层网络层中的路由

的IP协议OSI第二层中用以太网协议定义了信息传输单元&#xff0c;简称为帧&#xff0c;它长这个样子。同样的在OSI第三层中&#xff0c;会用 IP 协议去定义信息传输单元&#xff0c;简称为数据包&#xff0c;它长这个样子。实际上&#xff0c;最终在网络上传输的是第二层的帧&a…

asp.net怎么实现按条件查询_【33期】分别谈谈联合索引生效和失效的条件

点击上方“Java面试题精选”&#xff0c;关注公众号面试刷图&#xff0c;查缺补漏>>号外&#xff1a;往期面试题&#xff0c;10篇为一个单位归置到本公众号菜单栏->面试题&#xff0c;有需要的欢迎翻阅。这道题考查索引生效条件、失效条件。像这类问题才其实很有意义&…

java 二分搜索获得大于目标数的第一位_程序员数据结构算法编程,二分查找搜索算法的原理与应用介绍!...

本文来讲一种搜索算法&#xff0c;即二分搜索算法&#xff0c;通常在面试时也会被问到。我们先来看一个例子&#xff0c;在图书馆通常是根据查到的编号去找书&#xff0c;可以在书架上按顺序一本本地查找&#xff0c;也可以找到一本书不符合预期时&#xff0c;再跳过一大部分书…

2020idea插件怎么同步_VScode 插件整理

1、auto rename tag &#xff1a;HTML 标签自动闭合&#xff1b;避免了在整个页面中费劲查找。你想将一个H2标签更改为H3标签&#xff0c;或者你想将一个div标签更改为span标签&#xff0c;不管要做什么&#xff0c;你都要浪费时间来查找结束标签&#xff0c;这时候就该用这个插…

python 将两幅图拼接_清华王教授典藏的python电子书,整整10个G拿去不谢

终于拿到&#xff01;清华王教授典藏的电子书&#xff0c;整整10个G&#xff01;兄弟&#xff0c;毫无套路&#xff01;无偿获取方式:1.点赞评论2.关注小编&#xff0c;私信“Python”(点开头像就能看到私信按钮啦).Python指南——五行代码实现批量抠图你是否曾经想将某张照片中…

地磅称重软件源码_【漯河衡器】导致地磅称重不准原因及处理措施

地磅是一种新型的大型电子衡器&#xff0c;能够迅速、直观、高准确度地展现工商业、仓储、货站贸易计量的重要工具。做为贸易结算的工具&#xff0c;地磅的可靠性、准确性、科学性有着极为重要的影响。而在货物来往中&#xff0c;地磅是等价交换的桥梁&#xff0c;一旦地磅显现…

寻宝机器人电路板焊接_专业维修淮安市KUKA库卡KRC2机器人回收{机器人调试}

FANUC机器人伺服-023故障排除&#xff1a;FANUCR-2000六轴焊接机器人点焊进程中&#xff0c;J4机械臂显现自动滑动故障&#xff0c;机器人发出伺服故障报警&#xff0c;报警故障码为伺服-023&#xff0c;依据FANUC机器人维修手册&#xff0c;故障代码解释以下&#xff1a;伺服误…

android uber启动动画,仿 Uber 视频背景登录界面以及登录动画

现在有越来越多的 app 的登录/注册界面的背景是播放视频或者 gif&#xff0c;我主要看了 Uber 和 keep 的登录界面再配合拉勾的登录界面仿作了一个登录界面。1.首先&#xff0c;查资料我在 github 上找到了这两个库&#xff1a;-STLBGVideo 这个库是 oc 写的&#xff0c;但你的…

遍历列表python_Python 遍历List的三种方法

转载至https://www.cnblogs.com/pizitai/p/6398276.html #!/usr/bin/env python # -*- coding: utf-8 -*- if __name__ __main__: list [html, js, css, python] # 方法1 print 遍历列表方法1&#xff1a; for i in list: print ("序号&#xff1a;%s 值&#xff1a;%s&…

名图1.8智能隐藏功能_自动打包不脏手才是真智能,双11销冠,拓牛自动打包垃圾桶体验...

不是吧&#xff01;不是吧&#xff01;都是2020年了&#xff0c;不会还有人不知道电动垃圾桶的存在吧&#xff1f;如果你还不知道&#xff0c;那就跟5G智玩好物一起来看看最新上线的拓牛T Air Lite吧。首先&#xff0c;让我们看一下拓牛T Air Lite的外观。在大众的印象里&#…

android struts2 图片上传,xhEditor struts2实现图片上传

如果想要出现上传按钮,在xhEditor设置以下参数&#xff1a;html5Upload : false //此属性必须为falseupImgUrl : "ImgUpload.action" //上传服务器接口onUpload : insertUpload //服务器返回信息,JSON格式一、前台代码$(function() {…

python如何画出多个独立的图片_python实现在一个画布上画多个子图

matplotlib 是可以组合许多的小图, 放在一张大图里面显示的. 使用到的方法叫作 subplot. 均匀画图 使用import导入matplotlib.pyplot模块, 并简写成plt. 使用plt.figure创建一个图像窗口. 1 2 3 import matplotlib.pyplot as plt plt.figure() 使用plt.subplot来创建小图. plt.…

e5cc温控仪通讯参数设定_产品介绍||DeltaWiFi通讯型多功能电表DPMC520W

Delta-WiFi通讯型多功能电表DPM-C520W台达WiFi通讯型多功能电表DPM-C520W &#xff0c;使用无线通信技术&#xff0c;非常适合于挑高空间和不易配线的盘体使用。可支持各种电力参数量测及谐波量测&#xff0c;支持报警设定、参数群组化设定&#xff0c;采用MODBUS-TCP协议&…

文件设置索引_什么样的网站结构备受搜索引擎喜爱?

网站在优化中&#xff0c;对于收录问题也非常重视&#xff0c;但很多时候&#xff0c;网站各方面都做的很好但就是蜘蛛不抓取&#xff0c;这个时候就要考虑是网站结构问题了&#xff0c;导致网站页面无法被正常抓取。那么怎样才能提升搜索引擎的抓取呢&#xff1f;什么样的结构…