OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4096|回复: 1

stm32F303 定时器CC4 不能触发ADC

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2016-12-17
在线时间
2 小时
发表于 2016-12-17 11:41:03 | 显示全部楼层 |阅读模式
1金钱
经过测试,TIM2,3,4,的CC1,CC2,CC3,CC4,都能触发ADC,唯有TIM1,TIM8的高级定时器没法用CC4触发ADC,TGRO能触发,CC4能产生中断下面配置是用TRGO触发成功的,改为CC4就不行,谁能帮我看看为什么TIM1-CC4不能触发ADC?

void test_Timer1_adc(void)
{
ADC_InitTypeDef   ADC_InitStructure;
ADC_CommonInitTypeDef  ADC_CommonInitStructure;        
__IO uint16_t  ADC1ConvertedValue = 0, ADC1ConvertedVoltage = 0, calibration_value = 0;
         u32 i;
   NVIC_InitTypeDef NVIC_InitStructure;
         
/* Configure the ADC clock */  
RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div2);
/* Enable the  DMA1¡¢GPIOA ¡¢GPIOB and ADC1 Clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 | RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_ADC12, ENABLE);
         
/* Configure ADC1 */
ADC_StructInit(&ADC_InitStructure);
   
/* Calibration procedure */
ADC_VoltageRegulatorCmd(ADC1, ENABLE);
/* Insert delay equal to 10ms */
         
         ADC_SelectCalibrationMode(ADC1, ADC_CalibrationMode_Single);
ADC_StartCalibration(ADC1);
   
while(ADC_GetCalibrationStatus(ADC1) != RESET );
calibration_value = ADC_GetCalibrationValue(ADC1);

/* Configure the ADC1 in continuous mode */  
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;                                                                    
ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode;                  
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;            
ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_Circular;                  
ADC_CommonInitStructure.ADC_TwoSamplingDelay = 5;      
ADC_CommonInit(ADC1, &ADC_CommonInitStructure);
   
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Disable;
ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_7;     //TIM4_CC4 event        
ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable;   
ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Disable;   
ADC_InitStructure.ADC_NbrOfRegChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
   
/* ADC1 regular channel1 configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_181Cycles5);

   ADC_InjectedStructInit(&ADC1_Injected);
         
         ADC1_Injected.ADC_ExternalTrigInjecConvEvent=ADC_ExternalTrigInjecConvEvent_0;  //TIM1_TRGO
//        ADC1_Injected.ADC_ExternalTrigInjecConvEvent=ADC_ExternalTrigInjecConvEvent_1;  //TIM1_CC4
         ADC1_Injected.ADC_ExternalTrigInjecEventEdge=ADC_ExternalTrigInjecEventEdge_RisingEdge;
         ADC1_Injected.ADC_NbrOfInjecChannel=1;
         ADC1_Injected.ADC_InjecSequence1=3;
         ADC_InjectedInit(ADC1,&ADC1_Injected);
   ADC_InjectedChannelConfig(ADC1, 3,1,ADC_SampleTime_7Cycles5);
   //ADC1->JSQR

   NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);

/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
         TIM1_Conf();

/* wait for ADRDY */
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY));

   ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
   ADC_ClearFlag(ADC1, ADC_FLAG_JEOC);
         ADC_StartInjectedConversion(ADC1);

                 while(1){
     /* Test JEOC flag */
     while(ADC_GetFlagStatus(ADC1, ADC_FLAG_JEOC) == RESET);   
     /* Get ADC1 converted data */
     ADC1ConvertedValue =ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);
     ADC_ClearFlag(ADC1, ADC_FLAG_JEOC);
         }
         
}

void TIM1_Conf(void)  
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

/* TIM1 clock enable */
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
         
   TIM_DeInit(TIM1);
   TIM_TimeBaseStructInit(&TIM1_TimeBaseStructure);
   /* Time Base configuration */
   TIM1_TimeBaseStructure.TIM_Prescaler = 0x0;
   TIM1_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
   TIM1_TimeBaseStructure.TIM_Period = 0x800;
   TIM1_TimeBaseStructure.TIM_ClockDivision = 0;
   
   // Initial condition is REP=0 to set the UPDATE only on the underflow
   TIM1_TimeBaseStructure.TIM_RepetitionCounter = 0;
   TIM_TimeBaseInit(TIM1, &TIM1_TimeBaseStructure);
   
   TIM_OCStructInit(&TIM1_OCInitStructure);
   /* Channel 1, 2,3 in PWM mode */
   TIM1_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
   TIM1_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
   TIM1_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;                  
   TIM1_OCInitStructure.TIM_Pulse = 0x400; //dummy value
   TIM1_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
   TIM1_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;         
   TIM1_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
   TIM1_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;         
   
   TIM_OC1Init(TIM1, &TIM1_OCInitStructure);
   TIM_OC2Init(TIM1, &TIM1_OCInitStructure);
   TIM_OC3Init(TIM1, &TIM1_OCInitStructure);
   
   TIM_OCStructInit(&TIM1_OCInitStructure);
   /* Channel 4 Configuration in OC */
   TIM1_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;  
   TIM1_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
   TIM1_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;                  
   TIM1_OCInitStructure.TIM_Pulse = 0x400;
   
   TIM1_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
   TIM1_OCInitStructure.TIM_OCNPolarity =TIM_OCNPolarity_Low;         
   TIM1_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
   TIM1_OCInitStructure.TIM_OCNIdleState = LOW_SIDE_POLARITY;            
   
   TIM_OC4Init(TIM1, &TIM1_OCInitStructure);
   
   /* Enables the TIM1 Preload on CC1 Register */
   TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
   /* Enables the TIM1 Preload on CC2 Register */
   TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
   /* Enables the TIM1 Preload on CC3 Register */
   TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
   /* Enables the TIM1 Preload on CC4 Register */
   TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);

   TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update);
   TIM_SelectOutputTrigger2(TIM1, TIM_TRGO2Source_Reset);
         TIM_SelectSlaveMode(TIM1,TIM_SlaveMode_Reset);

   TIM_Cmd(TIM1, ENABLE);
   // Resynch to have the Update evend during Undeflow
   TIM_GenerateEvent(TIM1, TIM_EventSource_Update);
   // Clear Update Flag
   TIM_ClearFlag(TIM1, TIM_FLAG_Update);
   
   TIM_ITConfig(TIM1, TIM_IT_CC4, ENABLE);
                 
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-12-17 16:37:39 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 07:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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