手把手教你如何使用DMA转运ADC多通道数据

1 介绍DMA

1.1 概念

DMA的全称是Direct Memory Access,意为直接存储器存取。

DMA用于外设和存储器以及存储器和存储器之间的高速数据传输,并且这个传输过程无需CPU干涉,节省了CPU的资源。

1.2 硬件资源

对于大容量的STM32芯片,一般都有两个DMA外设。分别是DMA1(7个通道),DMA2(5个通道)。每个通道都支持软件触发和特定的硬件触发。

硬件触发一般用于外设和存储器之间,软件触发用于存储器和存储器之间。

1.3 整体框图

img

上图为DMA的整体框图,从图中我们可得以下几点信息:

(1)DMA仲裁器配置通道优先级。在总线矩阵中也有仲裁器,当DMA和CPU同时向同一个数据发送请求时,会暂停CPU的请求,但也会有一半的带宽留给CPU;
(2)外设和存储器以及存储器和存储器之间可互相进行数据传输;
(3)必须配置传输计数器,来确定传输的次数,次数必须要大于0
(4)通过配置自动重装器,来确定是否需要不停地连续传输;
(5)DMA传输必须要有触发信号;
(6)DMA传输必须要使能DMA通道和对应外设的DMA使能。

2 代码实现

2.1 DMA初始化

代码如下:

	DMA_InitTypeDef DMA_InitStructure;
	DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1->DR; //起点地址为ADC1的DR寄存器
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //传输的数据宽度为半字
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //因为起点地址固定,所以失能地址自增模式
	DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)AD_Value; //因为地址是32位的 所以强转为32位
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//传输的数据宽度为半字
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;//因为终点地址固定,所以失能地址自增模式
	DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //设置DMA通道优先级为中等
	DMA_InitStructure.DMA_BufferSize = 3;//因为有三个数值要传输,所以将传输计数器的值设为3
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//从ADC外设传输到SRAM存储器,所以ADC寄存器地址为源地址
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //是否开启软件触发:否  因为ADC属于硬件触发源
	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //开启DMA循环转运模式
	DMA_Init(DMA1_Channel1, &DMA_InitStructure);

DMA结构体的参数较多,所以配置时应当细心。

2.2 使能通道

代码如下:

DMA_Cmd(DMA1_Channel1,ENABLE);		//使能DMA1的通道1
ADC_DMACmd(ADC1, ENABLE);           //使能ADC1触发DMA1的信号
ADC_Cmd(ADC1, ENABLE);				//使能ADC1,ADC开始运行

2.3 定义存放数组

定义一个SRAM数组,用于存放ADC转换后的值。

uint16_t AD_Value[3];

2.4 主函数

int main(void)
{
	
	ADC1_DMA_Init();
 
	OLED_Init();
 
	OLED_ShowString(0, 0, "AD0:", OLED_8X16);
	OLED_ShowString(0, 16, "AD1:", OLED_8X16);
	OLED_ShowString(0, 32, "AD2:", OLED_8X16);
	
	while (1)
	{	
		OLED_ShowNum(32,  0, AD_Value[0], 4, OLED_8X16);//DMA搬运后的数据
		OLED_ShowNum(32,  16, AD_Value[1], 4, OLED_8X16);
		OLED_ShowNum(32,  32, AD_Value[2], 4, OLED_8X16);
		
		Delay_ms(100);
		OLED_Update();
	}
}

3 应用实现

3.1 硬件连接

光敏传感器------AOPA0
热敏传感器----- AOPA1
对射式红外传感器—AOPA2

3.2 实验目的

利用DMA搬运ADC扫描模式下转换完成的多通道AD数据至SRAM数组,熟练掌握DMA搬运原理以及ADC多通道配置。

3.3 实验现象

img

3.4 实验结果

DMA搬运正常,实验完成。

文章已获作者授权转载,版权归原作者所有,如有侵权,与本账号无关,可联系删除。 原文作者:ITC小浪花、
原文链接:https://blog.csdn.net/qq_50998481/article/details/134597497

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值