你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103关于TIM1触发ADC采样的频率设置异常

[复制链接]
finalapple 提问时间:2014-9-5 10:09 /
 打扰下,有一个奇葩的问题很困扰。STM32F103的,定时器触发ADC中断再通过DMA传送数据。在定时0.01秒或者更慢的时候可以触发,定时0.001秒或者更快就无法触发。我采样周期设的1.5个周期。这是为啥?为啥定时器设快了就不能触发了?
心急QAQ
下附源代码:
void ADC_DMA(void)
{
 
        ADC_InitTypeDef ADC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        DMA_InitTypeDef DMA_InitStructure;
        TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
        TIM_OCInitTypeDef         TIM_OCInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        //====================================
        RCC_ADCCLKConfig(RCC_CFGR_ADCPRE_DIV6);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC2|RCC_APB2Periph_ADC1,ENABLE);
       
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1|RCC_AHBPeriph_DMA2,ENABLE);
       
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        //Timer1
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
        TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
        TIM_TimeBaseStructure.TIM_Period = 1000;       //通过这两个设置采样频率,但为什么在低于等于500Hz的时候可以触发ADC,高于500Hz的时候不能触发。。。
        TIM_TimeBaseStructure.TIM_Prescaler = (144 - 1);       
        TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;    
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
        /* TIM1 channel1 configuration in PWM mode */
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; 
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                
        TIM_OCInitStructure.TIM_Pulse = 0x7f; 
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;         
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);
       
       
         NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; 
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
 NVIC_Init(&NVIC_InitStructure); 
TIM_ClearFlag(TIM1, TIM_FLAG_Update);
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
 
  /* DMA1ͨµÀ1ÅäÖÃ*/
  DMA_DeInit(DMA1_Channel1);                                                                                                                                                                                          //¿ªÆôDMA1µÄµÚһͨµÀ
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;                                                          //DMA¶ÔÓ¦µÄÍâÉè»ùµØÖ·
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADCConvertedValue;                   //ÄÚ´æ´æ´¢»ùµØÖ·
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                                                                                                //DMAµÄת»»Ä£Ê½ÎªSRCģʽ£¬ÓÉÍâÉè°áÒƵ½ÄÚ´æ
  DMA_InitStructure.DMA_BufferSize = 2*fuck;                                                                                                                                                   //DMA»º´æ´óС£¬1000¸ö
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                                        //½ÓÊÕÒ»´ÎÊý¾Ýºó£¬É豸µØÖ·½ûÖ¹ºóÒÆ
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                                                                        //¹Ø±Õ½ÓÊÕÒ»´ÎÊý¾Ýºó£¬Ä¿±êÄÚ´æµØÖ·ºóÒÆ
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//¶¨ÒåÍâÉèÊý¾Ý¿í¶ÈΪ16λ
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;                          //DMA°áÒÆÊý¾Ý³ß´ç£¬HalfWord¾ÍÊÇΪ16λ
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                                                                                                   //ת»»Ä£Ê½£¬Ñ­»·»º´æģʽ¡£
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;                                                                                                //DMAÓÅÏȼ¶¸ß
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                                                                                                  //M2Mģʽ½ûÓÃ
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);   
  
  /* ʹÄÜDMA1ͨµÀ1 */
  DMA_Cmd(DMA1_Channel1, ENABLE);
 
  /* ADC1ÅäÖÃ*/
  ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;                                                                                                //¶ÀÁ¢µÄת»»Ä£Ê½
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;                                                                                                                  //¿ªÆôɨÃèģʽ
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                                                                                           //¿ªÆôÁ¬Ðøת»»Ä£Ê½
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;                                //ADCÍⲿ¿ª¹Ø£¬¹Ø±Õ״̬
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                                                                           //¶ÔÆ뷽ʽ,ADCΪ12λÖУ¬ÓÒ¶ÔÆ뷽ʽ
  ADC_InitStructure.ADC_NbrOfChannel = 1;                                                                                                                                                 //¿ªÆôͨµÀÊý£¬1¸ö
  ADC_Init(ADC1, &ADC_InitStructure);
  /* ADC2ÅäÖÃ*/
  ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;                                                                                                //¶ÀÁ¢µÄת»»Ä£Ê½
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;                                                                                                                  //¿ªÆôɨÃèģʽ
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                                                                                           //¿ªÆôÁ¬Ðøת»»Ä£Ê½
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;                                //ADCÍⲿ¿ª¹Ø£¬¹Ø±Õ״̬
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                                                                           //¶ÔÆ뷽ʽ,ADCΪ12λÖУ¬ÓÒ¶ÔÆ뷽ʽ
  ADC_InitStructure.ADC_NbrOfChannel = 1;                                                                                                                                                 //¿ªÆôͨµÀÊý£¬1¸ö
  ADC_Init(ADC2, &ADC_InitStructure);
        ADC_ExternalTrigConvCmd(ADC2, ENABLE);
  /* ADC1ͨµÀ14ÅäÖÃ*/ 
  ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5); 
        ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SampleTime_1Cycles5);
   
  ADC_DMACmd(ADC1, ENABLE);
   
  ADC_Cmd(ADC1, ENABLE);
        ADC_Cmd(ADC2, ENABLE);
  
  ADC_ResetCalibration(ADC1);
        ADC_ResetCalibration(ADC2);
 
  while(ADC_GetResetCalibrationStatus(ADC1));
        while(ADC_GetResetCalibrationStatus(ADC2));
 
  /* ¿ªÊ¼Ð£×¼ADC1 */
  ADC_StartCalibration(ADC1);
        ADC_StartCalibration(ADC2);
   
  while(ADC_GetCalibrationStatus(ADC1));                         
        while(ADC_GetCalibrationStatus(ADC2));
//  ADC_SoftwareStartConvCmd(ADC1, ENABLE);                
//  ADC_SoftwareStartConvCmd(ADC2, ENABLE);
 
  ADC_ExternalTrigConvCmd(ADC1, ENABLE);
//        ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE); 
        TIM_Cmd(TIM1, ENABLE);
        TIM_CtrlPWMOutputs(TIM1,ENABLE);
}
在线急求。急的我心疼QAQ
收藏 评论1 发布时间:2014-9-5 10:09

举报

1个回答
废鱼 回答时间:2014-9-5 17:10:46

RE:STM32F103关于TIM1触发ADC采样的频率设置异常

你得考虑当前采集AD需要的时间,可以在这种情况下仿真,进入定时器以后,DMA的大小等各方面参数来做对比。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版