[STM32F0] 求教STM32F030——TIM1_CC4触发ADC1采集

[复制链接]
5499|4
 楼主| @lonely 发表于 2016-8-29 09:14 | 显示全部楼层 |阅读模式

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

  1. void main(void)
  2. {
  3.     SystemInit();
  4.     if (SysTick_Config(SystemCoreClock / 1000))//设置为1 毫秒
  5.     {
  6.         while(1);
  7.     }

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

  20.     ADC_TIM_Config_2();
  21.     ADC1_DMA_Init();

  22.     while(1)
  23.     {
  24.          
  25.     }
  26.    
  27. }



  1. void ADC_TIM_Config_2(void)
  2. {
  3.    
  4. ADC_InitTypeDef          ADC_InitStructure;
  5. GPIO_InitTypeDef         GPIO_InitStructure;
  6. TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  7. TIM_OCInitTypeDef        TIM_OCInitStructure;


  8.   /* GPIOC Periph clock enable */
  9.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  10.   
  11.   /* ADC1 and TIM1 Periph clock enable */
  12.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_TIM1 , ENABLE);
  13.   
  14.   /* Configure ADC Channel11 as analog input */
  15.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 ;
  16.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  17.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  18.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  19.   
  20.   /* TIM1 Configuration */
  21.   TIM_DeInit(TIM1);
  22.   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  23.   TIM_OCStructInit(&TIM_OCInitStructure);  
  24.   /* Time base configuration */
  25.   TIM_TimeBaseStructure.TIM_Period = 3000/2u  ;//
  26.   TIM_TimeBaseStructure.TIM_Prescaler = 0x0;      
  27.   TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;   
  28.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned3;  
  29.   TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  30.   
  31.   /* Output Compare PWM Mode configuration */
  32.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; /* low edge by default */
  33.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable ;//TIM_OutputState_Disable            
  34.   TIM_OCInitStructure.TIM_Pulse = 400;
  35.   TIM_OC4Init(TIM1, &TIM_OCInitStructure);
  36.   
  37.   /* TIM1 enable counter */
  38.   TIM_Cmd(TIM1, ENABLE);
  39.   
  40.   /* Main Output Enable */
  41.   TIM_CtrlPWMOutputs(TIM1, ENABLE);
  42.   
  43.    
  44.   
  45.   

  46.     /* ADCs DeInit */  
  47.   ADC_DeInit(ADC1);
  48.   
  49.   //***********************************************************
  50.   /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
  51.   RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);        
  52.    /* ADC1 and TIM1 Periph clock enable */
  53.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE);  
  54.   //**********************************************************
  55.   
  56.   
  57.   /* Initialize ADC structure */
  58.   ADC_StructInit(&ADC_InitStructure);
  59.   
  60.   /* Configure the ADC1 in continous mode withe a resolutuion equal to 12 bits  */
  61.   ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  62.   ADC_InitStructure.ADC_ContinuousConvMode = DISABLE ; //DISABLE ENABLE
  63.   ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_RisingFalling;   
  64.   ADC_InitStructure.ADC_ExternalTrigConv =  ADC_ExternalTrigConv_T1_CC4;
  65.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  66.   ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
  67.   ADC_Init(ADC1, &ADC_InitStructure);
  68.   
  69.   /* Convert the ADC1 Channel 11 with 239.5 Cycles as sampling time */
  70.   ADC_ChannelConfig(ADC1, ADC_Channel_4 , ADC_SampleTime_1_5Cycles);
  71.   
  72.   /* ADC Calibration */
  73.   ADC_GetCalibrationFactor(ADC1);
  74.   
  75.           /* 循环模式下的 ADC DMA 请求 */
  76.         ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);

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

  79.    

  80.   /* Enable ADCperipheral[PerIdx] */
  81.   ADC_Cmd(ADC1, ENABLE);     
  82.   
  83.   /* Wait the ADCEN falg */
  84.   while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
  85.   
  86.   /* ADC1 regular Software Start Conv */
  87.   ADC_StartOfConversion(ADC1);

  88.   
  89. }


  1.   void ADC1_DMA_Init(void)
  2. {
  3.         DMA_InitTypeDef   DMA_InitStructure;
  4.         NVIC_InitTypeDef  NVIC_InitStructure;
  5.         /* 使能DMA时钟 */
  6.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);

  7.         /* 复位DMA1_Channel1 */
  8.         DMA_DeInit(DMA1_Channel1);
  9.         
  10.         /*DMA外设ADC基地址*/
  11.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;
  12.         
  13.         /*DMA内存基地址*/
  14.         DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_ConvertedValue;
  15.         
  16.         /*外设作为数据传输源*/
  17.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  18.         
  19.         /*DMA通道的DMA缓存的大小*/
  20.         DMA_InitStructure.DMA_BufferSize = 2 * AD_Count;
  21.         
  22.         /*外设地址寄存器不变*/
  23.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  24.         
  25.         /*内存地址寄存器递增*/
  26.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  27.         
  28.         /*外设取值大小设置为半字*/
  29.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  30.         
  31.         /*数据大小设置为半字*/
  32.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  33.         
  34.         /*DMA循环模式,即完成后重新开始覆盖*/
  35.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  36.         
  37.         /*DMA优先级设置为高*/
  38.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  39.         
  40.         /*DMA通道x禁用内存到内存传输*/
  41.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  42.         
  43.         /*DMA初始化*/
  44.         DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  45.         
  46.         /*清除一次DMA中断标志*/
  47.         DMA_ClearITPendingBit(DMA1_IT_TC1);                                 
  48.         
  49.         /*使能DMA传输完成中断*/
  50.         DMA_ITConfig(DMA1_Channel1, DMA1_IT_TC1, ENABLE);
  51.         
  52.         /*选择DMA1通道中断*/
  53.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;  

  54.         /*中断使能*/
  55.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   
  56.         
  57.         /*优先级设为0 */
  58.         NVIC_InitStructure.NVIC_IRQChannelPriority = 0;  
  59.         
  60.         /*使能 DMA 中断*/
  61.         NVIC_Init(&NVIC_InitStructure);  

  62.         /* DMA1 Channel1 enable */
  63.         DMA_Cmd(DMA1_Channel1, ENABLE);
  64. }



  1. void DMA1_Channel1_IRQHandler()  
  2. {  
  3.      static uint32_t data;  
  4.     if(++data > 2000)    //4、5才进一次中断
  5.        {
  6.             data =0;
  7.            if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_11))
  8.                GPIO_ResetBits(GPIOA,GPIO_Pin_11);
  9.            else
  10.                GPIO_SetBits(GPIOA,GPIO_Pin_11);
  11.         }           
  12.    
  13.         
  14.         /*判断DMA传输完成中断*/
  15.         if(DMA_GetITStatus(DMA1_IT_TC1) != RESET)                        
  16.         {
  17.                 flag_ADC = 1;
  18.         }        
  19.         /*清除DMA中断标志位*/        
  20.         DMA_ClearITPendingBit(DMA1_IT_TC1);   
  21.         
  22.         
  23.         

  24.         
  25. }  


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 | 显示全部楼层
大神求救
LSLDAY 发表于 2016-9-3 11:48 | 显示全部楼层
估计是定时器初始化或者初值设置问题吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

83

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部