本文章介绍ADC多通道采集DMA进行传输,并且在任务中实时去获取数据。

一、时钟配置

分别配置GPIO、ADC、DMA时钟

static void SystemClock_Configration(void)
{rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_GPIOB);rcu_periph_clock_enable(RCU_GPIOC);rcu_periph_clock_enable(RCU_GPIOD);rcu_periph_clock_enable(RCU_GPIOF);rcu_periph_clock_enable(RCU_CFGCMP);rcu_periph_clock_enable(RCU_PMU);rcu_periph_clock_enable(RCU_ADC);rcu_adc_clock_config(RCU_ADCCK_APB2_DIV2);  // 主频108M ADCCLK = PCLK2/2 = 27Mrcu_periph_clock_enable(RCU_DMA);
}

二、GPIO配置

配置对应ADC通道GPIO为模拟输入模式

static void AdcGpioConfigration(void)
{gpio_deinit(GPIOA | GPIOB | GPIOC | GPIOD | GPIOF);gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_1);   gpio_mode_set(GPIOC, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_4);   gpio_mode_set(GPIOB, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_0); gpio_mode_set(GPIOC, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_0);     gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_4);   gpio_mode_set(GPIOC, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_5);   gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_5);    gpio_mode_set(GPIOC, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_3);     gpio_mode_set(GPIOC, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_2);       gpio_mode_set(GPIOC, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_1);     gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_6);   gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_7);    gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_2);     gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_3);   gpio_mode_set(GPIOB, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_1);
}

三、ADC配置

static void AdcConfiguration(void)
{/* reset ADC */adc_deinit();/* ADC channel length config */adc_channel_length_config(ADC_REGULAR_CHANNEL, ADC_LENGTH);/* ADC regular channel config */adc_regular_channel_config(0, ADC_CHANNEL_1,  ADC_SAMPLETIME_71POINT5);adc_regular_channel_config(1, ADC_CHANNEL_14, ADC_SAMPLETIME_71POINT5);adc_regular_channel_config(2, ADC_CHANNEL_8,  ADC_SAMPLETIME_71POINT5);adc_regular_channel_config(3, ADC_CHANNEL_10, ADC_SAMPLETIME_71POINT5);adc_regular_channel_config(4, ADC_CHANNEL_4,  ADC_SAMPLETIME_71POINT5);adc_regular_channel_config(5, ADC_CHANNEL_15, ADC_SAMPLETIME_71POINT5);adc_regular_channel_config(6, ADC_CHANNEL_5,  ADC_SAMPLETIME_71POINT5);adc_regular_channel_config(7, ADC_CHANNEL_13, ADC_SAMPLETIME_71POINT5);adc_regular_channel_config(8, ADC_CHANNEL_12, ADC_SAMPLETIME_71POINT5);adc_regular_channel_config(9, ADC_CHANNEL_11, ADC_SAMPLETIME_71POINT5);adc_regular_channel_config(10, ADC_CHANNEL_6, ADC_SAMPLETIME_71POINT5);adc_regular_channel_config(11, ADC_CHANNEL_7, ADC_SAMPLETIME_71POINT5);adc_regular_channel_config(12, ADC_CHANNEL_2, ADC_SAMPLETIME_71POINT5);adc_regular_channel_config(13, ADC_CHANNEL_3, ADC_SAMPLETIME_71POINT5);adc_regular_channel_config(14, ADC_CHANNEL_9, ADC_SAMPLETIME_71POINT5);/* ADC external trigger enable */adc_external_trigger_config(ADC_REGULAR_CHANNEL, ENABLE);/* ADC external trigger source config */adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_NONE);/* ADC data alignment config */adc_data_alignment_config(ADC_DATAALIGN_RIGHT);/* ADC SCAN & CONTINUOUS function enable */adc_special_function_config(ADC_SCAN_MODE, ENABLE);//  adc_special_function_config(ADC_CONTINUOUS_MODE, ENABLE);       //auto repeat sample/* ADC DMA function enable */adc_dma_mode_enable();/* enable ADC interface */adc_enable();/* ADC calibration and reset calibration */adc_calibration_enable(); /* enable ADC software trigger */adc_software_trigger_enable(ADC_REGULAR_CHANNEL);
}

四、DMA配置

static void AdcDmaConfiguration(void)
{dma_parameter_struct dma_init_struct;/* initialize DMA channel0 */dma_deinit(DMA_CH0);dma_init_struct.direction    = DMA_PERIPHERAL_TO_MEMORY;dma_init_struct.memory_addr  = (uint32_t )adc_dma;//此处为我们定义的数组地址dma_init_struct.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT;dma_init_struct.number       = ADC_LENGTH;dma_init_struct.periph_addr  = (uint32_t) & (ADC_RDATA);dma_init_struct.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;dma_init_struct.priority     = DMA_PRIORITY_ULTRA_HIGH;dma_init(DMA_CH0, &dma_init_struct);/* clear DMA a channel flag */dma_interrupt_flag_clear(DMA_CH0, DMA_INT_FTF);/* channel transfer finish interrupt */dma_interrupt_enable(DMA_CH0, DMA_INT_FTF);/* configure DMA mode */dma_circulation_enable(DMA_CH0);//循环模式dma_memory_to_memory_disable(DMA_CH0);/* enable DMA channel0 */dma_channel_enable(DMA_CH0);
}
static void AdcNvicConfiguration(void) //中断等级配置
{nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);nvic_irq_enable(DMA_Channel0_IRQn, 5, 0);
}
void DMA_Channel0_IRQHandler()
{if(dma_interrupt_flag_get(DMA_CH0, DMA_INT_FTF) != RESET){dma_interrupt_flag_clear(DMA_CH0, DMA_INT_FTF);AdcStartSampling(); //每次传输完成后立马又软件触发采集}
}

五、主函数代码

#define ADC_LENGTH 15 //ADC通道数量
static uint16_t adc_dma[ADC_LENGTH];uint16_t GetAdcValue(uint8_t channel)//获取对应通道ADC值
{return adc_dma[channel];
}
void AdcInitialize(void) //初始化所有ADC相关配置
{SystemClock_Configration();AdcGpioConfigration();AdcConfiguration();AdcDmaConfiguration();AdcNvicConfiguration();
}
int main(void)
{AdcInitialize();taskENTER_CRITICAL();          xTaskCreate(AdcDebugTask1,"AdcDebugTask1",128,NULL,1,NULL);taskEXIT_CRITICAL();  while(1){    }
}
void AdcDebugTask1(void * pvParameters)
{while(1){for(int i = 0;i < 15;i++){arr_adc[i] = GetAdcValue(i);}    }
}

六、仿真验证

【GD32】FreeRTOS-ADC-DMA采集相关推荐

  1. STM32f103 ADC+DMA采集NTC热敏电阻温度10K(3950)

    利用ADC+DMA采集 计算,查表(T-R表:百度) /*---------------------------------------ntc.h--------------------------- ...

  2. 晓宇姐姐带你软硬结合,感受下ADC DMA采集多路电压电流

    在我们的电子设计中,经常需要对外部的模拟量进行采集,如一些传感器的输出量,电位器的旋转量等等,特别是电压电流的采集可以说是家常便饭,这些都离不开MCU最常用的外设,ADC,它可以将模拟量转换为数字量, ...

  3. STM32F030 多通道ADC DMA采集

    利用STM32F030C8T6的PA0和PA1引脚来进行两通道ADC采集,通过DMA方式.直接上代码. 1.ADC的GPIO引脚配置 void ADC_GPIO_Config(void) {      ...

  4. dma和通道的区别_STM32 定时器触发 ADC 多通道采集,DMA搬运至内存

    引言 ADC 的功能是将模拟信号采样得到数字信号,而有些时候,我们需要使用到定时采样,比如在计算一个采集的波形的频率的时候,我们需要精确的知道采样频率,也就是 1 s 内采集的点数,这个时候,就需要使 ...

  5. STM32F4 ADC+DMA单通道采集

    背景:对锂电池电压进行采集,由于电池电压为12V,已经提前对12V进行分压,保证ADC采集电压的范围为0~3.3V.对电池电压的采集不用太过频繁,循环模式下的ADC+DMA对一直采集电压浪费资源.于是 ...

  6. STM32使用ADC+DMA进行多通道模拟量采集 (踩坑及傻瓜式解析)

    STM32使用ADC+DMA进行多通道模拟量采集 (踩坑及通俗解析) ​ 利用STM32的片上外设可采集多个模拟量(如传感器数值),并在嵌入式程序中使用.如果只使用了一个通道,用时令ADC转换而后读取 ...

  7. GD32 Timer+ADC多通道+DMA+PWM调试记录

    本例记录使用GD32307C开发板,实现以内部Timer1 CH1为触发源,触发ADC0的两个通道,进行并行非连续采样,病通过DMA传输采样结果.同时输出PWM,用来检测Timer1 CH1的触发周期 ...

  8. STM32HAL ADC+TIM+DMA采集交流信号 基于cubemx

    ADC+TIM+DMA采集交流 前言 本文主要讲解定时器触发ADC去采集交流信号,DMA把数据搬移到内存. 所需工具: 开发板:STM32F103C8T6 STM32CubeMX IDE: Keil- ...

  9. 基于STM32的ADC电压采集(DMA传输)

    我最近在写stm32的adc电压采集过程中遇到了一些问题,这些问题或许对stm32初学者入手adc有所帮助. 对adc采集到的数据进行均值滤波处理,新建一个数组ADC_ConvertedValue_1 ...

  10. STM32L0开发——ADC多通道采集,IDE和IAR开发注意事项

    keil开发L0系列是免费的,官方提供许可的.因此建议Keil开发, L011F3由于flash只有8K,因此不建议HAL库,建议使用cubemx+LL(或snippets库). 0.起初,可以参考官 ...

最新文章

  1. HTML5----CSS显示半个字符
  2. as3 内容自适应容器大小
  3. 市场需求才是比特币优化的参考标准
  4. Scratch-介绍“克隆”
  5. CF924D. Contact ATC
  6. ado.net mysql 连接池_ADO.NET数据连接池
  7. ‘MIX_INIT_MP3’ was not declared in this scope,这是什么情况?
  8. 第1章 Ext JS介绍与快速入门[2/4]
  9. 在Microsoft Workflow Foundation中晃荡了两天
  10. 操作系统原理实验报告——进程控制与描述
  11. java日期函数_java常用日期函数总结
  12. 【学习笔记】吉司机线段树
  13. 竞业限制没有明确说明哪家公司,是否会违反?
  14. DNS域名详细解析过程(最全面,看这一篇就够)
  15. Csdn视频第二十期 : 测试工具与流程讨论
  16. | Element 详情
  17. 基础的拉普拉斯金字塔融合用于改善图像增强中易出现的过增强问题(一)
  18. 2021-11-16施努卡:机器视觉集成系统(机器视觉图像处理系统包括)
  19. 常用的时间系统有哪些?
  20. 连续16年稳居领导者象限,Aruba靠什么领跑有线和无线LAN市场?

热门文章

  1. springboot搭建和优缺点
  2. 腾讯微博android版本,腾讯微博下载2021-腾讯微博app最新版本下载-腾讯微博下载安装...
  3. python游戏开发步骤_【原创】python制作游戏脚本之网游寻址及64位程序的模块遍历(视频已安排)...
  4. 【Python爬虫】爬取酷狗TOP500的数据
  5. 分块查找 转载自https://www.cnblogs.com/Ming8006/p/8330481.html
  6. ESP8266-Arduino编程实例-ADXL345三轴加速计驱动
  7. 【ko-time】核心代码解析笔记
  8. 成人大专和全日制大专的区别在哪里
  9. 判断一个数是否为玫瑰花数
  10. 面试被问到微信钉钉的群人数为什么要设上限,懵了。。