打印
[STM32F0]

求教STM32F030——TIM1_CC4触发ADC1采集

[复制链接]
4552|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
@lonely|  楼主 | 2016-8-29 09:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

初上STM32芯片,请教STM32F030芯片,系统时钟是内部48MHz,用TIM1_CC4事件触发ADC转换,DMA搬运转换数据和中断提示,TIM1是中间对齐模式,周期是62us。现在ADC转换完成DMA要4、5S才进一次中断,麻烦大家看看问题出在哪里?谢谢大家!!!

void main(void)
{
    SystemInit();
    if (SysTick_Config(SystemCoreClock / 1000))//设置为1 毫秒
    {
        while(1);
    }

    //LED
    GPIO_InitTypeDef GPIO_InitStruct; //调用IO 定义的结构体
   
     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);//时能IO 端口时钟
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;//设置连接LED 等的IO 端口 11
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;//设置端口为输出模式
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//设置输出推挽
    GPIO_InitStruct.GPIO_Speed =GPIO_Speed_Level_3;//设置输出速度为第三级
    GPIO_Init(GPIOA, &GPIO_InitStruct); //把设置参数运用到结构体中
   // GPIO_SetBits(GPIOA, GPIO_Pin_11 );//熄灭LED 灯
    GPIO_ResetBits(GPIOA,GPIO_Pin_11);
   

    ADC_TIM_Config_2();
    ADC1_DMA_Init();

    while(1)
    {
         
    }
   
}



void ADC_TIM_Config_2(void)
{
   
ADC_InitTypeDef          ADC_InitStructure;
GPIO_InitTypeDef         GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef        TIM_OCInitStructure;


  /* GPIOC Periph clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  
  /* ADC1 and TIM1 Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_TIM1 , ENABLE);
  
  /* Configure ADC Channel11 as analog input */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  /* TIM1 Configuration */
  TIM_DeInit(TIM1);
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_OCStructInit(&TIM_OCInitStructure);  
  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 3000/2u  ;//
  TIM_TimeBaseStructure.TIM_Prescaler = 0x0;      
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;   
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned3;  
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  
  /* Output Compare PWM Mode configuration */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; /* low edge by default */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable ;//TIM_OutputState_Disable            
  TIM_OCInitStructure.TIM_Pulse = 400;
  TIM_OC4Init(TIM1, &TIM_OCInitStructure);
  
  /* TIM1 enable counter */
  TIM_Cmd(TIM1, ENABLE);
  
  /* Main Output Enable */
  TIM_CtrlPWMOutputs(TIM1, ENABLE);
  
   
  
  

    /* ADCs DeInit */  
  ADC_DeInit(ADC1);
  
  //***********************************************************
  /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
  RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);        
   /* ADC1 and TIM1 Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE);  
  //**********************************************************
  
  
  /* Initialize ADC structure */
  ADC_StructInit(&ADC_InitStructure);
  
  /* Configure the ADC1 in continous mode withe a resolutuion equal to 12 bits  */
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE ; //DISABLE ENABLE
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_RisingFalling;   
  ADC_InitStructure.ADC_ExternalTrigConv =  ADC_ExternalTrigConv_T1_CC4;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
  ADC_Init(ADC1, &ADC_InitStructure);
  
  /* Convert the ADC1 Channel 11 with 239.5 Cycles as sampling time */
  ADC_ChannelConfig(ADC1, ADC_Channel_4 , ADC_SampleTime_1_5Cycles);
  
  /* ADC Calibration */
  ADC_GetCalibrationFactor(ADC1);
  
          /* 循环模式下的 ADC DMA 请求 */
        ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);

        /* 使能 ADC_DMA */
        ADC_DMACmd(ADC1, ENABLE);  

   

  /* Enable ADCperipheral[PerIdx] */
  ADC_Cmd(ADC1, ENABLE);     
  
  /* Wait the ADCEN falg */
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
  
  /* ADC1 regular Software Start Conv */
  ADC_StartOfConversion(ADC1);

  
}


  void ADC1_DMA_Init(void)
{
        DMA_InitTypeDef   DMA_InitStructure;
        NVIC_InitTypeDef  NVIC_InitStructure;
        /* 使能DMA时钟 */
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);

        /* 复位DMA1_Channel1 */
        DMA_DeInit(DMA1_Channel1);
        
        /*DMA外设ADC基地址*/
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;
        
        /*DMA内存基地址*/
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_ConvertedValue;
        
        /*外设作为数据传输源*/
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        
        /*DMA通道的DMA缓存的大小*/
        DMA_InitStructure.DMA_BufferSize = 2 * AD_Count;
        
        /*外设地址寄存器不变*/
        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循环模式,即完成后重新开始覆盖*/
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
        
        /*DMA优先级设置为高*/
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
        
        /*DMA通道x禁用内存到内存传输*/
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        
        /*DMA初始化*/
        DMA_Init(DMA1_Channel1, &DMA_InitStructure);
        
        /*清除一次DMA中断标志*/
        DMA_ClearITPendingBit(DMA1_IT_TC1);                                 
        
        /*使能DMA传输完成中断*/
        DMA_ITConfig(DMA1_Channel1, DMA1_IT_TC1, ENABLE);
        
        /*选择DMA1通道中断*/
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;  

        /*中断使能*/
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   
        
        /*优先级设为0 */
        NVIC_InitStructure.NVIC_IRQChannelPriority = 0;  
        
        /*使能 DMA 中断*/
        NVIC_Init(&NVIC_InitStructure);  

        /* DMA1 Channel1 enable */
        DMA_Cmd(DMA1_Channel1, ENABLE);
}



void DMA1_Channel1_IRQHandler()  
{  
     static uint32_t data;  
    if(++data > 2000)    //4、5才进一次中断
       {
            data =0;
           if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_11))
               GPIO_ResetBits(GPIOA,GPIO_Pin_11);
           else
               GPIO_SetBits(GPIOA,GPIO_Pin_11);
        }           
   
        
        /*判断DMA传输完成中断*/
        if(DMA_GetITStatus(DMA1_IT_TC1) != RESET)                        
        {
                flag_ADC = 1;
        }        
        /*清除DMA中断标志位*/        
        DMA_ClearITPendingBit(DMA1_IT_TC1);   
        
        
        

        
}  


沙发
mmuuss586| | 2016-8-29 10:15 | 只看该作者
TIM_TimeBaseStructure.TIM_Period = 3000/2u  ;//
这个的值是多少啊?

通过定时器1,输出PWM看看,频率是否对

使用特权

评论回复
板凳
@lonely|  楼主 | 2016-8-29 12:23 | 只看该作者
mmuuss586 发表于 2016-8-29 10:15
TIM_TimeBaseStructure.TIM_Period = 3000/2u  ;//
这个的值是多少啊?

这个应该是对的,我使能了TIM1更新中断去闪烁LED指示灯,看闪烁频率是对的。因为公司管的比较严所以不能用公司示波器来看

使用特权

评论回复
地板
@lonely|  楼主 | 2016-8-29 17:44 | 只看该作者
大神求救

使用特权

评论回复
5
LSLDAY| | 2016-9-3 11:48 | 只看该作者
估计是定时器初始化或者初值设置问题吧

使用特权

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

本版积分规则

6

主题

74

帖子

3

粉丝