野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11009|回复: 0

GD32F407 ADC双重模式 多通道 DMA配置分享

[复制链接]
发表于 2020-12-9 13:52:35 | 显示全部楼层 |阅读模式
本帖最后由 王一 于 2020-12-9 13:54 编辑

楼主使用的是GD32F407VET6,使用的是ADC0和ADC1,规则通道,采样时间为28个时间周期,转换时间为12个时间周期,得到一次有效值的时间为40个时间周期,采样时钟为21MHz.  触发方式为软件触发,触发使能必须放在ADC使能之后。

具体配置如下:


  1. uint16_t ADC_ConVal[MAX_LEN * (ADC1_CHN + ADC2_CHN)] = {0};     // ADC存储数据

  2. /**
  3.   * [url=home.php?mod=space&uid=41770]@brief[/url]   ADC初始化 采集上下行数据
  4.   * @param   None
  5.   * @retval  None
  6.   */
  7. void Adc_Init(void)
  8. {
  9.     /*=============================配置ADC对应的GPIO=============================*/
  10.     rcu_periph_clock_enable(RCU_GPIOA);     // 初始化GPIOA时钟
  11.     gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);  // PA0,PA1,PA2,PA3

  12.     /*=============================时钟使能=============================*/
  13.     rcu_periph_clock_enable(RCU_DMA1);          // 使能DMA1时钟
  14.    
  15.     rcu_periph_clock_enable(RCU_ADC0);          // 使能ADC0时钟
  16.     rcu_periph_clock_enable(RCU_ADC1);          // 使能ADC1时钟
  17.     adc_clock_config(ADC_ADCCK_PCLK2_DIV4);     // 配置ADC时钟  4分频  21MHz
  18.    
  19.     /*=============================配置ADC对应的DMA=============================*/
  20.     dma_single_data_parameter_struct  dma_single_data_parameter;
  21.    
  22.     dma_deinit(DMA1, DMA_CH0);      // 复位DMA1通道0
  23.    
  24.     dma_single_data_parameter.periph_addr = (uint32_t)(&ADC_SYNCDATA);      // ADC_SYNCDATA寄存器的地址
  25.     dma_single_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;     // 外设地址是否为增量模式
  26.     dma_single_data_parameter.memory0_addr = (uint32_t)(ADC_ConVal);        // 存储数据的地址
  27.     dma_single_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;      // 存储器地址是否为增量模式
  28.     dma_single_data_parameter.periph_memory_width = DMA_PERIPH_WIDTH_16BIT; // 半字
  29.     dma_single_data_parameter.circular_mode = DMA_CIRCULAR_MODE_ENABLE;     // 循环模式
  30.     dma_single_data_parameter.direction = DMA_PERIPH_TO_MEMORY;             // 外设到存储器
  31.     dma_single_data_parameter.number = MAX_LEN * (ADC1_CHN + ADC2_CHN);     // DMA缓存大小
  32.     dma_single_data_parameter.priority = DMA_PRIORITY_HIGH;                 // DMA优先级,高优先级
  33.     dma_single_data_mode_init(DMA1, DMA_CH0, &dma_single_data_parameter);   // 初始化
  34.    
  35.     dma_channel_enable(DMA1, DMA_CH0);          // 使能DMA通道
  36.    
  37.     adc_deinit();      // 复位ADC

  38.     /*=============================配置ADC=============================*/
  39.     adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 2);        // 通道数2
  40.     adc_channel_length_config(ADC1, ADC_REGULAR_CHANNEL, 2);        // 通道数2
  41.    
  42.     adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_28);
  43.     adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_1, ADC_SAMPLETIME_28);
  44.     adc_regular_channel_config(ADC1, 0, ADC_CHANNEL_2, ADC_SAMPLETIME_28);
  45.     adc_regular_channel_config(ADC1, 1, ADC_CHANNEL_3, ADC_SAMPLETIME_28);
  46.    
  47.     adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);           // 右对齐
  48.     adc_data_alignment_config(ADC1, ADC_DATAALIGN_RIGHT);           // 右对齐
  49.    
  50.     adc_sync_mode_config(ADC_DAUL_REGULAL_PARALLEL);
  51.     adc_sync_dma_config(ADC_SYNC_DMA_MODE0);
  52.     adc_sync_dma_request_after_last_enable();
  53.    
  54.     adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);       // 扫描模式
  55.     adc_special_function_config(ADC1, ADC_SCAN_MODE, ENABLE);       // 扫描模式
  56.    
  57.     adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE); // 连续模式
  58.     adc_special_function_config(ADC1, ADC_CONTINUOUS_MODE, ENABLE); // 连续模式
  59.    
  60.     adc_enable(ADC0);
  61.    
  62.     delay_1ms(1);

  63.     adc_calibration_enable(ADC0);
  64.    
  65.     adc_enable(ADC1);
  66.    
  67.     delay_1ms(1);
  68.    
  69.     adc_calibration_enable(ADC1);
  70.    
  71.     adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
  72.     adc_software_trigger_enable(ADC1, ADC_REGULAR_CHANNEL);
  73. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-20 11:45 , Processed in 0.036950 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表