打印

GD32H757 ADC定时器+DMA DMA的数据不更新

[复制链接]
1942|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
me860|  楼主 | 2024-5-6 02:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void ADC_rcu_config(void)
{
    /* enable GPIO clock */
    rcu_periph_clock_enable(RCU_GPIOA);

    /* enable ADC clock */
    rcu_periph_clock_enable(RCU_ADC0);
    /* enable DMA clock */
    rcu_periph_clock_enable(RCU_DMA0);
    rcu_periph_clock_enable(RCU_DMAMUX);
   
    /* enable trigsel clock */
    rcu_periph_clock_enable(RCU_TRIGSEL);
    /* enable timer1 clock */
    rcu_periph_clock_enable(RCU_TIMER1);
    rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL4);
}

/*!
    \brief      configure the GPIO peripheral
    \param[in]  none
    \param[out] none
    \retval     none
*/
void ADC_GPIO_Config(void)
{
    /* config the GPIO as analog mode */
    /*  */
    gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE,  AirPress_PIN | IExpValve_PIN);
}

/*!
    \brief      configure the TIMER peripheral
    \param[in]  none
    \param[out] none
    \retval     none
*/
void timer_config(void)
{
    timer_oc_parameter_struct timer_ocintpara;
    timer_parameter_struct timer_initpara;
   
    /* enable trigsel clock */
    rcu_periph_clock_enable(RCU_TRIGSEL);
    /* enable timer1 clock */
    rcu_periph_clock_enable(RCU_TIMER1);
    rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL4);
   
    /* TIMER1 configuration */
    timer_initpara.prescaler         = 300-1;
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 500-1;
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_initpara.repetitioncounter = 0;
    timer_init(TIMER1, &timer_initpara);

    /* CH0 configuration in PWM mode1 */
    timer_ocintpara.ocpolarity  = TIMER_OC_POLARITY_HIGH;
    timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
    timer_channel_output_config(TIMER1, TIMER_CH_1, &timer_ocintpara);

    timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_1, 100);
    timer_channel_output_mode_config(TIMER1, TIMER_CH_1, TIMER_OC_MODE_PWM1);
    timer_channel_output_shadow_config(TIMER1, TIMER_CH_1, TIMER_OC_SHADOW_DISABLE);
}
/*!
    \brief      configure the DMA peripheral
    \param[in]  none
    \param[out] none
    \retval     none
*/
void ADC_DMA_Config(void)
{
    /* ADC_DMA_channel configuration */
    dma_single_data_parameter_struct dma_single_data_parameter;

    /* ADC DMA_channel configuration */
    dma_deinit(DMA0, DMA_CH0);

    /* initialize DMA single data mode */
    dma_single_data_parameter.request = DMA_REQUEST_ADC0;
    dma_single_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(ADC0));
    dma_single_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
    dma_single_data_parameter.memory0_addr = (uint32_t)(&adc_value);
    dma_single_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
    dma_single_data_parameter.periph_memory_width = DMA_PERIPH_WIDTH_32BIT;
    dma_single_data_parameter.direction = DMA_PERIPH_TO_MEMORY;
    dma_single_data_parameter.number = 2;
    dma_single_data_parameter.priority = DMA_PRIORITY_HIGH;
    dma_single_data_mode_init(DMA0, DMA_CH0, &dma_single_data_parameter);

    /* enable DMA circulation mode 循环模式*/
    dma_circulation_enable(DMA0, DMA_CH0);

    /* enable DMA channel */
    dma_channel_enable(DMA0, DMA_CH0);
}

/*!
    \brief      configure the ADC peripheral
    \param[in]  none
    \param[out] none
    \retval     none
*/
void ADC_Config(void)
{
    /* reset ADC */
    adc_deinit(ADC0);
    /* ADC clock config */
    adc_clock_config(ADC0, ADC_CLK_SYNC_HCLK_DIV6);
    /* ADC contineous function enable */
    adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, DISABLE);
    /* ADC scan mode enable */
    adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
    /* ADC resolution config */
    adc_resolution_config(ADC0, ADC_RESOLUTION_14B);
    /* ADC data alignment config */
    adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);

    /* ADC channel length config */
    adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 2);

    /* ADC regular channel config */
    adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_15, 240);
    adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_14, 240);
   
    /* ADC trigger config */
    adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, EXTERNAL_TRIGGER_RISING);

    /* clear the ADC flag */
    adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOC);
    adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOIC);
   
   
    /* ADC DMA function enable */
    adc_dma_request_after_last_enable(ADC0);
    adc_dma_mode_enable(ADC0);

    /* enable ADC interface */
    adc_enable(ADC0);
    /* wait for ADC stability */
    LCD_delay_ms(1);
    /* ADC calibration mode config */
    adc_calibration_mode_config(ADC0, ADC_CALIBRATION_OFFSET_MISMATCH);
    /* ADC calibration number config */
    adc_calibration_number(ADC0, ADC_CALIBRATION_NUM1);
    /* ADC calibration and reset calibration */
    adc_calibration_enable(ADC0);
       

}
/*!
    \brief      configure the TRIGSEL peripheral
    \param[in]  none
    \param[out] none
    \retval     none
*/
void trigsel_config(void)
{
    trigsel_init(TRIGSEL_OUTPUT_ADC0_INSTRG, TRIGSEL_INPUT_TIMER1_CH1);
}

/**
    \brief      configure the nested vectored interrupt controller
    \param[in]  none
    \param[out] none
    \retval     none
  */
void nvic_config(void)
{
    nvic_irq_enable(ADC0_1_IRQn, 10, 0);
}

void BSP_ADC_Init(void)
{
    ADC_rcu_config();
    ADC_GPIO_Config();       
    timer_config();
    trigsel_config();
//    nvic_config();

    ADC_DMA_Config();
       
    ADC_Config();

    timer_enable(TIMER1);
}

想实现ADC的定时器触发+DMA ,配置完后,DMA的数据不更新,请坛友帮忙 看看

使用特权

评论回复
沙发
kzlzqi| | 2024-7-31 22:00 | 只看该作者
你在ADC_Config()函数中设置了外部触发,但请确保触发配置和触发源之间的匹配是正确的。

使用特权

评论回复
板凳
ym0sly| | 2024-8-31 12:16 | 只看该作者
阅读 GD32H757 的数据手册和参考手册,确保你遵循了所有的配置要求和步骤。

使用特权

评论回复
地板
classroom| | 2024-9-25 17:07 | 只看该作者
CPU和DMA之间的缓存不一致

使用特权

评论回复
5
两只袜子| | 2024-9-25 17:11 | 只看该作者
可能是硬件故障导致的

使用特权

评论回复
6
laocuo1142| | 2024-9-25 18:00 | 只看该作者
DMA配置错误

使用特权

评论回复
7
flycamelaaa| | 2024-9-25 18:26 | 只看该作者
ADC的配置参数(如分辨率、采样率、触发源等)设置不当,可能影响ADC的采样和转换结果,进而影响DMA传输的数据。

使用特权

评论回复
8
powerantone| | 2024-9-25 19:00 | 只看该作者
中断或异常处理

使用特权

评论回复
9
stormwind123| | 2024-9-25 20:23 | 只看该作者
DMA控制器或相关硬件的故障

使用特权

评论回复
10
probedog| | 2024-9-25 20:59 | 只看该作者
检查ADC的转换结果是否正确,可以使用示波器或逻辑分析仪等工具来观察ADC的模拟输入和数字输出。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

27

帖子

1

粉丝