GD32F130,DMA方式读ADC一直0x0000,电压实际一直有变

[复制链接]
7933|48
 楼主| 〽️〽️〽️ 发表于 2020-7-13 12:29 | 显示全部楼层 |阅读模式
本帖最后由 〽️〽️〽️ 于 2020-7-13 12:30 编辑

uint16_t adc_value;

//ADC脚是 PA3


int main(void)
{
   //......时钟配置
   //......初始化其他配置
   recv_config();
   while(1)
   {
       while (RESET == dma_flag_get(DMA_CH0, DMA_FLAG_FTF)){;}
       if(adc_value>100)
       {
           //ADC值一直是0x0000
       }
       //.....LED周期闪正常
    }
}


void  recv_config(void)
{
          rcu_config();
          gpio_config();
          dma_config();
          adc_config();
}



void rcu_config(void)
{
    /* enable GPIOC clock */
    rcu_periph_clock_enable(RCU_GPIOA);
          /* enable DMA clock */
    rcu_periph_clock_enable(RCU_DMA);
    /* enable ADC clock */
    rcu_periph_clock_enable(RCU_ADC);
    /* config ADC clock */
    rcu_adc_clock_config(RCU_ADCCK_APB2_DIV6);
}



void gpio_config(void)
{
    /* config the GPIO as analog mode */
    gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_3);
}



void dma_config(void)
{
    /* ADC_DMA_channel configuration */
    dma_deinit(DMA_CH0);
    dma_periph_address_config(DMA_CH0,(uint32_t)(&ADC_RDATA));
    dma_memory_address_config(DMA_CH0,(uint32_t)(&adc_value));
    dma_transfer_direction_config(DMA_CH0,DMA_PERIPHERAL_TO_MEMORY);
    dma_memory_width_config(DMA_CH0,DMA_MEMORY_WIDTH_16BIT);
    dma_periph_width_config(DMA_CH0,DMA_PERIPHERAL_WIDTH_16BIT);
    dma_priority_config(DMA_CH0,DMA_PRIORITY_HIGH);
    dma_transfer_number_config(DMA_CH0,1);
    dma_periph_increase_disable(DMA_CH0);
    dma_memory_increase_enable(DMA_CH0);
    dma_circulation_enable(DMA_CH0);
    dma_channel_enable(DMA_CH0);
}



void adc_config(void)
{
       /* ADC channel length config */
    adc_channel_length_config(ADC_REGULAR_CHANNEL,1);
    /* ADC regular channel config */
    adc_regular_channel_config(0,ADC_CHANNEL_3,ADC_SAMPLETIME_55POINT5);
    /* ADC external trigger enable */
    adc_external_trigger_config(ADC_REGULAR_CHANNEL,ENABLE);
    /* ADC external trigger source config */
    adc_external_trigger_source_config(ADC_REGULAR_CHANNEL,ADC_EXTTRIG_REGULAR_SWRCST);
    /* ADC data alignment config */
    adc_data_alignment_config(ADC_DATAALIGN_RIGHT);
    /* enable ADC interface */
    adc_enable();
    /* ADC calibration and reset calibration */
    adc_calibration_enable();
    /* ADC DMA function enable */
    adc_dma_mode_enable();
    /* ADC contineous function enable */
    adc_special_function_config(ADC_CONTINUOUS_MODE,ENABLE);
    /* ADC software trigger enable */
    adc_software_trigger_enable(ADC_REGULAR_CHANNEL);
}
sonicll 发表于 2020-7-14 09:25 | 显示全部楼层
代码看起来似乎没有问题,你可以先试试换成内部通道看看,比如内部温度,看看采样值有数据吗

评论

我也是同样的问题,内部温度也都是0  发表于 2024-2-28 16:17
p19920302 发表于 2020-9-29 17:14 | 显示全部楼层
遇到了同样的问题 不管有没有电压输入,读到的ADC采样值至一直是1810左右
yu67678 发表于 2020-9-30 16:21 | 显示全部楼层
p19920302 发表于 2020-9-29 17:14
遇到了同样的问题 不管有没有电压输入,读到的ADC采样值至一直是1810左右

你好,请问你解决了没有
搬砖的小蚂蚁 发表于 2020-10-22 10:20 | 显示全部楼层
我的也是碰到这个问题,adc_special_function_config(ADC_CONTINUOUS_MODE,ENABLE)改成disable是一个固定的值,enable时就是0,楼主问题解决了吗?

评论

请问解决了吗  发表于 2024-2-28 16:17
castle520 发表于 2020-11-5 22:44 来自手机 | 显示全部楼层
试试关闭ADC校准,有可能是校准没跑过去,然后依次debug检查ADC的寄存器和DMA的寄存器,看看是ADC没有正常工作还是DMA传输异常
小景报到 发表于 2021-6-21 23:49 | 显示全部楼层
遇到同样问题,目前的解决方案是采用如下代码正常
  1.     /* ADC contineous function enable */
  2.     adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE,ENABLE );
  3.     /* ADC scan mode disable */
  4.     adc_special_function_config(ADC0, ADC_SCAN_MODE, DISABLE);

目前不清楚为什么SCAN需要disable,怪的很...

评论

@jlnjkbjhcvfgcfg :如果你使用的是软件触发ADC,那么的软件触发那个函数adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);放在 adc_enable(ADC0);函数后面,否则你的连续模式读取到的数据就是0;  发表于 2024-3-15 21:38
@jlnjkbjhcvfgcfg :我使用一切正常啊。  发表于 2024-3-15 21:37
你好,我disable以后依然是0,请问你解决了吗  发表于 2024-2-28 16:18
youtome 发表于 2024-3-6 07:13 | 显示全部楼层
检查你的DMA配置是否正确              
sesefadou 发表于 2024-3-7 11:19 | 显示全部楼层
检查是否有其他任务或中断干扰了ADC或DMA的正常工作
albertaabbot 发表于 2024-3-7 14:13 | 显示全部楼层
ADC的采样时间呢?              
jackcat 发表于 2024-3-7 21:22 | 显示全部楼层
DMA配置是否正确,包括传输模式、数据方向、缓冲区大小等。
kmzuaz 发表于 2024-3-7 23:20 | 显示全部楼层
如果使用中断来触发DMA传输完成,确保相关中断已经正确配置和使能。
bestwell 发表于 2024-3-8 20:25 | 显示全部楼层
检查软件代码中是否存在逻辑错误,比如DMA传输的内存地址是否被正确设置,是否有其他程序干扰了ADC或DMA的工作。
biechedan 发表于 2024-3-9 19:43 | 显示全部楼层
代码中添加日志记录,以监视ADC和DMA的状态和值
yorkbarney 发表于 2024-3-10 07:49 | 显示全部楼层
检查您的ADC输入通道是否正确连接
abotomson 发表于 2024-3-10 15:39 | 显示全部楼层
ADC的输入引脚正确连接,并且电压在ADC的测量范围内。
earlmax 发表于 2024-3-11 15:03 | 显示全部楼层
。如果ADC转换还没有完成就开始DMA传输,可能会导致错误的数据显示。
pentruman 发表于 2024-3-11 16:57 | 显示全部楼层
检查ADC和DMA之间的连接是否正确。确保ADC的输出数据寄存器(ADC_DR)与DMA的源地址寄存器(DMA_SAR)和目标地址寄存器(DMA_DAR)之间的连接正确。
modesty3jonah 发表于 2024-3-11 18:50 | 显示全部楼层
检查ADC的配置是否正确,包括采样时间、转换率、通道选择等。确保ADC的配置符合实际需求。
hudi008 发表于 2024-3-11 21:14 | 显示全部楼层
ADC通道、采样时间、参考电压等参数已经被正确配置。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

378

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部