硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4551|回复: 3
收起左侧

[例程下载] F407的ADC配合DMA,定时器触发不成功。

[复制链接]

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2016-7-29 16:50:10 | 显示全部楼层 |阅读模式
配置参考例程,ADC3,只是定时器换成了TIM5. 代码如下,请帮忙看看,谢谢! 刚接触F407
   

  /* 使能 ADC3, DMA2 和 GPIO 时钟 ****************************************/
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOF |RCC_AHB1Periph_GPIOC, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);

   DMA_InitStructure.DMA_Channel = DMA_Channel_2;
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC3_DR_Address;
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)ADC3ConvertedValue;
  DMA_InitStructure.DMA_DIR =DMA_DIR_PeripheralToMemory;// DMA_DIR_PeripheralSRC; //外设数据读到向内存
  DMA_InitStructure.DMA_BufferSize = ADC3CHANNELNUMBER*ADC3AVERAGETIME; //传输5*7个数据
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址不增加,因为ADC数据地址不变。
  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_InitStructure.DMA_Priority = DMA_Priority_Low;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  DMA_Init(DMA2_Stream0, &DMA_InitStructure);

  /* Enable DMA2 stream0 for ADC1*/
  DMA_Cmd(DMA2_Stream0, ENABLE);

    //设置AD模拟输入端口为输入 10路AD 规则通道
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_3; //2014-11-7 配置3个ADC输入
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;   
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
      GPIO_Init(GPIOC, &GPIO_InitStructure);

      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10; //2014-11-7 配置3个ADC输入
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
      GPIO_Init(GPIOF, &GPIO_InitStructure);
     /* ADC公共部分初始化**********************************************************/
    ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
    ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1;
    ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_15Cycles;
    ADC_CommonInit(&ADC_CommonInitStructure);

     /* ADC3 初始化 ****************************************************************/
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;        //模数转换工作在扫描模式(多通道)还是单次(单通道)模式
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;    //模数转换工作在单次模式,
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T5_CC1;//由TIM5——CC1触发   
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC数据右对齐
    ADC_InitStructure.ADC_NbrOfConversion = ADC3CHANNELNUMBER;               //规定了顺序进行规则转换的ADC通道的数目。这个数目的取值范围是1到16
    ADC_Init(ADC3, &ADC_InitStructure);

    /* ADC3 regular channels configuration [规则模式通道配置]*/

    //ADC3 规则通道配置 ADCCHANNELNUMBER(11)个通道需要转换
    //通道采样时间 55+12.5周期=67.5*1/12us=5.62us,全部扫描一遍需要5.62*11+17=78us。
    //TIM5的出发周期约为310us
      ADC_RegularChannelConfig(ADC3, PHASESHIFTCH, 1, ADC_SampleTime_56Cycles);      
      ADC_RegularChannelConfig(ADC3, PHASESHIFTCH2, 2, ADC_SampleTime_56Cycles);   
      ADC_RegularChannelConfig(ADC3, EXTADC3_4CH, 3, ADC_SampleTime_56Cycles);   
        ADC_RegularChannelConfig(ADC3, EXTADC3_5CH, 4, ADC_SampleTime_56Cycles);   
        ADC_RegularChannelConfig(ADC3, EXTADC3_6CH, 5, ADC_SampleTime_56Cycles);      //
      ADC_RegularChannelConfig(ADC3, EXTADC3_7CH, 6, ADC_SampleTime_56Cycles);   
        ADC_RegularChannelConfig(ADC3, EXTADC3_8CH, 7, ADC_SampleTime_56Cycles);   

/* 使能DMA请求,单ADC模式 */
    ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);            
  ADC_DMACmd(ADC3, ENABLE);

    //使能ADC1
    ADC_Cmd(ADC3, ENABLE);   
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
    TIM_OCStructInit(&TIM_OCInitStructure);     //add 2016-1-16
    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);                  //设置默认参数
      TIM_TimeBaseStructure.TIM_Period =TIM2PERIOD;                          //向上计数,从0数到71,触发一次中断。正弦波频率31.25k
      TIM_TimeBaseStructure.TIM_Prescaler = 10000-1;                       //预分频器10000,相当于计数,相当于采样频率为1M/10000=100Hz.
      TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;                    //不解,和数字滤波器相关?
      TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;      //向上计数。


    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = (TIM2PERIOD>>1)+1; // /2
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

    TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);
  TIM_OC1Init(TIM5, &TIM_OCInitStructure);
    TIM_ARRPreloadConfig(TIM5, ENABLE);

     TIM_SelectOutputTrigger(TIM5, TIM_TRGOSource_OC1Ref);            //使用CC1事件作为触发输出 F407屏蔽这个。

     TIM_Cmd(TIM5,ENABLE);
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 2016-7-29 21:48:59 | 显示全部楼层
发现例程其实有问题,可能是错的。例程因为定义了
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

这个和ST官方无定时器的ADC-DMA例程一样,那么ADC采样触发是自动进行的,与定时器的设定无关。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2016-7-30 10:08:50 | 显示全部楼层

回 caicaptain2 的帖子

caicaptain2:发现例程其实有问题,可能是错的。例程因为定义了
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

这个和ST官方无定时器的ADC-DMA例程一样,那么ADC采样触发是自动进行的,与定时器的设定无关。 (2016-07-29 21:48) 
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
这个连续转换使能或者不使用都没有影响,因为你已经设置外部触发了,没有使用ADC自己的时钟进行触发。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 2016-8-1 17:05:19 | 显示全部楼层
结贴。
使用DMA,不能配置64K的 cc RAM,有冲突。
ScreenHunter_184 Aug. 01 13.11.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 03:35 , Processed in 0.218710 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表