GD32F4xx MCU ADC+DMA 多通道采样

2023-11-19

1、GD32F4xx ADC

GD32F4xx 的12位ADC是一种采用逐次逼近方式的模拟数字转换器。

1.1 主要特征

  1. 可配置12位、10位、8位、6位分辨率;
  2. ADC采样率:12位分辨率为2.6MSPs,10位分辨率为3.0 MSPs。分辨率越低,转换越快;
    PS: MSPs (模拟混合信号转换速率),是指完成1次从模拟转换到数字的AD转换所需的时间的倒数。常用单位是ksps和Msps,表示每秒采样(千)/(百万)次(kilo / Million Samples per Second)。 1msps=1000 ksps
  3. 自校准时间:131个ADC时钟周期;(如25MHz时钟,校准时间约5.24us
  4. 可编程采样时间、可配置数据对齐方式;
  5. 支持规则通道数据转换的DMA请求;
  6. 模拟输入通道:
    1) 16个外部输入通道;
    2) 1个内部温度传感器通道;
    3) 1个内部参考电压输入通道;
    4) 1个外部监测电池Vbat供电引脚输入通道;
  7. 转换触发: 软件触发 和 硬件触发(硬件中断等

1.2 引脚定义

引脚名称 信号类型 说明
VDDA 输入,模拟供电电源 2.6v ≤ VDDA ≤ 3.6v
VSSA 输入,模拟电源地 等于Vss
VREFP 输入,模拟参考电压正 ADC 正参考电压 2.6v ≤ VREFP ≤ VDDA
VREFN 输入,模拟参考电压负 ADC 负参考电压 VREFN = VSSA
ADCx_IN[15:0] 输入,模拟信号 16路外部通道
VBAT 输入,模拟信号 外部电池电压

PS: VDDA 和 VSSA 必须分别接到VDD 和 Vss

1.3 ADC校准

ADC带有一个前置校准功能。在校准期间,ADC计算一个校准系数,这个系数直到ADC下次掉电才无效。在校准期间,不能使用ADC必须等到校准完成。在AD转换之前应执行校准操作,一般放在初始化里执行。通过软件设置 ADC_CTL1寄存器的RSTCLB位为1来对校准进行初始化,在校准期间RSTCLB位会一直保持1,直到校准完成,该位由硬件清0。

PS: 当ADC运行条件改变(如,VDDA、VREFP、温度等条件变化,建议重新执行一次校准操作。)

1.4 ADC时钟

ADC CLK 与 CK_AHB、PLCK2 时钟保持同步。ADC最大时钟频率为40MHz。
在这里插入图片描述

1.5 规则组和注入组

ADC转换可以组织成2组: 一个规则组通道和一个注入组通道。
1)规则组最多16个转换组成。而注入组最多4个转换组成。
2)注入组通道可以打断规则组通道
注入通道有2中模式:
① 触发注入模式: 在规则组通道转换期间如果软件触发或外部触发发生,ADC取消当前转换,启动触发注入转换,注入通道序列被以单次扫描方式进行转换。注入通道转换结束后,规则组转换从上次被取消的转换处重新开始。
② 自动注入模式:在规则通道之后,注入通道被自动转换。

1.6 转换模式

举例说明: 规则组通道序列为 CH_0、CH_1、CH_2。
在这里插入图片描述

1.7 其他

  1. 模拟看门狗,可以设置ADC转换电压的低阈值和高阈值,当转换电压 < 低阈值或 >高阈值时,看门狗可以置位标志位或产生中断。可以通过配置看门狗监控单一通道或多通道。
  2. 可编程的采样时间:ADC使用若干个ADCCLK周期对输入电压进行采样。每个通道可以用不同的时间采样。
    12位分辨率的情况下:总转换时间 = 采样时间 + 12个ADCCLK
  3. DMA:ADC在规则组一个通道转换结束后产生一个DMA请求,DMA接收到请求后可以将转换的数据从ADC_RDATA寄存器传输到用户指定的目的地址。
  4. ADC同步模式:待研究…

2、ADC + DMA 测试代码

ADC_DMA_Init

// ADC Init
void ADC_DMA_Init(void)
{
	/* enable GPIOC clock */
    rcu_periph_clock_enable(RCU_GPIOC);		// enable GPIOC clk
	/* enable ADC clock */
    rcu_periph_clock_enable(RCU_ADC0);		// enable ADC clk
    /* config ADC clock */ 
    adc_clock_config(ADC_ADCCK_PCLK2_DIV4);	// config ADC clk: PCLK2/4 = 25MHz  (PCLK2=100MHz)
	
	rcu_periph_clock_enable(RCU_DMA1);		// enable DMA1 clk

	/* config the GPIO as analog mode */
    gpio_mode_set(GPIOC, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_0); // PC0 : ADC012_IN10 
    gpio_mode_set(GPIOC, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_1); // PC1 : ADC012_IN11 
	ADC_Config();	// ADC init
	DMA_config();	// DMA init
	Log_printf("ADC_DMA_Init\r\n");
}

ADC_Config

void ADC_Config(void)
{
	// ADC 独立模式
    adc_sync_mode_config(ADC_SYNC_MODE_INDEPENDENT);
    // 连续转换模式使能
    adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);
    // Scan mode enable
    adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
    // ADC data右对齐
    adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
    
    // 规则通道数量
    adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 2);
    // ADC规则通道配置:Rank优先级排序(0~15),采样时间:15个周期
    adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_10, ADC_SAMPLETIME_15);
    adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_11, ADC_SAMPLETIME_15);

	adc_resolution_config(ADC0, ADC_RESOLUTION_12B); // 12位分辨率
	// ADC外部触发禁用, 即只能使用软件触发
    adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, EXTERNAL_TRIGGER_DISABLE);
    
    // ADC DMA function enable
    adc_dma_request_after_last_enable(ADC0);  // 每个规则组通道转换完成后发送一个DMA请求
    adc_dma_mode_enable(ADC0);
    
    adc_enable(ADC0);
    // wait for ADC stability 
	osDelay(1);
    // ADC自校准
    adc_calibration_enable(ADC0); 
}

DMA_config

#define ADC_CH_CNT 2  //ADC通道数
#define ADC_VALUE_CNT 30  //每通道保存值个数
#define ADC_BUF_LEN (ADC_CH_CNT * ADC_VALUE_CNT)  //DMA缓冲区数据长度
uint16_t gt_adc_val[ADC_BUF_LEN];  //DMA缓冲区

void DMA_config(void)
{
	// ADC0 DMA
    dma_single_data_parameter_struct dma_single_data_parameter;
    
    // ADC DMA_channel configuration 
    dma_deinit(DMA1, DMA_CH0);
   
    // initialize DMA single data mode 
    dma_single_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(ADC0));	// peripheral address
    dma_single_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
    dma_single_data_parameter.memory0_addr = (uint32_t)(gt_adc_val);		// memory address
    dma_single_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
    dma_single_data_parameter.periph_memory_width = DMA_PERIPH_WIDTH_16BIT;
    dma_single_data_parameter.direction = DMA_PERIPH_TO_MEMORY;				// transfer direction
    dma_single_data_parameter.number = ADC_BUF_LEN;							// transfer length
	
    dma_single_data_parameter.priority = DMA_PRIORITY_HIGH;
    dma_single_data_mode_init(DMA1, DMA_CH0, dma_single_data_parameter);
    dma_channel_subperipheral_select(DMA1, DMA_CH0, DMA_SUBPERI0);

    // 使能循环模式
    dma_circulation_enable(DMA1, DMA_CH0);
}

ADC_Conv_Start

// 启动ADC转换
void ADC_Conv_Start(void)
{
	dma_channel_enable(DMA1, DMA_CH0); // 启动DMA
	adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL); // 开启软件触发ADC转换
}

PS:
1.开启转换后,ADC采样值通过DMA直接传送到了gt_adc_val[ADC_BUF_LEN] 中。由于规则通道组是2个通道(ADC_CHANNEL_10,ADC_CHANNEL_11)。gt_adc_val[ADC_BUF_LEN] 中的存储形式如下:

gt_adc_val[0] = ADC_CHANNEL_10的值;
gt_adc_val[1] = ADC_CHANNEL_11的值;
gt_adc_val[2] = ADC_CHANNEL_10的值;
gt_adc_val[3] = ADC_CHANNEL_11的值;

2.采样值转换12位分辨率: Value = Vadc * VREFP / 4096


以上是近期使用的一些总结,后续如有需要会继续补充!

To Be Continue …

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GD32F4xx MCU ADC+DMA 多通道采样 的相关文章

  • 用J-FLASH合并两个bin文件

    目的 为什么我们需要对两个bin文件进行整合呢 这也是我写这篇文章的目的 我们来展开细谈 在我们工作或者学习中 用KEIL5进行单片机程序开发 我们都 知道单片机的程序保存在片内Flash中 正常情况下我们单片机运行的时候 只需要下载1次程
  • RT-Thread记录(十四、I/O 设备模型之ADC设备)

    RT Thread ADC 设备学习使用 目录 前言 一 ADC 采样基础 1 1 ADC 通道 1 2 ADC 分辨率 1 3 ADC 采样计算 二 ADC 设备操作函数 2 1 查找 ADC 设备 2 2 使能 关闭 ADC 通道 2
  • GD32F103调试小记(二)之USART(接收中断、接收空闲中断+DMA、发送DMA)

    前言 上篇文章摸完了GD32F103调试小记 一 之ADC DMA 接下来摸下GD32的USART DMA 数据的搬运工 CPU的好助手 USART 一种串行通信协议 说白了就是让两根线按照一定的规律去切换高低电平 根据一个单位时间内高低电
  • STM32F103ZET6 之 ADC+TIM+DMA+USART 综合实验

    1 实验目的 1 使用 TIM1 触发 ADC ADC 采集的数据通过DMA 传至内存 然后通过串口打印出采集的数据 2 学会 DMA 传输数据并将数据进行保存 3 验证ADC 的采样率与实际设置的是否相符 2 硬件资源 1 指示灯 2 A
  • STM32F407的ADC+DMA 的简单使用

    这里以ADC3通道14为例 adc h ifndef adc H define adc H include stm32f4xx conf h ADC GPIO 宏定义 define RHEOSTAT ADC GPIO PORT GPIOF
  • 关于GD32调试JLINK连接不上的问题

    最近有一个项目要用到GD32E230 然后经过了绘画原理图 PCB布线 焊接元件 再到最后一步的调试 发现用JLINK的SWD模式无论怎么也连不上 在和同事纠结了两天之后 发现了原来是PCB里面IC的封装画错了 以下把GD32和STM32官
  • Integral nonlinearity (INL) and differential nonlinearity (DNL) of data converters

    Syntax s inldnl analog digital range type s inldnl Name Value Description example s inldnl analog digital range type cal
  • STM32CubeMX—串口空闲中断+DMA接收

    一 实验说明 实验平台 STM32F103C8T6 实验内容 使用串口一空闲中断结合DMA 完成不定长数据接收 STM32的串口接收数据的方式 1 轮询接收 所谓轮询 就是在主函数中判断接收完成的标志位 举个不太恰当例子 就比如 此时你正在
  • STM32F031串口(RS485)中断+DMA发送(预备知识)

    STM32F031串口 RS485 中断 DMA发送 前言 GPIO移植过程 与F1系列的一些区别 串口 DMA 前言 最近在搞STM32F031的项目 F0系列与常用的F1系列有一定区别 在开发过程中遇到一些问题 而且花了好长花间在搜寻解
  • STM32学习笔记:adc采样得到的电压值用485发送给pc

    采用adc1的通道10 将采集到的电压值用485发送给PC显示 先上原理图 源代码见附件 这里想说的是几个要注意的问题 1 ad输入的电压经过了R42和R44进行分压 所以pc显示的电压值将会减半 2 采用这个函数进行发送数据的时候 每次都
  • ESP32-C3入门教程 基础篇(一、ADC采样)

    经过前面的折腾 设计好了自己的测试开发板 搭建好了开发环境 然后正式开始进行功能测试了 测试顺序先从简单的开始吧 一步一步来 目录 前言 1 ADC采样示例测试 1 1 DMA连续采样 1 2 单次采样 1 3 测试源码 2 ESP32 C
  • stm32f103&gd32的usb虚拟串口,打印类printer组合设备

    stm32f103 gd32的usb虚拟串口 打印类printer组合设备 TOC stm32f103 gd32的usb虚拟串口 打印类printer组合设备 由于gd32和stm32f10x系列库和usb库都可以兼任 所以选择st的usb
  • GD32的项目源码从台式机拷贝到笔记本,烧录后串口数据异常

    目录 1 问题描述 2 故障排查 3 问题分析 4 问题总结 1 问题描述 最近一个项目 需要外场调试 将台式机的源代码拷贝到笔记本中 通过笔记本烧录程序到设备中 发现串口数据异常 重新使用台式机进行烧录 则设备输出正常 2 故障排查 由于
  • GD32F405RGT6定时器固件库(所有定时器的配置(12个))

    GD32F405RGT6所有定时器的配置 GD32F4XXX系列拥有12个定时器 定时器的类型如下表 一般我们可以根据定时器的作用以及类型选取合适的定时器 在这次对GD的单片机而言我就将它所拥有的12个定时器撸了一遍 通用定时器以及高级定时
  • STM8的ADC的五种工作模式

    STM8的ADC的五种工作模式 STM8的ADC是10位的逐次比较型模拟数字转换器 多达16个多功能的输入通道 拥有5种转换模式 转换结束可产生中断 STM8 ADC的初始化顺序如下 1 AD输入通道对应的IO设置为上拉输入 2 配置AD参
  • STM32CubeMX HAL库串口+DMA+IDLE空闲中断不定长度数据接收和发送

    本文开发环境 MCU型号 STM32F103ZET6 IDE环境 MDK 5 29 代码生成工具 STM32CubeMx 5 3 0 HAL库版本 STM32Cube FW F1 V1 8 0 STM32Cube MCU Package f
  • 多核架构中的 CPU 和内存访问

    我想知道如果 例如 CPU 的 2 个核心尝试同时访问内存 通过内存控制器 一般 如何处理内存访问 实际上 当内核和启用 DMA 的 IO 设备尝试以相同方式访问时 同样适用 I think 内存控制器足够智能 可以利用地址总线并同时处理这
  • Linux驱动程序DMA传输到PC作为主机的PCIe卡

    我正在开发一个 DMA 例程 将数据从 PC 传输到 PCIe 卡上的 FPGA 我阅读了 DMA API txt 和 LDD3 ch 15 详细信息 但是 我不知道如何从 PC 到 PCIe 卡上的一致 iomem 块进行 DMA 传输
  • Linux内核设备驱动程序以DMA方式进入内核空间

    LDD3 p 453 演示dma map single使用作为参数传入的缓冲区 bus addr dma map single dev gt pci dev gt dev buffer count dev gt dma dir Q1 这个缓
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015

随机推荐

  • AT24C02芯片使用介绍

    AT24C02简介 AT24C02是一个2K位串行CMOS E2PROM 内部含有256个8位字节 有一个16字节页写缓冲器 该器件通过IIC总线接口进行操作 有专门的写保护功能 应用于AT24C02制造过程的先进CMOS技术实质上减少了器
  • 咬牙切齿的按钮

    先看效果 再看代码 查看更多 import url https fonts googleapis com css2 family Roboto wght 500 display swap root sz 9vmin on 4CAF50 of
  • ftp服务器性能对比,ftp服务器软件 性能对比

    ftp服务器软件 性能对比 内容精选 换一换 Java性能分析是鲲鹏性能分析工具的子工具 本章节以openEuler离线环境安装工具 登录 创建Guardian和分析任务 卸载工具为例 指导您快速上手Java性能优分析 由于root用户拥有
  • 机器学习毕设题目有哪些_毕设开源了,126个star,39个fork

    毕设题目 我是去年毕业的 软件工程专业 学校给的毕设题目是实现一个电影院订票系统 如图 嗯 题目一看很简单 其实就是实现一个web版的影票在线订票系统罢了 因此当天接到毕设后的我就大刀阔斧的准备开干了 技术方案选择 先说个大前提 我们学校评
  • c++动态数组(二)之allocator类

    new在灵活性上面一些局限性 以方便它将内存分配和对象构造组合在了一起 delete将内存释放和对象析构组合在一起 当分配一大块内存时 我们通常计划在这块内存上面按需构造对象 在这种情况下 我们希望内存分配和对象构造分离 这意味着我们可以分
  • Python学习之cookies及session用法

    当想利用Python在网页上发表评论的时候 需要一些账号密码登录的信息 这个时候用requests get 请求的话 账号密码全部会显示在网址上 这显然不科学 这个时候需要用post请求 可以这么理解 get是明文显示 post是非明文显示
  • cad等比例缩放快捷键_终于领会CAD缩放(放大与缩小)快捷键

    终于领会CAD缩放 放大与缩小 快捷键 日期 2019 10 09 19 15 01 浏览 9 核心提示 CAD缩放 放大与缩小 快捷键 这个非常简单 鼠标的中键也就是滚轮 双击两下中键图形会适合平面显示全部滚轮前后滚动是缩放 不需要什么快
  • error: “自定义函数XXX” must take exactly one argument

    主要问题在于 类里面的重载的二元运算符时 只需要一个参数 另一个参数由this指针传入 这里如果需要传入两个参数 需要放到类外定义 声明友元 访问私有数据和函数 如下 class myTask public myTask int a int
  • windbg remote stub方式远程调试

    windbg远程调试时 有两种方式 一种为remote session 另一种为remote stub 具体详情请google 我下面说说我在使用remote stub方式时遇到的一些困惑 按照教程 我在target machine启动了s
  • .NET C# 世界日期格式转换为yyyyMMdd

    本文分享了一个按照不同国家的语言生成相应时间格式的案例 有需要做国外网站或者多国语言网站的朋友可以参考一下 本文在引用 C DateTime ToString根据不同语言生成相应的时间格式 基础上做了一个Demo测试 旨在给更多有需要的人能
  • C++设计模式-State状态模式

    State状态模式作用 当一个对象的内在状态改变时允许改变其行为 这个对象看起来像是改变了其类 UML图如下 State类 抽象状态类 定义一个接口以封装与Context的一个特定状态相关的行为 ConcreteState类 具体状态 每一
  • Nodejs-Express框架

    1 认识Web框架 目前在Node中比较流行的Web服务器框架是express koa express早于koa出现 并且在Node社区中迅速流行起来 可以基于express快速 方便的开发自己的Web服务器 并且可以通过一些实用工具和中间
  • HttpResponse响应、render 响应、redirect 响应、JsonResponse 响应

    目录 HttpResponse介绍 常用属性 content 返回的内容 编辑 content type 返回给数据的MIME类型 status code 返回的HTTP响应状态码 render 返回网页 给网页传值 1 指名道姓方式传值
  • Mysql推荐书籍

    一 初级 1 MySQL必知必会 这本书英文原版名是很标题党的 Teach Yourself SQL in 10 Minutes 却是最好的数据库入门书 在Amazon上长期排在数据库销售榜首 建议想快速了解数据库原理和MySQL的新手阅读
  • sklearn机器学习:多项式朴素贝叶斯MultinomialNB

    多项式朴素贝叶斯MultinomialNB 多项式贝叶斯可能是除了高斯之外 最为人所知的贝叶斯算法了 它也是基于原始的贝叶斯 论 但假设概率分布是服从一个简单多项式分布 多项式分布来源于统计学中的多项式实验 这种实验可以具体解释为 实验包括
  • DDL语句--查看表

    查看表结构是指查看数据库中已经存在的表的定义 查看表结构的语句包括DESTRIBE语句和SHOW CREATE TABLE语句 通过这两个语句 可以查看表的字段名 字段的数据类型和完整性约束条件等 这篇博客将详细讲解查看表结构的方法 1 查
  • [Unity3D] Unity3D连接安卓设备调试unity程序

    目录 一 手机开启调试模式 确保adb能检测到手机 目的 确保adb能检测到手机 通过adb devices命令能够呈现如下效果 常见问题 二 unity配置工作 目的 配置unity中Build Settings界面与Player Set
  • FRIDA + Objection 内存漫游,HOOK,anywhere

    前言 VX Ays971124 大家一起吹水加群聊天哦 Friday 是一款很优秀的HOOK工具 不用过多介绍 objection功能强大 命令众多 而且不用写一行代码 便可实现诸如内存搜索 类和模块搜索 方法hook打印参数返回值 调用栈
  • 结构体定义.h与.c文件的问题

    首先一个问题 就是结构体声明与定义的问题 不过 感觉现在的我有点弄混了 那么下面我直接来说明 最开始的编程习惯 一直是用将结构体的定义 即struct xx 这个放在 h文件里 c文件只放置相关的函数实现 不过这几天看了一本相关的数据结构的
  • GD32F4xx MCU ADC+DMA 多通道采样

    1 GD32F4xx ADC GD32F4xx 的12位ADC是一种采用逐次逼近方式的模拟数字转换器 1 1 主要特征 可配置12位 10位 8位 6位分辨率 ADC采样率 12位分辨率为2 6MSPs 10位分辨率为3 0 MSPs 分辨