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

news2024/12/28 2:34:56

文章目录

    • 一.概要
    • 二.GD32F103C8T6单片机DMA外设特点
    • 三.GD32单片机DMA内部结构图
    • 四.DMA各通道请求
    • 五.GD32F103C8T6单片机ADC-DMA采集例程
    • 六.工程源代码下载
    • 七.小结

一.概要

基本概念:
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的负担。

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

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

相关文章

QML学习三:qml设计器报错 Line: 0: The Design Mode requires a valid Qt kit

开发环境:Qt 6.5.3 LTS 1、Qt 6.5.3 LTS 2、Pyside6 3、Python 3.11.4 4、win11 默认不打开设计器的时候可以看到我们默认是有Python的环境,而且点击运行是可以运行的。但是当打开qml设计器时提示下面这个错误,提示需要一个可用的套件。 解决办法: 点击+号创建新的套件…

迈向新一代星地融合的高速测试解决方案

一、面向未来下一代通信技术的射频测试挑战 移动通信网络的发展如下图所示,1G时代用模拟信号传输,实现了语音传输业务;2G时代,数字传输取代了模拟传输,人们能够使用手机短信和手机上网;3G时代,…

推动生态系统架构创新与可持续发展的关键引擎——The Open Group 2024年度大会全解析

在当今快速变化的数字化转型浪潮中,开放标准正逐渐成为推动企业创新和生态系统架构发展的重要力量。为了帮助企业在实现可持续发展的道路上加速推进,The Open Group 2024生态系统架构与可持续发展年度大会将为架构师、技术专家以及企业CIO、CTO提供一个深…

直流充电桩测试仪优势和特点

直流充电桩测试仪是一种专门用于检测和测试直流充电桩性能的设备。它的主要功能是对充电桩的各项参数进行精确测量,确保其正常工作,提高充电效率和安全性。以下是直流充电桩测试仪的优势和特点: 1. 高精度测量:直流充电桩测试仪具…

【AcWing】861. 二分图的最大匹配(匈牙利算法)

匈牙利算法,他可以在比较快的时间复杂度之内告诉我们左边和右边成功匹配的最大数是多少 匹配指的是边的数量,成功的匹配指的是两个未被使用的点之间存在一条边(就不存在两条边共用了一个点的)。 匈牙利算法可以返回成功匹配的最大匹配数是多少。 #incl…

【AcWing】860. 染色法判定二分图

二分图,把所有点划分到两边去,使得所有边都是在集合之间的,集合内部没有边。 一个图是二分图,当且仅当图中不含奇数环(环的边数是奇数)。这是个充分必要条件,是二分图就一定不含奇数环;不含奇数环就一定是…

工业设备网关在智能工厂建设中发挥的作用,以某汽车制造厂为例

在当今工业4.0的大潮中,智能化和数字化已经成为制造业发展的关键驱动力。工业设备网关,作为连接工业现场设备与上层系统的纽带,其作用不可小觑。本文将以某汽车制造厂的智能化改造项目为例,详细探讨工业设备网关在实际应用中的优势…

CS5363|CS5263升级方案|DP转HDMI 4K60HZ芯片方案

CS5363是一种高度集成的单芯片,适用于多个细分市场和显示应用,如Typec扩展、手机/电脑投屏、扩展底座、投影仪等。 CS5363管脚分布情况如下: CS5363是一款高度集成的单芯片,适用于多个mGeneral 支持最高分辨率/定时4k60Hz 支持…

饿了么官方霸王餐API接口该如何对接?

外卖霸王餐API接口是一种为餐饮行业设计的应用程序编程接口,它允许第三方平台或应用程序与外卖平台进行数据交换和功能集成。通过这种接口,商家可以实现自动化管理,提高运营效率,同时为消费者提供更加便捷和个性化的服务体验。 霸…

记录debug分析nacos源码

nacos源码分析 一、环境构建二、源码分析1. 启动类2. 源码的中的案例3.. 服务订阅流程梳理3.1. 从 NamingFactory.createNamingService(properties);说起3.2. 服务订阅总结 4. 服务注册流程梳理4.1. 从 naming.registerInstance("nacos.test.3", "11.11.11.11&q…

【文心智能体】通过工作流使用知识库来实现信息查询输出,一键查看旅游相关信息,让出行多一份信心

欢迎来到《小5讲堂》 这是《文心智能体平台》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 创建灵感基本配置头像名称和简介人物设定角色与目标思考路…

一文读懂数据血缘分析原理与建设方法

什么是数据血缘分析?数据血缘为数据全生命周期过程中的数据关系,包括数据特征的变化,即数据的来龙去脉。主要内容包括数据的来源、数据的加工方式、映射关系以及数据的流出和消费。数据血缘分析就是针对数据分析中的血缘关系做分析,主要包含…

第二证券:10倍“妖股”一天暴跌98% 揭秘港股那些做局套路

尽管港股行情全体低迷,自上一年以来港股商场仍不乏短短时日暴升10倍以上的疑似“妖股”,这些公司普遍具有一起的特征:刚上市不久的新股、次新股,市值较小、股权高度会集。 证券时报记者通过查询发现,这类股票反面往往…

图片无损缩放PhotoZoom Pro 9.0.2绿色版 +免费赠送PhotoZoom激活优惠代码

PhotoZoom Pro 9.0.2 是一款专业的图片无损缩放软件,该软件采用了 benvista s-spline 独特技术,增强了对图像格式的支持,多处理器支持,GPU 加速,win10和 Photoshop CC 支持。带来一流的数字图形扩展与缩减技术。该软件…

torch torchvision 安装失败解决方法

按照安装教程在安装Torch torchvision的时候报错 报错内容: ERROR: Could not find a version that satisfies the requirement torch (from versions: none)ERROR: No matching distribution found for torch 出现这个情况,有说要换源什么的&#xff…

博客常见问题

hexo g 生成静态文件 hexo s 本地预览 hexo d 同步上传到git 1、输入hexo d ,上传到git时,报错 看了下git的配置,没有问题,单机过去也能直接到我的git上 可能是传不过去,token的问题 最下面开发者设置,找到…

单片机毕业设计-基于单片机的运动手环

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP…

2024年【浙江省安全员-C证】找解析及浙江省安全员-C证模拟考试题库

题库来源:安全生产模拟考试一点通公众号小程序 浙江省安全员-C证找解析是安全生产模拟考试一点通生成的,浙江省安全员-C证证模拟考试题库是根据浙江省安全员-C证最新版教材汇编出浙江省安全员-C证仿真模拟考试。2024年【浙江省安全员-C证】找解析及浙江…

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from lwc; import { publish, MessageContext } from lightning/messageService; imp…

新手烤鸡测试——单烤没拉满

文章目录 电脑配置先来一波硬件信息硬盘检测cpu-Z跑分AIDA64单烤FPUDistInfoDiskMark查看硬盘读写次数 电脑配置先来一波 图吧下载地址 硬件信息 硬盘检测 cpu-Z跑分 AIDA64单烤FPU 压榨cpu性能结果 DistInfo 计算了一下到几天快两个月的使用时间也没差 DiskMark查看硬盘读…