首页 > 编程语言 >零基础国产GD32单片机编程入门(十六)DMA详解及ADC-DMA方式采集含源码

零基础国产GD32单片机编程入门(十六)DMA详解及ADC-DMA方式采集含源码

时间:2024-09-11 12:52:17浏览次数:13  
标签:DMA enable dma 单片机 源码 adc config ADC

文章目录

一.概要

基本概念:
DMA是Direct Memory Access的首字母缩写,是一种完全由硬件执行数据交换的工作方式。DMA控制器从CPU接管对总线的控制,不经过CPU直接在内存和外设之间进行批量数据交换。DMA控制器向内存发出地址和控制信号,修改地址,对传送的字的个数计数,并且以中断方式向CPU报告传送操作的结束。 DMA方式一般用于高速传送成组数据。

DMA传输的三大要素:
传输源:DMA控制器从传输源读出数据;
传输目标:DMA控制器将数据传输的目标;
触发信号:用于触发一次数据传输的动作,执行一个单位的传输源至传输目标的数据传输;可以用来控制传输的时机。

DMA的主要优点:
由于CPU根本不参加传送操作,因此就省去了CPU取指令、取数、送数等操作。在数据传送过程中,没有保存现场、恢复现场之类的工作。内存地址修改、传送字个数的计数等等,也不是由软件实现,而是用硬件线路直接实现的。所以DMA方式能满足高速I/O设备的要求,也有利于CPU效率的发挥。

二.GD32F103C8T6单片机DMA外设特点

传输数据长度可编程配置,最大到65536;
7个通道,并且每个通道都可配置(DMA0有7个通道);
AHB和APB外设,片上闪存和SRAM都可以作为访问的源端和目的端;
每个通道连接固定的硬件DMA请求;
支持软件优先级(低、中、高、极高)和硬件优先级(通道号越低,优先级越高);
存储器和外设的数据传输宽度可配置:字节,半字,字;
存储器和外设的数据传输支持固定寻址和增量式寻址;
支持循环传输模式;
支持外设到存储器,存储器到外设,存储器到存储器的数据传输;
每个通道有3种类型的事件标志和独立的中断;
支持中断的使能和清除。

三.GD32单片机DMA内部结构图

在这里插入图片描述
DMA控制器由4部分组成:

AHB 从接口配置DMA
AHB主接口进行数据传输
仲裁器进行DMA请求的优先级管理
数据处理和计数

四.DMA各通道请求

多个外设请求被映射到同一个DMA通道。这些请求信号在经过逻辑或后进入DMA。通过配置对应外设的寄存器,每个外设的请求均可以独立的开启或关闭。用户必须确保同一时间,在同一个通道上仅有一个外设的请求被开启。
在这里插入图片描述
在这里插入图片描述
以ADC0为例,可以映射到DMA的Channel0

DMA的传输模式:

循环模式:用于处理一个环形的缓冲区,每轮传输结束时数据传输的配置会自动地更新为初始状态,DMA传输会连续不断地进行。 一般采用循环模式。

普通模式:在DMA传输结束时,DMA通道被自动关闭,进一步的DMA请求将不被满足。

五.GD32F103C8T6单片机ADC-DMA采集例程

STLINK接GD32F103C8T6开发板,STLINK接电脑USB口。

在这里插入图片描述

GD32F103C8T6开发板的PA4 引脚上的进行 ADC 电压采集,杜邦线连接 PA4 引脚与 VDD(3.3V),应该能读到单片机供电的电压值。

主要代码:

uint16_t adc_value;//ADC采样值
uint16_t Vol_Value;//电压值
/*!
    \brief      configure the DMA peripheral
    \param[in]  none
    \param[out] none
    \retval     none
*/
void dma_config(void)
{
    /* ADC_DMA_channel configuration */
    dma_parameter_struct dma_data_parameter;
    
    /* ADC DMA_channel configuration */
    dma_deinit(DMA0, DMA_CH0);//ADC0需要映射到通道0
    
    /* initialize DMA single data mode */
    dma_data_parameter.periph_addr  = (uint32_t)(&ADC_RDATA(ADC0));
    dma_data_parameter.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;
    dma_data_parameter.memory_addr  = (uint32_t)(&adc_value);//采样值存储到变量
    dma_data_parameter.memory_inc   = DMA_MEMORY_INCREASE_DISABLE;
    dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
    dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT;  
    dma_data_parameter.direction    = DMA_PERIPHERAL_TO_MEMORY;
    dma_data_parameter.number       = 1;
    dma_data_parameter.priority     = DMA_PRIORITY_HIGH;
    dma_init(DMA0, DMA_CH0, &dma_data_parameter);
    dma_circulation_enable(DMA0, DMA_CH0);//循环模式使能
  
    /* enable DMA channel */
    dma_channel_enable(DMA0, DMA_CH0);//使能DMA0通道0
}




void adc_config(void)
{
    /* reset ADC */
    adc_deinit(ADC0);
    /* ADC mode config */
    adc_mode_config(ADC_MODE_FREE);
    /* ADC contineous function enable */
    adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);
    /* ADC scan mode disable */
    adc_special_function_config(ADC0, ADC_SCAN_MODE, DISABLE);
    /* ADC data alignment config */
    adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
    /* ADC channel length config */
    adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1);
 
    /* ADC regular channel config */
    adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_4, ADC_SAMPLETIME_55POINT5);
    /* ADC trigger config */
    adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
    adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
    
    /* enable ADC interface */
    adc_enable(ADC0);
    delay_1ms(1);
    /* ADC calibration and reset calibration */
    adc_calibration_enable(ADC0);
    /* ADC DMA function enable */
    adc_dma_mode_enable(ADC0);//DMA使能
    /* ADC software trigger enable */
    adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL); 
}

int main(void)
{
	rcu_apb2_clock_config(RCU_APB2_CKAHB_DIV1);//设置主频108M(#define __SYSTEM_CLOCK_108M_PLL_HXTAL         (uint32_t)(108000000)),8M外部晶振  (#define HXTAL_VALUE    ((uint32_t)8000000))
  	systick_config();//配置1ms SysTick
	rcu_periph_clock_enable(RCU_AF);//AF时钟使能 
	delay_1ms(1000);
	
	//配置PA4 ADC引脚
	rcu_periph_clock_enable(RCU_GPIOA);
	gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4); 
	/* enable ADC1 clock */
	rcu_periph_clock_enable(RCU_ADC0);
	/* enable DMA0 clock */
	rcu_periph_clock_enable(RCU_DMA0);
	/* config ADC clock */
	rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8);
	//配置ADC
	dma_config();//DMA配置
	adc_config();//ADC配置
	while(1)
	{

		Vol_Value=adc_value*3300/4095;//读取ADC值,并转换成电压值
        delay_1ms(500);//等待500ms
		
	}
		
}

实验结果:
用Keil运行程序,全速运行,查看Keil调试Watch界面,如下图,PA4引脚的采样值adc_value
为0xfff,电压值为3300mV。
在这里插入图片描述

六.工程源代码下载

通过网盘分享的文件:18.ADC_DMA实验.zip
链接: https://pan.baidu.com/s/1gXpLC8ddlfVSGXG4pkT8dA 提取码: ny7i
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行
CSDN代码

七.小结

使用DMA进行数据收发能够提高数据传输的效率和可靠性。其次,使用DMA进行串口数据收发可以减轻CPU的负担。

标签:DMA,enable,dma,单片机,源码,adc,config,ADC
From: https://blog.csdn.net/zy2232652/article/details/142033911

相关文章

  • Springboot计算机毕业设计校园生活互助(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,助者,类型,商品信息,互助订单,信誉分增加,信誉分减少,用户信誉分,助者信誉分,助者分减少,助者分增加,商品展示,订单信息开题报告内容一、选题背景与意义随......
  • Apache SeaTunnel Zeta 引擎源码解析(二) Client端的任务提交流程
    作者:刘乃杰编辑整理:曾辉引入本系列文章是基于ApacheSeaTunnel2.3.6版本,围绕Zeta引擎给大家介绍其任务是如何从提交到运行的全流程,希望通过这篇文档,对刚刚上手SeaTunnel的朋友提供一些帮助。我们整体的文章将会分成三篇,从以下方向给大家介绍:SeaTunnelServer端的初始化Cl......
  • SSM三高患者健康食谱管理系统的设计与实现-附源码211633
    摘 要随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于三高患者健康食谱管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了三高患者健康食谱管理系统,它彻底改变了过去传统的管理方式,不仅使服务管理难度变低了,还提升了管理......
  • 基于Python的基层派出所与警务站警情管理系统-附源码14419
    摘 要基层派出所与警务站作为社会治安的坚实守护者,日常承担着繁重的警情处理工作。为了提升警务工作的信息化水平,优化警情管理流程,我们精心打造了这款基层派出所与警务站警情管理系统。该系统基于Django框架开发,旨在通过智能化、自动化的手段,实现警情的快速录入、高效处理......
  • Springboot疫苗接种信息管理系统的设计与实现-附源码13965
    摘 要在网络飞速发展的信息时代,各个行业都离不开信息的处理,在这种时代背景下,社会以人们健康为导向,以疫苗接种信息的持续创新,根据这两点,为当前形势最重要的疫苗接种信息设计一个系统就很有必要。系统采用了B/S结构,在此基础上,对各业务模块进行了界面交互,以MySQL为数据库,并选......
  • 基于ssm的家庭幼儿离校教育系统的设计与实现-附源码13819
    目 录1绪论1.1研究背景与意义1.2国内外现状1.3论文结构与章节安排2 家庭幼儿离校教育系统分析2.1可行性分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3 系统用例......
  • Springboot 演唱会志愿服务管理系统-计算机毕业设计源码87038
    摘 要随着演唱会的规模与影响力不断扩大,志愿服务在演唱会组织与管理中扮演着日益重要的角色。为提高志愿服务效率,优化管理流程,我们开发了基于SpringBoot的演唱会志愿服务管理系统。该系统旨在通过信息化手段,实现志愿者的在线报名、任务分配、服务记录及评价反馈等功能,从而......
  • 基于单片机设计的水平仪(STC589C52+MPU6050)
    一、前言【1】项目背景水平仪是一种常见的测量工具,用于检测物体或设备的水平姿态。在许多应用中,如建筑、制造和航空等领域,保持设备的水平姿态是非常重要的。为了实现实时的水平检测和显示,基于单片机设计的水平仪是一个常见的解决方案。数字水平仪是一种用于测量物体相对于水平面的......
  • SSM高校图书馆座位的智能化管理系统小程序-毕业设计源码15796
    摘要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对高校图书馆座位的智能化管理系统小程序等问题,对高校图书馆座位的智能化管理系统小程序进行研......
  • 【万字文档+PPT+源码】基于springboot+vue的研究生科研文档资料管理系统-可用于毕设-
    博主简介:......