GD32 笔记 05:如何使用 DMA 配合 ADC,以软触发的方式采集电压

2023-10-27

一. 前言

二. 主要代码

1. 变量定义

static uint16_t sampling_data[2];// 采样数据

2. 初始化配置函数(GPIO,ADC,DMA)

void ADC_DMA_Init(void)
{	
	/* GPIO 配置 */
	rcu_periph_clock_enable(RCU_GPIOA);                                           // 使能外设时钟。
	gpio_mode_set          (GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_1); // 设置GPIO模式:浮空输入,无上下拉。
	gpio_mode_set          (GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_2);
	
	/* DMA 配置 */
	dma_parameter_struct            dma_init_struct;           // DMA 初始化参数结构体。
	rcu_periph_clock_enable        (RCU_DMA);                  // 使能外设时钟。
	dma_deinit                     (DMA_CH0);                  // 复位DMA通道x的所有寄存器。
	dma_init_struct.periph_addr  = (uint32_t)&(ADC_RDATA);     // 设置DMA的外设地址,也是DMA数据传输的源地址。ADC单次采样转换结束后,会将数据存入ADC_RDATA地址中
	dma_init_struct.memory_addr  = (uint32_t)sampling_data;    // 设置DMA存储器地址,也是DMAD数据传输的目标地址。
	dma_init_struct.direction    = DMA_PERIPHERAL_TO_MEMORY;   // 设置DMA的数据传输方向。
	dma_init_struct.number       = 2;                          // 设置DMA一个周期要传输的数据个数,单位由下方设置。ADC使能了两个采样通道,所以DMA每个周期需要传输两个数据。
	dma_init_struct.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;// 设置DMA数据传输的源地址自增算法失能。ADC每次转换后数据存放的缓存地址不变,所以这里将之失能。
	dma_init_struct.memory_inc   = DMA_MEMORY_INCREASE_ENABLE; // 设置DMA数据传输目标地址自增算法使能,因为DMA每个周期需要传送两个数据,所以在一个周期内,目标地址要自增。
	dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT; // 设置DMA从外设中取出的数据位数。因为ADC转化后的数值是16bit,所以这里设置为1字。
	dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT;     // 设置DMA存入存储器中的数据位数。
	dma_init_struct.priority     = DMA_PRIORITY_ULTRA_HIGH;    // 设置DMA数据传输高优先级。
	dma_init                       (DMA_CH0, &dma_init_struct);// 将结构体送回,初始化DMA通道x
	dma_circulation_enable         (DMA_CH0);                  // DMA循环模式使能。这样DMA在传输两个数据结束后,存储器地址复位,自动开启下一轮传输。
	dma_memory_to_memory_disable   (DMA_CH0);                  // 存储器到存储器DMA传输使能。因为这里用不上,所以失能。
	dma_channel_enable             (DMA_CH0);	                 // DMA通道x传输使能
	
	/* ADC 配置 */
	rcu_adc_clock_config              (RCU_ADCCK_APB2_DIV6);                           // 设置ADC的采样时钟分频,因为ADC的采样时钟不得高于14MHz。
	rcu_periph_clock_enable           (RCU_ADC);                                       // 使能外设时钟。
	adc_deinit                        ();                                              // 复位ADC外设。
	adc_special_function_config       (ADC_SCAN_MODE, ENABLE);                         // 配置ADC扫描转换模式。
	adc_special_function_config       (ADC_CONTINUOUS_MODE, ENABLE);                   // 配置ADC连续转换模式。
	adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_NONE); // 配置ADC外部触发源是软件触发。
	adc_data_alignment_config         (ADC_DATAALIGN_RIGHT);                           // 配置ADC数据对齐方式是右对齐。
	adc_channel_length_config         (ADC_REGULAR_CHANNEL, 2);                        // 配置规则通道组或注入通道组的长度。因为要用到两个采样通道,所以是2.
	adc_regular_channel_config        (0, ADC_CHANNEL_1, ADC_SAMPLETIME_55POINT5);     // 配置ADC规则通道组。rank代表扫描顺序,channel要根据ADC通道与GPIO的映射关系表确定。
	adc_regular_channel_config        (1, ADC_CHANNEL_2, ADC_SAMPLETIME_55POINT5);	
	adc_enable                        ();                                              // 使能ADC外设
	adc_calibration_enable            ();                                              // ADC校准复位
	adc_dma_mode_enable               ();                                              // ADCx DMA请求使能
	adc_software_trigger_enable       (ADC_REGULAR_CHANNEL);                           // ADC软件触发使能。
	/* 排除原因:延时。原以为是因为配置后没有给够时间,导致配置失败,但是在启动之前加了1s的延时仍然无法采集到数据。*/
    /* 猜测原因:应该是在某种不清楚的条件下,将该函数设置的标志位进行的重置。暂且就调用两次,完成ADC+DMA的软件触发方式采集。*/
	adc_software_trigger_enable       (ADC_REGULAR_CHANNEL);
}

3. 主函数

int main()
{
	systick_config();
	
	ADC_DMA_Init();
	
	while (1)
	{	
		SEGGER_RTT_printf(0,"%d, %d\n", sampling_data[0], sampling_data[1]);
		delay_1ms(1000);
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GD32 笔记 05:如何使用 DMA 配合 ADC,以软触发的方式采集电压 的相关文章

随机推荐

  • 阿里云服务器和轻量云服务器对比有什么区别?

    阿里云轻量应用服务器和云服务器ECS有什么区别 ECS是专业级云服务器 轻量应用服务器是轻量级服务器 轻量服务器使用门槛更低 适合个人开发者或中小企业新手使用 可视化运维 云服务器ECS适合集群类 高可用 高容灾企业级架构 使用相对于轻量更
  • 详细解析STM32的时钟系统

    STM32的时钟系统 一 时钟系统框图 1 1 STM32F10x 1 2 STM32F40x 二 时钟系统 2 1 STM32F10x时钟源 HSI RC振荡器 频率8MHz 精度不高HSE 外接石英 陶瓷晶振 4MHz 16MHz LS
  • java的作用域

    文章目录 作用域 细节 注意 作用域 在java中 主要变量就是成员变量和局部变量 一般局部变量指的是成员方法中定义的变量 作用域的分为全局变量和局部变量 全局变量的作用域在整个类体 除了属性之外的都是局部变量 作用域只能用于某块 全局变量
  • 软件测试质量度量指标

    软件测试质量度量指标 度量模块 度量指标 统计方法 度量说明 产品完成度 1 需求通过率 已通过需求 已计划需求 体现需求的完成度 也常可以统计为 测试用例通过数 计划的测试用例总数 即默认用例覆盖是完全的 2 功能点通过率 已通过功能点
  • 安装驱动时出现“INF中的服务安装段落无效”

    今天安装ti开发板的驱动 在安装虚拟串口时出现 INF中的服务安装段落无效 以致驱动未安装成功 接下来我就说说我的解决过程 因为提示的是 inf中的 了解驱动的就知道有个扩展名为inf的文件 于是准备 打开驱动目录中的inf文件 如下图 有
  • 【延期至12月】2022年网络安全国际研讨会(CSW2022)

    延期至12月 2022年网络安全国际研讨会 CSW2022 重要信息 会议网址 www cybersecurityworkshop org 会议时间 2022年12月16 18日 召开地点 杭州 截稿时间 2022年10月20日 录用通知
  • 商业不是战争

    我在一个大客户那里工作的时候经常想这样一件事 他们 以及国内很多 IT或者非IT 企业 讲军事化管理 讲服从命令 为什么我总觉得这事不对 到底不对在什么地方 我想出来的结论是 商业不是战争 第一 商业的特点是negotiatable 战争是
  • 单链表中间值(经典案例,5分钟解决)

    一 题目描述 给定一个单链表 但不知该表的大小 现要求只遍历一次 找出位于单链表中间的值 输入 1 8 7 6 4 5 3 1 输出 6 样例输入 Copy 1 2 4 8 9 6 3 1 0 样例输出 Copy 9 二 实现方法 普通方法
  • 创新零售,京东重新答题?

    继新一轮组织架构调整后 京东从低价到下沉动作不断 新成立的创新零售部在京东老将闫小兵的带领下悄然完成了整合 近日 京喜拼拼已改名为京东拼拼 与七鲜 前置仓等业务共同承载起京东线上线下加速融合的梦想 同时 拼拼的更名 也被外界解读为京东重新点
  • 关于jdbc常见错误

    版本问题 如果运行时控制台报错 Exception in thread main com mysql jdbc exceptions jdbc4 MySQLNonTransientConnectionException Could not
  • k8s-pod的亲和度调度

    文章目录 1 Node Affinity 1 1 node节点的预制标签 1 2 自定义标签 1 2 1 给node增加标签 1 2 2 修改label 1 2 3 修改label 1 3 Require 1 4 Perferred 1 3
  • 商品消费计费课程设计

    具体代码如下 商品销售计费显示系统 输入品种 数量 单价 计算并显示顾客应付的款数 并打印清单 include
  • metasploitable2

    nmap使用 nmap sP IP段 掩码 范围内ping通的所有主机 通过抓包只看到发了arp包 还没有找全局域网内所有主机 nmap sP 192 168 43 0 24 PS 让nmap使用SYN包而不是ACK包来对目标主机进行扫描
  • pyinstaller 打包程序 出现错误的解决方法

    打开命令窗口进入到程序所在目录下 1 使用命令pyinstaller p C Python27 Lib site packages zmq SpiderTaskDistributor py 打包程序 p参数是添加的pyinstaller打包
  • Quartz简单应用(Springboot环境)

    需求 在项目中免不了会使用定时任务来执行一些自动化的操作 简单的定时任务可以在方法上加上 Schedule的注解来执行定时任务 但是如果有多个同级的模块在不同的时间点执行同一个方法 就没办法仅仅使用 Schedule来执行了 侃场景 现在某
  • Linux Tomcat JVM 参数调优

    Linux Tomcat JVM 参数调优 适用场景 Tomcat 长期运行过程遇到Caused by java lang OutOfMemoryError PermGen space或java lang OutOfMemoryError
  • VB.net对于datagride控件的使用及C#中datagrideView\bindingSource\bindingNavigator\tabcontrol控件的应用

    绑定数据源 DataSet ds new DataSet SqlConnection connection new SqlConnection netiFace ConnectionString ConnectionString conne
  • d指针在Qt上的应用及实现

    Qt为了使其动态库最大程度上实现二进制兼容 引入了d指针的概念 那么为什么d指针能实现二进制兼容呢 为了回答这个问题 首先弄清楚什么是二进制兼容 所谓二进制兼容动态库 指的是一个在老版本库下运行的程序 在不经过编译的情况下 仍然能够在新的版
  • pip使用踩坑集合

    1 python版本切换后 pip不好用了 报错如下 使用 python m pip install U pip 命令对pip进行更新 2 pip安装包时 报错如下 网络状态有问题 国外源挂梯子 国内源关梯子 3 windows系统下pyt
  • GD32 笔记 05:如何使用 DMA 配合 ADC,以软触发的方式采集电压

    文章目录 一 前言 二 主要代码 1 变量定义 2 初始化配置函数 GPIO ADC DMA 3 主函数 一 前言 测试时使用的 MCU 是 GD32E230 测试例程下载地址是 20210409 test gd32 usart dma z