OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5384|回复: 1

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

[复制链接]

10

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1552
金钱
1552
注册时间
2017-10-9
在线时间
131 小时
发表于 2020-12-9 13:56:27 | 显示全部楼层 |阅读模式
本帖最后由 千湖 于 2020-12-9 13:57 编辑

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

具体配置如下:
  1. <font size="5">uint16_t ADC_ConVal[MAX_LEN * (ADC1_CHN + ADC2_CHN)] = {0};     // ADC存储数据

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

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

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




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2020-5-1
在线时间
9 小时
发表于 2022-2-14 21:07:05 | 显示全部楼层
您好,我使用的GD32F450, 也是这么配置的,但是采集的ADC值不对的
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 03:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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