求助一个F4的用DMA搬运ADC数据,ADC用定时器触发的问题

2019-07-20 13:48发布

目前的状态是:
1,已经实现了用定时器的PWM触发ADC转换,我用串口调试助手发送看了;
2,加上用DMA搬运时发送出来全是0.0000,硬件仿真后发现ADC1->DR是有数据,可以确定问题出在DMA上;
3,已经通篇看了手册关于DMA的描述,觉得配置没什么问题,为什么发出了的数据还是0.000000?下面附上代码:

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
12条回答
布沙尼神甫
2019-07-20 19:20
[mw_shl_code=applescript,true]void  Adc_Init(void)
{   
        RCC->APB2ENR|=1<<8;            //使能ADC1时钟
        RCC->AHB1ENR|=1<<0;            //使能PORTA时钟          
        GPIO_Set(GPIOA,PIN5,GPIO_MODE_AIN,0,0,GPIO_PUPD_PU);        //PA5,模拟输入,下拉   

        RCC->APB2RSTR|=1<<8;           //ADCs复位
        RCC->APB2RSTR&=~(1<<8);        //复位结束         
        ADC->CCR=1<<16;                        //ADCCLK=PCLK2/4=84/4=21Mhz,ADC时钟最好不要超过36Mhz
       
        ADC1->CR1=0;                           //CR1设置清零
        ADC1->CR2=0;                           //CR2设置清零
        ADC1->CR1|=0<<24;              //12位模式
        ADC1->CR1|=1<<8;            //非扫描模式       
        ADC1->CR2&=~(1<<1);            //单次转换模式
        ADC1->CR2&=~(1<<11);           //右对齐       
        ADC1->CR2|=3<<28;                    //硬件触发,上升和下降沿触发
//        ADC1->CR2|=7<<24;                    //TIM3_CH 触发
        ADC1->CR2|=8<<24;                    //TIM3_TRGO 触发
        ADC1->CR2|=1<<8;                    //开DMA
       
        ADC1->SQR1&=~(0XF<<20);        //通道选择,设置转换总数
        ADC1->SQR1&=0<<20;             //1个转换在规则序列中 也就是只转换规则序列1                           
        //设置通道5的采样时间
        ADC1->SMPR2&=~(7<<(3*5));//通道5采样时间清空          
        ADC1->SMPR2|=0<<(3*5);         //通道5  3个周期,提高采样时间可以提高精确度         
       
        ADC1->SQR3|=0x05;                                //将通道5放入规则序列1中
       
        ADC1->CR2|=1<<0;                           //开启AD转换器          
        ADC1->CR2|=1<<30;                          //启动规则转换通道

}
void ADC_DMA_init(u32 mar,u16 ndtr)
{
                RCC->AHB1ENR|=1<<22;        //DMA2时钟使能
                delay_ms(5);
                DMA2_Stream4->PAR=(u32)&(ADC1->DR);         //DMA外设地址
    DMA2_Stream4->M0AR=mar;       //DMA 存储器0地址
    DMA2_Stream4->NDTR=ndtr;      //DMA 存储器0地址
    DMA2_Stream4->CR=0;           //先全部复位CR寄存器值

                DMA2_Stream4->CR&=0<<6;        //存储器到外设模式
    DMA2_Stream4->CR|=1<<8;        //循环模式
    DMA2_Stream4->CR&=0<<9;        //外设非增量模式
    DMA2_Stream4->CR|=1<<10;       //存储器增量模式
    DMA2_Stream4->CR|=1<<11;       //外设存储器长度:16位                /*不确定,调试时需要注意
    DMA2_Stream4->CR|=1<<13;       //存储器数据长度:16位                /*不确定,调试时需要注意
    DMA2_Stream4->CR|=2<<16;       //高优先级
    DMA2_Stream4->CR&=0<<21;       //外设突发单次传输
    DMA2_Stream4->CR&=0<<23;       //存储器突发单次传输
    DMA2_Stream4->CR|= 0x0<<25;                 //通道0选择
    DMA2_Stream4->CR|= 1<< 0;                         //打开DMA       
       
                Adc_Init();
                TIM3_PWM_Init(8-1,21);                                //PWM设置,4M计数频率,2M周期,半周期为1M
//                TIM3_Init_Init(2-1,42-1);                         //2M计数频率,1M周期
       
}
void TEST_ADC_DMA(void)
{
        u8 i;
        float temp;
        for(i=0;i<100;i++)
        {  
                temp=(float)AdcData*(3.3/4096);
                printf("%f",temp);
                printf(" ");//插入换行
        }       
}[/mw_shl_code]

一周热门 更多>