【第五章】STM32-ADC模数转换(2.AD多通道+DMA转运实验)

这篇具有很好参考价值的文章主要介绍了【第五章】STM32-ADC模数转换(2.AD多通道+DMA转运实验)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关联:STM32总结超全笔记【秋招自用】

【引言】

我们在上一节已经了解了ADC以及AD单通道采集的过程,那么既然有AD单通道,那么必然有AD多通道,上一节也已经铺垫了一下:

【问】如果一个规则组同时用多个通道采集数据,那么数据如何读取?

                                            --DMA--                                                     

按照规则组的顺序:上一个通道转换的数据会被下一个通道转换的数据所覆盖。

所以通道转换完毕后要及时使用DMA把数据取走。

【问】CPU不是也可以访问这条ADC采集的数据总线吗?为什么一定要DMA去做?【第五章】STM32-ADC模数转换(2.AD多通道+DMA转运实验),stm32,嵌入式硬件,单片机

 CPU相当于STM32的大脑,对于数据的复制和存储这种“小事情”,完全可以让他的小助手DMA去做。

【DMA】

DMA,全称Direct Memory Access,即直接存储器访问。

DMA将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间的高速数据传输

【DMA工作流程】

如图所示:

【第五章】STM32-ADC模数转换(2.AD多通道+DMA转运实验),stm32,嵌入式硬件,单片机

【DMA数据传输方式】

1.增量模式:DMA数据传输的数据源和目的地址会自动递增。

优点:可以方便的连续传输数据块

适用于:从连续内存区域读取或写入数据

2.循环模式:DMA数据传输的数据源和目的地之在达到终点后会回到起始地址。

优点:可以重复传输一定长度的数据

适用于:周期性传输数据 或 循环缓冲区

【STM32的DMA】

STM32F103具有2个DMA控制器 ,DMA1有7个通道,DMA2有5个通道。每个通道都可以配置一些外设的地址。【第五章】STM32-ADC模数转换(2.AD多通道+DMA转运实验),stm32,嵌入式硬件,单片机

这是DMA1可以产生的7个通道的DMA请求 ,每个通道对应不同的外设

【例程10】AD多通道+DMA转运实验

【GPIO的配置】

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟

    /*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);		
    //将PA0、PA1、PA2和PA3引脚初始化为模拟输入

四个引脚都配置为模拟输入

【ADC的配置】

    /*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);	//开启ADC1的时钟
	
    /*设置ADC时钟*/
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);  //选择时钟6分频,ADCCLK = 72MHz / 6 = 12MHz
	
    /*规则组通道配置*/
	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);	//规则组序列1的位置,配置为通道0
	ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5);	//规则组序列2的位置,配置为通道1
	ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5);	//规则组序列3的位置,配置为通道2
	ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5);	//规则组序列4的位置,配置为通道3
	
	/*ADC初始化*/
	ADC_InitTypeDef ADC_InitStructure;									
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;					//独立模式,单独使用ADC1
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;				//数据右对齐
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//使用软件触发
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;					//连续转换
	ADC_InitStructure.ADC_ScanConvMode = ENABLE;						//扫描模式使能,扫描规则组的序列,扫描数量由ADC_NbrOfChannel确定
	ADC_InitStructure.ADC_NbrOfChannel = 4;								//通道数为4,扫描规则组的前4个通道
	ADC_Init(ADC1, &ADC_InitStructure);									

规则组通道配置:看图即可。

【第五章】STM32-ADC模数转换(2.AD多通道+DMA转运实验),stm32,嵌入式硬件,单片机

多通道(4个通道)使能了连续转换扫描模式

【DMA的配置】

    uint16_t AD_Value[4];					//定义用于存放AD转换结果的全局数组
    


    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);		//开启DMA1的时钟
	
	/*DMA初始化*/
	DMA_InitTypeDef DMA_InitStructure;											
	DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;				
    //外设基地址,给定形参AddrA
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;	
    //外设数据宽度,选择半字,对应16为的ADC数据寄存器
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;			
    //外设地址自增,选择失能,始终以ADC数据寄存器为源
	DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)AD_Value;					
    //存储器基地址,给定存放AD转换结果的全局数组AD_Value
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;			
    //存储器数据宽度,选择半字,与源数据宽度对应
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;						
    //存储器地址自增,选择使能,每次转运后,数组移到下一个位置
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;							
    //数据传输方向,选择由外设到存储器,ADC数据寄存器转到数组
	DMA_InitStructure.DMA_BufferSize = 4;										
    //转运的数据大小(转运次数),与ADC通道数一致
	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;								
    //模式,选择循环模式,与ADC的连续转换一致
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;								
    //存储器到存储器,选择失能,数据由ADC外设触发转运到存储器
	DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;						
    //优先级,选择中等
	DMA_Init(DMA1_Channel1, &DMA_InitStructure);								//将结构体变量交给DMA_Init,配置DMA1的通道1
	

DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;

指的是DMA传输的外设基地址,本实验是DMA转运ADC的数据,自然是从ADC1的DR寄存器读数据。

DMA_PeripheralDataSize_HalfWord;   

每次从外设读取或向外设写入数据时,DMA传输的数据大小为16位(2字节),

DMA_PeripheralInc_Disable;  

外设地址自增失能,因为始终要以ADC数据寄存器为源

DMA_Priority_Medium

 当多个DMA通道同时请求访问DMA控制器时,这个优先级决定了哪个通道会被优先服务。

【使能ADC和DMA,触发ADC】

    /*DMA和ADC使能*/
	DMA_Cmd(DMA1_Channel1, ENABLE);							//DMA1的通道1使能
	ADC_DMACmd(ADC1, ENABLE);								//ADC1触发DMA1的信号使能
	ADC_Cmd(ADC1, ENABLE);									//ADC1使能

    /*ADC触发*/
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);	                //软件触发ADC开始工作

【主函数】

while (1)
	{
		OLED_ShowNum(1, 5, AD_Value[0], 4);		//显示转换结果第0个数据
		OLED_ShowNum(2, 5, AD_Value[1], 4);		//显示转换结果第1个数据
		OLED_ShowNum(3, 5, AD_Value[2], 4);		//显示转换结果第2个数据
		OLED_ShowNum(4, 5, AD_Value[3], 4);		//显示转换结果第3个数据
		
		Delay_ms(100);							//延时100ms,手动增加一些转换的间隔时间
	}

把数组中的数据在OLED上显示出来文章来源地址https://www.toymoban.com/news/detail-858923.html

到了这里,关于【第五章】STM32-ADC模数转换(2.AD多通道+DMA转运实验)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32模拟SPI协议获取24位模数转换(24bit ADC)芯片AD7791电压采样数据

    STM32大部分芯片只有12位的ADC采样性能,如果要实现更高精度的模数转换如24位ADC采样,则需要连接外部ADC实现。AD7791是亚德诺(ADI)半导体一款用于低功耗、24位Σ-Δ型模数转换器(ADC) ,适合低频测量应用,提供50 Hz/60 Hz同步抑制。 这里介绍基于AD7791的24位ADC采样实现。 AD7791的管脚

    2024年02月09日
    浏览(58)
  • 【正点原子STM32连载】第三十五章 多通道ADC采集(DMA读取)实验 摘自【正点原子】APM32E103最小系统板使用指南

    1)实验平台:正点原子APM32E103最小系统板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban 本章介绍APM32E103的DMA进行多通道的ADC采集。通过本章的学习,读者将学习到DMA、ADC的使用。 本章分

    2024年01月24日
    浏览(48)
  • STM32入门笔记08_ADC模数转换器+案例: ADC单通道&ADC多通道

    ADC(Analog-Digtal Converter) 模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量, 建立模拟电路到数字电路的桥梁 12位逐次逼近型ADC, 1us转换时间 输入电压范围: 0~3.3V, 转换结果范围: 0~4095 18个输入通道, 可测量16个外部和2个内部信号源 规则组和注入组

    2024年02月04日
    浏览(49)
  • STM32-ADC模数转换

    ADC的概念 Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。 ADC的作用 采集传感器的数据,测量输入电压,检查电池电量剩余,监测温湿度等。 典型的模拟数字转换器将模拟信号转换为表示一定

    2024年01月20日
    浏览(37)
  • STM32--ADC模数转换

    STM32的ADC(Analog-Digital Converter)模拟-数字转换器 , 是一种逐次逼近型模拟数字转换器,可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁 。拥有18个输入通道,可测量16个外部通道和2个内部信号源。各通道的A/D转换可以单次、

    2024年02月12日
    浏览(34)
  • STM32 ADC单/多通道采样+DMA搬运

    通过介绍我们可以了解到,ADC是12位的转换器,所以采样值范围是0~4095。18个通道可同时进行转换,也可以单独转换某个通道。 使用ADC的流程应为: 初始化IO口。 我这里使用的是PA1进行采样,也就是ADC1的通道1 初始化ADC。 转换、获取采样值。 多通道的时候我们一般用DMA来搬

    2024年02月14日
    浏览(48)
  • STM32-单通道ADC采集(DMA读取)实验

    关于ADC的一些原理和实验我们已经有了2篇笔记,链接如下: 关于ADC的笔记1_Mr_rustylake的博客-CSDN博客 STM32-ADC单通道采集实验_Mr_rustylake的博客-CSDN博客 实验要求:通过ADC1通道1(PA1)采集电位器的电压,并显示ADC转换的数字量和换算后的电压值。 我们通过下表可以知道DMA1通道

    2024年02月16日
    浏览(50)
  • STM32F407 ADC多通道采样+DMA

    我加入工作室参加的第一个比赛是第五届中国高校智能机器人创意大赛,我参加的赛项是开放部件组轮式自主格斗机器人。经历了没日没夜的调试,无数次欣赏凌晨四点半的夜晚,感受着每天就睡两三个小时伴随着疲惫的开心。在我和队友的共同努力之下,我们的成绩也很优

    2024年02月02日
    浏览(63)
  • STM32 hal库使用笔记(五)ADC—单通道/双通道DMA传输

    实现目的:利用ADC采集光敏传感器/烟雾传感器的值,并利用串口打印 实验平台:正点原子精英版 一、简介 1.DMA的介绍 参考:STM32 hal库使用笔记(四)DMA—内存到内存/内存到外设_乱码小伙的博客-CSDN博客 2.ADC简介      ADC(Analog-Digital Converter)模拟-数字转换器 ADC可以将引脚

    2024年02月03日
    浏览(57)
  • STM32CubeMX配置-ADC多通道配置(DMA) (STM32G070)

    一、写在前面         ADC通道采集数据的两种方式:         1)ADC轮询采集数据直接放到数组中;         2)采用中断方式,ADC采集完成进入中断,中断关闭ADC采集,取数据之后再打开ADC采集。 以下按第一种方式实现: 二、ADC多通道配置 1)配置通道及参数     如果要控

    2024年02月05日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包