STM32F051 a Input Capture

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Neděle Duben 21 18:53:04 CEST 2019


Neporadim primo ale errata k prislusne revizi MCU jste studoval? Obcas 
tam jsou prekvapive speky...

Dne 20.04.2019 v 22:51 hudaklan na volny.cz napsal(a):
> 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
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list




Další informace o konferenci Hw-list