硬汉嵌入式论坛

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

[有问必答] ADC+DMA+TIM1触发数据是零

[复制链接]

6

主题

11

回帖

6

积分

新手上路

积分
6
发表于 2017-3-30 13:24:10 | 显示全部楼层 |阅读模式
用的是安富莱的例子,我自己加了个DMA中断,读出来数据都是零,以下是代码:

#include "sys.h"
#include "delay.h"
#include "usart.h"
unsigned int DAT[1000];
int flag=0;
int adc_value=0;
#define ADC3_DR_ADDRESS     ((uint32_t)0x4001224C)
void TIM1_Config(void);                        
void bsp_InitADC(void)
{  
    ADC_InitTypeDef       ADC_InitStructure;
    ADC_CommonInitTypeDef ADC_CommonInitStructure;
    DMA_InitTypeDef       DMA_InitStructure;
    GPIO_InitTypeDef      GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
    /* ê1Äü ADC3, DMA2 oí GPIO ê±Öó ****************************************/
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOF, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);

    /* DMA2 Stream0 channel2 ÅäÖÃ **************************************/
    DMA_InitStructure.DMA_Channel = DMA_Channel_2;  
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC3->DR;
    DMA_InitStructure.DMA_Memory0BaseAddr = (uint16_t)DAT;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
    DMA_InitStructure.DMA_BufferSize = 1000;
    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_InitStructure.DMA_Priority = DMA_Priority_High;
    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);
    DMA_Cmd(DMA2_Stream0, ENABLE);

DMA_ITConfig(DMA2_Stream0,DMA_IT_TC,ENABLE);
   
    NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    /* ÅäÖÃADC3í¨μà7òy½ÅÎaÄ£ÄaêäèëÄ£ê½******************************/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
    GPIO_Init(GPIOF, &GPIO_InitStructure);

    /****************************************************************************   
      PCLK2 = HCLK / 2
      ÏÂÃæÑ¡ÔñμÄêÇ2·ÖÆμ
      ADCCLK = PCLK2 /2 = HCLK / 4 = 168 / 4 = 42M
      ADC2éÑùÆμÂê£o Sampling Time + Conversion Time = 3 + 12 cycles = 15cyc
                    Conversion Time = 42MHz / 15cyc = 2.8Mbps.
    *****************************************************************************/
    /* ADC1«122¿·Ö3õê¼»ˉ**********************************************************/
    ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
    ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
    ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
    ADC_CommonInit(&ADC_CommonInitStructure);

    /* ADC3 3õê¼»ˉ ****************************************************************/
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC3;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfConversion = 1;
    ADC_Init(ADC3, &ADC_InitStructure);
   
    /* ADC3 1æÔò channel7 ÅäÖÃ *************************************/
    ADC_RegularChannelConfig(ADC3, ADC_Channel_7, 1, ADC_SampleTime_3Cycles);

    /* ê1ÄüDMAÇëÇó(μ¥ADCÄ£ê½) */
    ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);

    /* ê1Äü ADC3 DMA */
    ADC_DMACmd(ADC3, ENABLE);

    /* ê1Äü ADC3 */
    ADC_Cmd(ADC3, ENABLE);
   
    TIM1_Config();
}

/*
*********************************************************************************************************
*    oˉ êy Ãû: TIM1_Config
*    1|ÄüËμÃ÷: ÅäÖö¨ê±Æ÷1£¬óÃóú′¥·¢ADC, ′¥·¢ÆμÂê1Msps
*    DΠ   2Î: ÎT
*    ·μ »Ø Öμ: ÎT
*********************************************************************************************************
*/
static void TIM1_Config(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);                           //ê1Äü¶¨ê±Æ÷1ê±Öó
   
    TIM_Cmd(TIM1, DISABLE);   
   
    /*
     ********************************************************************************
    system_stm32f4xx.c ÎļtÖD void SetSysClock(void) oˉêy¶Ôê±ÖóμÄÅäÖÃèçÏ£o

    HCLK = SYSCLK / 1     (AHB1Periph)
    PCLK2 = HCLK / 2      (APB2Periph)
    PCLK1 = HCLK / 4      (APB1Periph)

    òòÎaAPB1 prescaler != 1, ËùòÔ APB1éÏμÄTIMxCLK = PCLK1 x 2 = SystemCoreClock / 2;
    òòÎaAPB2 prescaler != 1, ËùòÔ APB2éÏμÄTIMxCLK = PCLK2 x 2 = SystemCoreClock;

    APB1 ¶¨ê±Æ÷óD TIM2, TIM3 ,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14
    APB2 ¶¨ê±Æ÷óD TIM1, TIM8 ,TIM9, TIM10, TIM11
         
    TIM6 ¸üDÂÖüÆúêÇ = TIM1CLK / £¨TIM_Period + 1£©/£¨TIM_Prescaler + 1£©
    ********************************************************************************
    */
   
    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);                    //3õê¼»ˉ¶¨ê±Æ÷1μļÄ′æÆ÷Îa¸′λÖμ
    TIM_TimeBaseStructure.TIM_Period = 168000000 / 1000000 - 1;        //ARR×Ô¶ˉÖØ×°ÔØ¼Ä′æÆ÷ÖüÆúμÄÖμ(¶¨ê±ê±¼ä£©μ½éèÖÃÆμÂêoó2úéú¸ö¸üD»òÕßÖD¶Ï(ò2êÇË춨ê±ê±¼äμ½)
    TIM_TimeBaseStructure.TIM_Prescaler =1;                              //PSCê±ÖóÔ¤·ÖÆμêy àyèç£oê±ÖóÆμÂê=TIM1CLK/(ê±ÖóÔ¤·ÖÆμ+1)
    TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;                       //CR1->CKDê±¼ä·Ö¸îÖμ
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;         //CR1->CMS[1:0]oíDIR¶¨ê±Æ÷Ä£ê½ ÏòéϼÆêy
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                    //CCMR2ÔúÏòéϼÆêyê±£¬ò»μ©TIMx_CNT<TIMx_CCR1ê±í¨μà1ÎaóDD§μçÆ½£¬·ñÔòÎaÎTD§μçÆ½
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //CCER êä3öê1Äü         
    TIM_OCInitStructure.TIM_Pulse = TIM_TimeBaseStructure.TIM_Period / 2;//CCR3í¬¼ÆêyÆ÷TIMx_CNTμıè½Ï£¬2¢ÔúOC4¶Ë¿úéÏ2úéúêä3öDÅoÅ
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;           //CCERêä3ö¼«DÔéèÖà   ¸ßμçÆ½óDD§     
    TIM_OC3Init(TIM1, &TIM_OCInitStructure);
    TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);                    //CMR2 éèÖÃÔ¤×°ÔØê1Äü  ¸üDÂê¼t2úéúê±D′èëóDD§
    TIM_ARRPreloadConfig(TIM1, ENABLE);                                    //CR1  éèÖÃARR×Ô¶ˉ֨װ ¸üDÂê¼t2úéúê±D′èëóDD§
    TIM_Cmd(TIM1, ENABLE);                                               
    TIM_CtrlPWMOutputs(TIM1, ENABLE);                                  //ê1ÄüPWM êä3ö
}

/***************************** °2¸»à3μç×ó www.armfly.com (END OF FILE) *********************************/

int main(void)
{
    float volt=0;
    int i=0;
     u16 adcx;
    float temp;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÏμí3ÖD¶ÏóÅÏè¼¶·Ö×é2
    delay_init(168);    //3õê¼»ˉÑóê±oˉêy
    uart_init(115200);    //3õê¼»ˉ′®¿ú2¨ìØÂêÎa115200

    bsp_InitADC();
    //3õê¼»ˉADC
  while(1)
    {

        if(flag==1)
        {
            
        //    printf("begin:\r");
            for(i=0;i<1000;i++)
            {
                //volt=DAT*(3.3/4096);
                printf("%d  ",DAT);
            }
            flag=0;
            TIM_Cmd(TIM1,ENABLE);
            delay_ms(1000);
        }
    }
}
void DMA2_Stream0_IRQHandler()
{
        DMA_ClearITPendingBit(DMA2_Stream0,DMA_IT_TCIF0);
     // printf("dma:");
    TIM_Cmd(TIM1,DISABLE);
    flag=1;
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2017-3-30 14:27:01 | 显示全部楼层
仅看你的代码,没发现什么问题,你再多试试。
回复

使用道具 举报

6

主题

11

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2017-3-30 14:48:26 | 显示全部楼层
我发现了地址错了[s:125] ,非常感谢,这个调了好久了,用了本论坛的例子就妥妥的。
DMA_InitStructure.DMA_Memory0BaseAddr = (uint16_t)DAT;
改为:
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)DAT;
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-16 13:51 , Processed in 0.037504 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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