问答

汇集网友智慧,解决技术难题

21ic问答首页 - GD32F103RET AD规则同步模式遇到了奇葩问题,求指教。

DMA ig dc ADC gd32F103 AD

GD32F103RET AD规则同步模式遇到了奇葩问题,求指教。

        本人使用GD32F103RET AD规则同步模式采样两路电流值,配置ADC1为外部触发,ADC0为软件触发。为什么外部触发和软件触发需要配置两遍才能生效?代码如下,最后四行为ADC1的触发源配置和ADC0的软件触发使能,需要相同的代码写两遍。如果只写一遍,功能不可用,有没有哪位大神能解释一下?万分感谢void ADC_init(void)
{
    rcu_periph_clock_enable(RCU_GPIOC);
    rcu_periph_clock_enable(RCU_GPIOA);  
    rcu_periph_clock_enable(RCU_DMA0);

    rcu_periph_clock_enable(RCU_ADC0);
    rcu_periph_clock_enable(RCU_ADC1);
    rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8);//72M 9M   

    gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_2 | GPIO_PIN_3);
                gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_3);

    dma_parameter_struct dma_data_parameter;
    dma_deinit(DMA0, DMA_CH0);
    dma_data_parameter.periph_addr  = (uint32_t)(&ADC_RDATA(ADC0));
    dma_data_parameter.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;
    dma_data_parameter.memory_addr  = (uint32_t)(adc_value);
    dma_data_parameter.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;
    dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_32BIT;
    dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_32BIT;
    dma_data_parameter.direction    = DMA_PERIPHERAL_TO_MEMORY;
    dma_data_parameter.number       = 2;
    dma_data_parameter.priority     = DMA_PRIORITY_HIGH;  
    dma_init(DMA0, DMA_CH0, &dma_data_parameter);
    dma_circulation_enable(DMA0, DMA_CH0);
    dma_channel_enable(DMA0, DMA_CH0);        

    adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
                adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);
    adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);               
    adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
    adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 2);
    adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_12, ADC_SAMPLETIME_239POINT5);
    adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_12, ADC_SAMPLETIME_239POINT5);
    adc_dma_mode_enable(ADC0);
               
               
    adc_special_function_config(ADC1, ADC_SCAN_MODE, ENABLE);
    adc_special_function_config(ADC1, ADC_CONTINUOUS_MODE, ENABLE);
    adc_external_trigger_source_config(ADC1, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
    adc_data_alignment_config(ADC1, ADC_DATAALIGN_RIGHT);               
    adc_channel_length_config(ADC1, ADC_REGULAR_CHANNEL, 2);
    adc_regular_channel_config(ADC1, 0, ADC_CHANNEL_13, ADC_SAMPLETIME_239POINT5);
    adc_regular_channel_config(ADC1, 1, ADC_CHANNEL_3, ADC_SAMPLETIME_239POINT5);
               

    adc_mode_config(ADC_DAUL_REGULAL_PARALLEL);       

    adc_enable(ADC0);
                delay_1ms(1);
    adc_calibration_enable(ADC0);
    adc_enable(ADC1);   
                delay_1ms(1);
    adc_calibration_enable(ADC1);

                adc_external_trigger_config(ADC1, ADC_REGULAR_CHANNEL, ENABLE);
                adc_external_trigger_config(ADC1, ADC_REGULAR_CHANNEL, ENABLE);
                adc_software_trigger_enable(ADC0,ADC_REGULAR_CHANNEL);
                adc_software_trigger_enable(ADC0,ADC_REGULAR_CHANNEL);

回答 +关注 16
1170人浏览 2人回答问题 分享 举报
2 个回答

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