打印

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

[复制链接]
4627|47
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 〽️〽️〽️ 于 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 | 只看该作者
代码看起来似乎没有问题,你可以先试试换成内部通道看看,比如内部温度,看看采样值有数据吗

使用特权

评论回复
评论
jlnjkbjhcvfgcfg 2024-2-28 16:17 回复TA
我也是同样的问题,内部温度也都是0 
板凳
p19920302| | 2020-9-29 17:14 | 只看该作者
遇到了同样的问题 不管有没有电压输入,读到的ADC采样值至一直是1810左右

使用特权

评论回复
地板
yu67678| | 2020-9-30 16:21 | 只看该作者
p19920302 发表于 2020-9-29 17:14
遇到了同样的问题 不管有没有电压输入,读到的ADC采样值至一直是1810左右

你好,请问你解决了没有

使用特权

评论回复
5
搬砖的小蚂蚁| | 2020-10-22 10:20 | 只看该作者
我的也是碰到这个问题,adc_special_function_config(ADC_CONTINUOUS_MODE,ENABLE)改成disable是一个固定的值,enable时就是0,楼主问题解决了吗?

使用特权

评论回复
评论
jlnjkbjhcvfgcfg 2024-2-28 16:17 回复TA
请问解决了吗 
6
castle520| | 2020-11-5 22:44 | 只看该作者
试试关闭ADC校准,有可能是校准没跑过去,然后依次debug检查ADC的寄存器和DMA的寄存器,看看是ADC没有正常工作还是DMA传输异常

使用特权

评论回复
7
小景报到| | 2021-6-21 23:49 | 只看该作者
遇到同样问题,目前的解决方案是采用如下代码正常
    /* ADC contineous function enable */
    adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE,ENABLE );
    /* ADC scan mode disable */
    adc_special_function_config(ADC0, ADC_SCAN_MODE, DISABLE);

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

使用特权

评论回复
评论
2452986631 2024-3-15 21:38 回复TA
@jlnjkbjhcvfgcfg :如果你使用的是软件触发ADC,那么的软件触发那个函数adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);放在 adc_enable(ADC0);函数后面,否则你的连续模式读取到的数据就是0; 
2452986631 2024-3-15 21:37 回复TA
@jlnjkbjhcvfgcfg :我使用一切正常啊。 
jlnjkbjhcvfgcfg 2024-2-28 16:18 回复TA
你好,我disable以后依然是0,请问你解决了吗 
8
youtome| | 2024-3-6 07:13 | 只看该作者
检查你的DMA配置是否正确              

使用特权

评论回复
9
sesefadou| | 2024-3-7 11:19 | 只看该作者
检查是否有其他任务或中断干扰了ADC或DMA的正常工作

使用特权

评论回复
10
albertaabbot| | 2024-3-7 14:13 | 只看该作者
ADC的采样时间呢?              

使用特权

评论回复
11
jackcat| | 2024-3-7 21:22 | 只看该作者
DMA配置是否正确,包括传输模式、数据方向、缓冲区大小等。

使用特权

评论回复
12
kmzuaz| | 2024-3-7 23:20 | 只看该作者
如果使用中断来触发DMA传输完成,确保相关中断已经正确配置和使能。

使用特权

评论回复
13
bestwell| | 2024-3-8 20:25 | 只看该作者
检查软件代码中是否存在逻辑错误,比如DMA传输的内存地址是否被正确设置,是否有其他程序干扰了ADC或DMA的工作。

使用特权

评论回复
14
biechedan| | 2024-3-9 19:43 | 只看该作者
代码中添加日志记录,以监视ADC和DMA的状态和值

使用特权

评论回复
15
yorkbarney| | 2024-3-10 07:49 | 只看该作者
检查您的ADC输入通道是否正确连接

使用特权

评论回复
16
abotomson| | 2024-3-10 15:39 | 只看该作者
ADC的输入引脚正确连接,并且电压在ADC的测量范围内。

使用特权

评论回复
17
earlmax| | 2024-3-11 15:03 | 只看该作者
。如果ADC转换还没有完成就开始DMA传输,可能会导致错误的数据显示。

使用特权

评论回复
18
pentruman| | 2024-3-11 16:57 | 只看该作者
检查ADC和DMA之间的连接是否正确。确保ADC的输出数据寄存器(ADC_DR)与DMA的源地址寄存器(DMA_SAR)和目标地址寄存器(DMA_DAR)之间的连接正确。

使用特权

评论回复
19
modesty3jonah| | 2024-3-11 18:50 | 只看该作者
检查ADC的配置是否正确,包括采样时间、转换率、通道选择等。确保ADC的配置符合实际需求。

使用特权

评论回复
20
hudi008| | 2024-3-11 21:14 | 只看该作者
ADC通道、采样时间、参考电压等参数已经被正确配置。

使用特权

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

本版积分规则

51

主题

375

帖子

2

粉丝