STM32f2xx fuente de reloj externa para el temporizador

0

Estoy intentando usar un temporizador con una fuente de reloj externa en un microcontrolador stm32f207ZE. Pero no está funcionando. Aquí está mi código:

  /* TIM1 clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

  /* GPIOE clock enable */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);

  /* GPIOE Configuration: PE.11(TIM1 CH2)  */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOE, &GPIO_InitStructure);

  GPIO_PinAFConfig(GPIOE, GPIO_PinSource11, GPIO_AF_TIM1);
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource7, GPIO_AF_TIM1);

  /* TIM1 Input trigger configuration: External Trigger connected to TI2 */
  TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV2;
  TIM_ICInitStructure.TIM_ICFilter = 0x0;
  TIM_ICInit(TIM1, &TIM_ICInitStructure);

  TIM_TIxExternalClockConfig (TIM1, TIM_TS_TI2FP2, TIM_ICPolarity_Rising, 0) ;
  TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_External1);

  TIM_Cmd (TIM1, ENABLE);

¿Dónde puede estar mi error? Tengo algunos malentendidos sobre qué pin de origen se debe usar para Timer1 TI2. ¿Es lo mismo que Timer1_CH2?

También probé el modo ETR al inicializar el pin ETR

  /* TIM1 clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

  /* GPIOE clock enable */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);


    /* GPIOE Configuration: PE.7(TIM1 ETR)  */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOE, &GPIO_InitStructure);

  GPIO_PinAFConfig(GPIOE, GPIO_PinSource7, GPIO_AF_TIM1);

    TIM_TimeBaseStructure.TIM_Period = 0xFFFF;      // 5000*20 uS - 100 ms
    TIM_TimeBaseStructure.TIM_Prescaler = 0;    // frequency - 20 MHz
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); 

    //for ETR IN RM0033 p. 372
    TIM1->SMCR = 0;
    TIM1->SMCR |= TIM_ExtTRGPSC_DIV4; //2. set prescaller
    TIM1->SMCR |= TIM_ICPolarity_Rising; //3. rising edge
    TIM1->SMCR |= 0x4000; // 4. Enable external clock mode 2 by writing ECE=1

  TIM_Cmd (TIM1, ENABLE);

Pero tampoco funciona. Tal vez la frecuencia es alta? Y vi algo de comportamiento strnge. Cuando inicie una vez más el contador:

void inizializeSimpleCounter(){
  NVIC_InitTypeDef                  NVIC_InitStructure;
    TIM_TimeBaseInitTypeDef     TIM_TimeBaseStructure;

/****************Timer4 Inizialization**************************/
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

    TIM_TimeBaseStructure.TIM_Period = 5000;        // 5000*20 uS - 100 ms
    TIM_TimeBaseStructure.TIM_Prescaler = 3-1;  // frequency - 20 MHz
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); 

    TIM4->DIER = TIM_DIER_UIE;

    TIM_Cmd(TIM4, ENABLE);

    NVIC_InitStructure.NVIC_IRQChannel =  TIM4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
    NVIC_Init(&NVIC_InitStructure);
/*************************************************************/

}

El temporizador, que se inicializó para contar desde el contador extrenal, cuenta algunos valores y luego se detiene

    
pregunta user2105282

2 respuestas

1

Tuve el mismo problema pero lo resolví con el siguiente código:

TIM2->SMCR =0x0067;
TIM2->CCMR1=0x0100;
TIM2->CCER=0x0010;
TIM2->CNT = 0x1; 
    
respondido por el Rasool
1

Intenta utilizar

TIM_SelectInputTrigger (TIM1, TIM_TS_ETRF);

Función. Para mi trabaja con el primer ejemplo tuyo.

    
respondido por el Kubilho

Lea otras preguntas en las etiquetas