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