Почему не может запустить АЦП с событием timer1 CC1?

Я работаю на stm32f407. Что я хочу сделать, так это запустить ADC1 и ADC2 с событием timer1 CC1, но это не сработает. Я попытался запустить ADC1 и ADC2 с помощью события timer3 trgo или cc1, все работает нормально. Поэтому я не знаю, почему событие timer1 cc1 не работает, может ли кто-нибудь мне помочь? Спасибо, вот мой код.

int main(void) 
{
    GPIO_InitTypeDef GPIO_InitStructure;
    ADC_InitTypeDef  ADC_InitStructure;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    

    /* Config GPIO */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* Config ADC1 */

    /* ADC1 clock and reset*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);

    /* ADC1 config */
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfConversion = 2;
    /* config trigger event */
    // ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T3_CC1;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;

    ADC_Init(ADC1, &ADC_InitStructure);

    /* ADC1 channel config */
    /* channel 4 for PA4 */
    ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_480Cycles);
    /* channel 5 for PA5 */
    ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SampleTime_480Cycles);

    /* ADC Common config */
    ADC_CommonInitTypeDef  ADC_CommonInitStructure;
    ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; 
    ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
    ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
    ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
    ADC_CommonInit(&ADC_CommonInitStructure);

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

    /* Configure TIMER1 */
    TIM1_Int_Init(5000-1,8400-1);

    while (1) {} 
}
void TIM1_Int_Init(u16 arr,u16 psc) 
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_OCInitTypeDef       TIM_OCInitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);

    TIM_TimeBaseInitStructure.TIM_Period = arr;
    TIM_TimeBaseInitStructure.TIM_Prescaler=psc;
    TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 0xFF;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; 
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);

    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
    TIM_ARRPreloadConfig(TIM1, ENABLE);

    TIM_CtrlPWMOutputs(TIM1, ENABLE);       
    TIM_Cmd(TIM1, ENABLE); 
}

Что еще больше меня смущает, так это то, что если я включу прерывание TIM1_CC_IRQn, я действительно смогу перехватить прерывание CC1 в TIM1_CC_IRQHandler.

У кого-нибудь есть идеи по этому поводу?


Я обнаружил, что если я включу прерывание CC1, то событие CC1 может вызвать ADC1, и теперь моя проблема заключается в том, почему я должен включить прерывание CC1? Имеет ли значение, разрешаю ли я прерывание CC1 или нет? И мне действительно не нужно включать прерывание CC1, если я запускаю ADC1 с событием CC1 таймера 3.


person roMoon    schedule 13.06.2016    source источник
comment
Да, это имеет значение. Вам нужно включить прерывание!   -  person SamR    schedule 16.06.2016
comment
Спасибо SamR, но почему мне не нужно включать прерывание, если вместо этого я использую timer3?   -  person roMoon    schedule 17.06.2016


Ответы (1)


убедитесь, что бит MOE в регистре TIMx_BDTR установлен

person Daniel    schedule 28.04.2017