OpenEdv-开源电子网

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

GD32F450的ADC使用DMA规则采集不能获取正确的采集电压

[复制链接]

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2020-5-1
在线时间
9 小时
发表于 2022-2-14 21:25:29 | 显示全部楼层 |阅读模式
1金钱
void DMA_Config(void)
{
        dma_single_data_parameter_struct  dma_data_parameter;

        /* enable clock */
        rcu_periph_clock_enable(RCU_DMA1);
        dma_deinit(DMA1, DMA_CH0);
       
  /* set the DMA struct with the values */
        dma_data_parameter.periph_addr         =  (uint32_t)(&ADC_RDATA(ADC0));
        dma_data_parameter.periph_inc          =  DMA_PERIPH_INCREASE_DISABLE;
        //data buffer
        dma_data_parameter.memory0_addr        =  (uint32_t)(&adc_raw_val);
        dma_data_parameter.memory_inc          =  DMA_MEMORY_INCREASE_ENABLE;
        dma_data_parameter.periph_memory_width =  DMA_MEMORY_WIDTH_16BIT;
        dma_data_parameter.direction           =  DMA_PERIPH_TO_MEMORY;
        dma_data_parameter.number              =  (5* 50);
        dma_data_parameter.priority            =  DMA_PRIORITY_HIGH;
        dma_data_parameter.circular_mode       =  DMA_CIRCULAR_MODE_ENABLE;       
        dma_single_data_mode_init(DMA1, DMA_CH0, &dma_data_parameter);

        /* interrupt enable */
        nvic_irq_enable(DMA1_Channel0_IRQn, 1, 0);
        /* enable DMA transfer complete interrupt */
        dma_interrupt_enable(DMA1, DMA_CH0, DMA_CHXCTL_FTFIE);

        /* enable channe0 */
        dma_channel_enable(DMA1, DMA_CH0);
}
-------------------------------------------------------------------------------------------
void ADC_Config(void)
{       
        adc_deinit();
       
        /* adc clock enable */
        rcu_periph_clock_enable(RCU_ADC0);       
        adc_clock_config(ADC_ADCCK_PCLK2_DIV4);
       
        /* ADC mode */
        adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
        adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);
       
        /* data alignment */
        adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
        /* ADC resolution 12Bit */
        adc_resolution_config(ADC0, ADC_RESOLUTION_12B);
        /* ADC channel counts */
        adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 5);//channel counts
       
        /* ADC channel config */
        adc_regular_channel_config(ADC0,  0,  ADC_CHANNEL_4, ADC_SAMPLETIME_144); //12V
        adc_regular_channel_config(ADC0,  1,   ADC_CHANNEL_5, ADC_SAMPLETIME_144); //5V
        adc_regular_channel_config(ADC0,  2,  ADC_CHANNEL_6, ADC_SAMPLETIME_144); //3.3V
        adc_regular_channel_config(ADC0,  3,  ADC_CHANNEL_7, ADC_SAMPLETIME_144); //current
        adc_regular_channel_config(ADC0,  4,  ADC_CHANNEL_8, ADC_SAMPLETIME_144); //1.1V
       
        /* Disable ADC0 External trigger */
        adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, EXTERNAL_TRIGGER_DISABLE);
        /* extern trigger */
        //adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_T0_CH1);               
       
        /* ADC DMA enable */
        adc_dma_mode_enable(ADC0);
        adc_dma_request_after_last_enable(ADC0);
        adc_enable(ADC0);
        delay_1ms(200);
       
        /* ADC calibration */
        adc_calibration_enable(ADC0);
        adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
}

当前DMA中断后无法获取正确的电压值,哪位大神帮忙看看,配置有问题吗?谢谢!



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

使用道具 举报

14

主题

821

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2070
金钱
2070
注册时间
2021-7-17
在线时间
647 小时
发表于 2022-2-14 21:25:30 | 显示全部楼层
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2020-5-1
在线时间
9 小时
 楼主| 发表于 2022-2-14 21:30:49 | 显示全部楼层
        for(i = 0; i < (5* 50); i += 5){
                aver_sum[0] += stADC_Data.raw_val[i+0];               
                aver_sum[1] += stADC_Data.raw_val[i+1];
                aver_sum[2] += stADC_Data.raw_val[i+2];
                aver_sum[3] += stADC_Data.raw_val[i+3];
                aver_sum[4] += stADC_Data.raw_val[i+4];
                printf("[adc_%d]:%d\r\n", i, stADC_Data.raw_val[i+0]);
        }


[adc_0]:26090
[adc_5]:26346
[adc_10]:26602
[adc_15]:26858
[adc_20]:26859
[adc_25]:27116
[adc_30]:27630
[adc_35]:27374
[adc_40]:27631
[adc_45]:27630
[adc_50]:28141
[adc_55]:27114
[adc_60]:27369
[adc_65]:26858
[adc_70]:27114
[adc_75]:27370
[adc_80]:27113
[adc_85]:27625
[adc_90]:27371
[adc_95]:27115
[adc_100]:28398
[adc_105]:28910
[adc_110]:28142
[adc_115]:27630
[adc_120]:26859
[adc_125]:0
[adc_130]:0
[adc_135]:0
[adc_140]:0
[adc_145]:0
[adc_150]:0
[adc_155]:0
[adc_160]:0
[adc_165]:0
[adc_170]:0
[adc_175]:0
[adc_180]:0
[adc_185]:0
[adc_190]:0
[adc_195]:0
[adc_200]:0
[adc_205]:0
[adc_210]:0
[adc_215]:0
[adc_220]:0
[adc_225]:0
[adc_230]:0
[adc_235]:0
[adc_240]:0
[adc_245]:0
每次采集50个数据,为啥打印的值后面都是0????
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2020-5-1
在线时间
9 小时
 楼主| 发表于 2022-2-15 21:55:20 | 显示全部楼层
终于找到原因了,dma_data_parameter.periph_memory_width的赋值 不能是内存(DMA_MEMORY_WIDTH_16BIT),而是需外设地址宽度DMA_PERIPH_WIDTH_16BIT,否则默认是8bit的的宽度;
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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