打印

新手求救,ADC和DMA

[复制链接]
538|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
goldsunking|  楼主 | 2021-3-3 20:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ADC, DMA, pi, IO, gp
我在学习GD32F407芯片的编码,网上没有找到合适的代码学习,对照手册编写了ADC扫描模式DMA传输的代码,没有成功,我想传送4个AD数据,可是缓冲区得到两个数据,ADC状态寄存器报告溢出错误。
请教各位,我的代码问题在哪里,谢谢。
还有,哪个可以找到GD32F407实例代码,不想用库函数板,感觉不舒服。
代码如下:
uint32_t ADC2Array[4][4];

//设置PC0\PC1\PC2\PC3为模拟通道10,模拟通道11,模拟通道12,模拟通道13,
void ADC_Init_Config_with_DMA(void)
{
        uint32_t nStatus;
        uint32_t ADValue[16];
        uint32_t i;

        rcu_periph_clock_enable(RCU_GPIOC);
        gpio_mode_set(GPIOC, GPIO_MODE_ANALOG, GPIO_PUPD_NONE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);

        //enable adc clock
        rcu_periph_clock_enable(RCU_ADC1);
       
        //reset adc
        rcu_periph_reset_enable(RCU_ADCRST);
        rcu_periph_reset_disable(RCU_ADCRST);

        //set adc clock =10M
        //pclk/n       
        adc_clock_config(ADC_ADCCK_HCLK_DIV20);
               
        ADC_CTL0(ADC1)=0;
        ADC_CTL1(ADC1)=0;
       
        //set sample time 15
        ADC_SAMPT0(ADC1) |=1+(1<<3)+(1<<6)+(1<<9);

        adc_enable(ADC1);
        /* wait for ADC stability */
        //delay_1ms();
        for(i=0;i<5000;i++);
        /* ADC calibration and reset calibration */
        adc_calibration_enable(ADC1);
       
        //Scan mode enable
    ADC_CTL0(ADC1)|=1<<8;
        //DMA enable
        ADC_CTL1(ADC1) |=1<<8;

        ADC_RSQ2(ADC1) =0;
        ADC_RSQ2(ADC1) |=10+(11<<5)+(12<<10)+(13<<15);
        ADC_RSQ0(ADC1) |=3<<20;
       
        ADC2_config_DMA();
}

void ADC1_config_DMA(void)
{
        rcu_periph_clock_enable(RCU_DMA1);

        dma_deinit(DMA1,DMA_CH2);

        DMA_CHCTL(DMA1,DMA_CH2) |=(0<<6);               
       
        DMA_CHCTL(DMA1,DMA_CH2) |=(1<<25);        //ch2,第一个设备       
       
        DMA_CHCTL(DMA1,DMA_CH2) |=(0<<23);               
       
        DMA_CHCTL(DMA1,DMA_CH2) |=(0<<21);               
       
        DMA_CHCTL(DMA1,DMA_CH2) |=(0<<19);               
       
        DMA_CHCTL(DMA1,DMA_CH2) |=(0<<18);               
       
        DMA_CHCTL(DMA1,DMA_CH2) |=(0x2<<16);       
       
        DMA_CHCTL(DMA1,DMA_CH2) |=(0x2<<13);       
       
        DMA_CHCTL(DMA1,DMA_CH2) |=(0x2<<11);       
       
        DMA_CHCTL(DMA1,DMA_CH2) |=(0x1<<10);       
       
        DMA_CHCTL(DMA1,DMA_CH2) |=(0x0<<9);               
       
        DMA_CHCTL(DMA1,DMA_CH2) |=(0x0<<8);               
       
        DMA_CHCTL(DMA1,DMA_CH2) |=(0x1<<5);               

       
        DMA_CHFCTL(DMA1,DMA_CH2) |=(0<<2);               

        DMA_CHCTL(DMA1,DMA_CH2) |=(0x0<<4);
       
        DMA_CHCTL(DMA1,DMA_CH2) |=(0x0<<3);
       
        DMA_CHCTL(DMA1,DMA_CH2) |=(0x0<<2);
       
        DMA_CHCTL(DMA1,DMA_CH2) |=(0x0<<1);

        DMA_CHFCTL(DMA1,DMA_CH2) |=(0<<7);

        DMA_CHPADDR(DMA1,DMA_CH2)=ADC_RDATA(ADC1);

        DMA_CHM0ADDR(DMA1,DMA_CH2) =(uint32_t) &ADC2Array[0][0];
       
        DMA_CHCNT(DMA1,DMA_CH2) =4;

        DMA_CHCTL(DMA1,DMA_CH2) |=1;
}

使用特权

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

本版积分规则

18

主题

172

帖子

3

粉丝