GD32F330 | ADC案例 根据DMA方法

ADC多路变换 DMA运送 的应用

GD32F330 | ADC案例 根据DMA方法


 

  简易纪录一下 ADC多路变换 DMA运送 的应用,以 GD32F330G8U6 为例子:

 

一、基本知识

  12位 ADC 是一种选用多次靠近方法的仿真模拟数字转换器。   变换方式:     – 变换单独安全通道,或是扫描仪一序列的安全通道;     – 一次方式,每一次开启变换一次挑选的键入安全通道;     – 持续方式,持续变换所挑选的键入安全通道;     – 中断方式;     – 同歩方式(适用具备2个或好几个ADC的机器设备)。   DMA(Direct Memory Access)— 立即储存器存储,是单片机设计的一个外接设备,它的关键作用是用于搬数据信息,可是不用占有 CPU,即在传送数据的情况下,CPU 能够干别的的事儿,好像是线程同步一样。传输数据适用从外接设备到储存器或是储存器到储存器,这儿的储存器能够是 SRAM 或是是 FLASH。  

二、手机软件配备全过程

  基本安全通道变换 DMA 运送:根据ADC变换,在ADC 变换进行后 开启DMA 开展数据信息运送。

1、打开工作中数字时钟

// 1. 打开数字时钟
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_ADC);
rcu_periph_clock_enable(RCU_DMA);
rcu_adc_clock_config(RCU_ADCCK_APB2_DIV6);

 

2、GPIO 复位

  GPIO 用以 AD 变换作用务必配备为仿真模拟键入方式

// 2. GPIO配备
gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_3 | GPIO_PIN_4);

   注:ADC 的安全通道与脚位的对应关系可查看实际集成ic的数据信息指南 (Pin definitions 章节目录):

 

 

 

3、ADC 复位

  配备 ADC 方式、两端对齐方法、变换长短、取样周期时间及其开启方法这些
// 3. ADC配备
adc_deinit();
adc_special_function_config(ADC_SCAN_MODE, ENABLE);                     // 逐行扫描
adc_special_function_config(ADC_CONTINUOUS_MODE, ENABLE);               // 持续变换

adc_resolution_config(ADC_RESOLUTION_12B);
adc_data_alignment_config(ADC_DATAALIGN_RIGHT);
adc_channel_length_config(ADC_REGULAR_CHANNEL, 2);
adc_regular_channel_config(0, ADC_CHANNEL_3, ADC_SAMPLETIME_55POINT5);
adc_regular_channel_config(1, ADC_CHANNEL_4, ADC_SAMPLETIME_55POINT5);

adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_NONE);  // 手机软件开启
adc_external_trigger_config(ADC_REGULAR_CHANNEL, ENABLE);                           // 开启也就能

adc_dma_mode_enable();  // 也就能DMA接受

adc_enable();           // 也就能ADC控制模块
delay_1ms(c003);        // ADC在也就能以后必须开展短暂性的延迟,时间周期约为2ms上下,以确保ADC能一切正常运行。
adc_calibration_enable();

 

 

4、DMA 复位

  应用 DMA,最关键便是配备要传送的数据信息,包含数据信息从哪里来,要到哪里去,传送的数据信息的单位是什么,要传是多少数据信息,是一次传送或是循环系统传送这些。

  • 从哪里来到哪里去        --  DMA 传送数据的方位有三个:(1)从外接设备到储存器  (2)从储存器到外接设备 (3)从储存器到储存器
  • 要传是多少,单位是什么 --  要想传输数据恰当,源和总体目标详细地址储存的数据信息总宽一般会设成一致
  • 何时传送进行        --  传送进行分二种方式,是一次传送或是循环系统传送,一次传送非常好了解,就是传送一次以后就终止,要想再传送得话,务必关闭 DMA 也就能后再重新部署后才可以再次传送。循环系统传送则是一次传送进行以后又修复第一次传送时的配备循环系统传送,持续的反复。
// 4. DMA配备
dma_parameter_struct dma_data_parameter;

dma_deinit(DMA_CH0);
dma_data_parameter.direction = DMA_PERIPHERAL_TO_MEMORY;
dma_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA);
dma_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
dma_data_parameter.memory_addr = DstAddress;
dma_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT;
dma_data_parameter.number = DataLength;
dma_data_parameter.priority = DMA_PRIORITY_ULTRA_HIGH;
dma_init(DMA_CH0, &dma_data_parameter);
dma_circulation_enable(DMA_CH0);
dma_memory_to_memory_disable(DMA_CH0);
dma_channel_enable(DMA_CH0);

   注: DstAddress --  储存器详细地址,一般设定为大家自定储存区的首详细地址。

 

 

5、开启 ADC 变换

  打开 ADC 变换,在ADC 变换进行后 ADC 变换結果 便会储存在 DMA配备的 DstAddress 详细地址里,在大家必须 全新的 ADC 变换結果 时立即载入就可以。

adc_software_trigger_enable(ADC_REGULAR_CHANNEL);   // 打开ADC变换

 

 

三、ADC 应用常见问题

  1. ADC安全通道的收集脚位未配备为仿真模拟键入,GD32规定安全通道IO口务必配备为仿真模拟键入;
  2. ADC数字时钟过高,ADC取样数字时钟高过ADC最大取样数字时钟获得到的数据信息不具备参照实际意义,必须手动式分音器到适合的ADC 规定的頻率;
  3. ADC取样值偏小或不稳定,应当适度的减少ADC数字时钟,增加取样周期时间的值;
  4. ADC的查看法在获得ADC标值的情况下,不允许重入,即不允许在同一时间启用ADC的数据信息载入涵数
         

评论(0条)

刀客源码 游客评论