F407 ADC通过TIM2-TRGO触发 使用DMA传送问题

2019-07-20 20:48发布

本人目前刚刚学习407的DMA写了两天了,就是无法把数据从ADC2的DR传送到定义的数组上去。
下面是代码。请论坛大神帮帮,多谢。

volatile        u16 ADC_RCVTab[32];

void ADC2_init()
{
        GPIO_InitTypeDef GPIO_InitStruct;
        ADC_CommonInitTypeDef ADC_CommonInitStruct;
        ADC_InitTypeDef ADC_InitStruct;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2,ENABLE);        
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
        //时钟使能
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AN;//模拟        
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;      
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL ;
        GPIO_Init(GPIOA,&GPIO_InitStruct);//PA6初始化
       
        ADC_DeInit();//ADC复位

        ADC_CommonInitStruct.ADC_DMAAccessMode=ADC_DMAAccessMode_1;//模式1
        ADC_CommonInitStruct.ADC_Mode=ADC_Mode_Independent;        //独立模式
        ADC_CommonInitStruct.ADC_Prescaler=ADC_Prescaler_Div6; //时钟6分频
        ADC_CommonInitStruct.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles;//传送相隔5个时钟
        ADC_CommonInit(&ADC_CommonInitStruct);

        ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;  //禁止连续转换
        ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;//右对齐
        ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T2_TRGO;//T2_TRGO触发转换        
        ADC_InitStruct.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_Rising;//上升延触发
        ADC_InitStruct.ADC_NbrOfConversion=1;        //1个通道
        ADC_InitStruct.ADC_Resolution=ADC_Resolution_12b; //12位精度
        ADC_InitStruct.ADC_ScanConvMode=DISABLE; //扫描关
        ADC_Init(ADC2,&ADC_InitStruct);
       
        ADC_RegularChannelConfig(ADC2, ADC_Channel_6, 1, ADC_SampleTime_28Cycles);//配置ADC2通道6转换周期28个时钟,第一个

        ADC_DMACmd(ADC2, ENABLE);//ADC,dma使能
        ADC_DMARequestAfterLastTransferCmd(ADC2, ENABLE);//连续变化传输开启
        ADC_Cmd(ADC2, ENABLE);//adc2使能
       
       
}



void DMA2_Config(void)
{
        DMA_InitTypeDef DMA_InitStructure;

        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
        DMA_DeInit(DMA2_Stream2);        //初始化DMA2,数据流2
        DMA_StructInit(&DMA_InitStructure);
        DMA_InitStructure.DMA_Channel=DMA_Channel_2;//选择通道2
        DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&ADC2->DR;//外设地址
        DMA_InitStructure.DMA_Memory0BaseAddr=(u32)ADC_RCVTab;//内存地址
        DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralToMemory;        //方向外设至内存
        DMA_InitStructure.DMA_BufferSize=32;        //数据长度32
        DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设自增关闭
        DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//内存自增关开启
        DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//外设数据长度半字
        DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;//内存数据长度半字
        DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//DMA循环传输
        DMA_InitStructure.DMA_Priority=DMA_Priority_High;//DMA2_数据流2优先级高
        DMA_Init(DMA2_Stream2,&DMA_InitStructure);//DMA设置
        DMA_Cmd(DMA2_Stream2,ENABLE);//DMA使能
/*DMA中断设置*/
}


void My_TIM2_Init(u16 presca,u16 period)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;


        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
    //定时器时钟使能
    TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_TimeBaseInitStruct.TIM_Prescaler=presca;
    TIM_TimeBaseInitStruct.TIM_Period=period;
    TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);//定时器初始化

    TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_Update);//溢出更新,TRGO触发
    TIM_Cmd(TIM2,ENABLE);   //定时器2初始化



关闭DMA时候, ADC2->DR数据一直是有值,可是一开DMA配置,数据就不动了。谢谢哪位帮忙看看什么地方。出问题了。对照参考资料看了几次没看出问题。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。