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