STM32F051 a Input Capture

hudaklan na volny.cz hudaklan na volny.cz
Sobota Duben 20 22:51:17 CEST 2019


Dobrý den,
zkouším si na discovery kitu s STM32F051 měřit na TIM2 pomocí capture registrů šířku impulsů.
Kanály 2-4 fungují dobře, ale na kanálu 1 mám nějaký problém a už si nevím rady.
Pokud přepnu program na kanál 1, tak se někde něco zakousne a TIM2 přestane pracovat.
Vše ostatní funguje tak jak má. První 2 přerušení od vstupního signálu proběhnou, ale pak přijde
přerušení CC1OF (opravdu skočí do rutiny přerušení) i když není povolené a pak TIM2 zatuhne.

#define TEST1

void Tim2Setup(void)                                       // TIM2 == 32 bit
 {
  RCC->APB1ENR |= RCC_APB1Periph_TIM2;                     // Tim clock enable
  RCC->AHBENR  |= RCC_AHBPeriph_GPIOA;                     // Enable GPIO clock

#ifdef TEST1
  SetPinPort(GPIOA,GPIO_Pin_5,GPIO_Speed_Level_3,GPIO_OType_PP,GPIO_Mode_AF,GPIO_PuPd_NOPULL); // Configure Input1 as alternate function nopush-pull
#else
  SetPinPort(GPIOA,GPIO_Pin_1,GPIO_Speed_Level_3,GPIO_OType_PP,GPIO_Mode_AF,GPIO_PuPd_NOPULL); // Configure Input2 as alternate function nopush-pull
#endif

#ifdef TEST1
  GPIO_PinAFConfigE(GPIOA, GPIO_Pin_5, GPIO_AF_2);         // Connect PXx to TIMx-CH1 PA5
#else
  GPIO_PinAFConfigE(GPIOA, GPIO_Pin_1, GPIO_AF_2);         // Connect PXx to TIMx-CH2 PA1
#endif

  TIM2->CR1 = 0x0000;                                      // vypnout TIM2 pro nastaveni
  TIM2->ARR = 0xffffffffu;                                 // nastavit strop citace
  TIM2->PSC = 0;                                           // nastavi preddelicku na 0, nedeli vstupni kmitocet
  TIM2->EGR |= TIM_EGR_UG;                                 // vyvolani eventu UPDATE pro nastaveni PSC registru

#ifdef TEST1
  TIM2->CCMR1 = 0x0001;                                    // vybere bez filtru a preddelicky a s Input z TI1
  TIM2->CCER  = 0x000b;                                    // vybere citlivost na obe hrany a povoli Capture 1
#else
  TIM2->CCMR1 = 0x0100;                                    // vybere bez filtru a preddelicky a s Input z TI2
  TIM2->CCER  = 0x00b0;                                    // vybere citlivost na obe hrany a povoli Capture 2
#endif

  NVIC_SetPriority(TIM2_IRQn, 0x00);                       // nastavi prioritu RADIO_TIM
  NVIC_EnableIRQ(TIM2_IRQn);                               // povoli preruseni od RADIO_TIM v NVIC systemu

  TIM2->CR1 |= TIM_CR1_CEN;                                // povoli citac TIM2
#ifdef TEST1
  TIM2->DIER = TIM_IT_CC1;                                 // povoli preruseni od Input Capture 1
#else
  TIM2->DIER = TIM_IT_CC2;                                 // povoli preruseni od Input Capture 2
#endif
 }

void TIM2_IRQHandler(void)
 {
  pok = TIM2->SR;
  TIM2->SR = (uint16_t)~pok;                               //! Clear TIM2 Capture interrupt flag

#ifdef TEST1
  if ((pok & TIM_IT_CC1) == TIM_IT_CC1)
#else
  if ((pok & TIM_IT_CC2) == TIM_IT_CC2)
#endif
    {
#ifdef TEST1
     if ((GPIO_PORT->IDR & GPIO_PinSource5) == GPIO_PinSource5)
       (data)->start = TIM2->CCR1;
      else
       (data)->konec = TIM2->CCR1;
#else
     if ((GPIO_PORT->IDR & GPIO_PinSource1) == GPIO_PinSource1)
       (radio)->start = TIM2->CCR2;
      else
       (radio)->konec = TIM2->CCR2;
#endif
     (data)->value = (data)->konec - (data)->start);
    }
 }

Toto je ořezaná část programu, na které to zkouším. Při #defineTEST1 to nejde.

Děkuji za každou radu.
HUDA


Další informace o konferenci Hw-list