Skocz do zawartości

[C] STM32 - szybkie przerwania timera


Krzema

Pomocna odpowiedź

Witam,
mam następujący problem. Potrzebuję wygenerować dość szybki sygnał na dowolnym, zwykłym pinie GPIO (czyli najlepiej takim, który nie współdzieli jakiejś ważnej funkcji, ale to już mniej ważna rzecz), chodzi o częstotliwość rzędu 250 kHz. Chcę to zrealizować za pomocą timera. Mam już do pewnego stopnia działający kod.

W ten sposób konfiguruję timer:

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 65535;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

// prescaler setting
TIM_PrescalerConfig(TIM2, 2, TIM_PSCReloadMode_Immediate);

TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OC1Init(TIM2, &TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);

TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
TIM_Cmd(TIM2, ENABLE);

Konfiguracja kontrolera przerwań:

	NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

Wreszcie obsługa przerwania:

void TIM2_IRQHandler(void)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
GPIO_WriteBit(GPIOB, GPIO_Pin_1, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_1)));
capture = TIM_GetCapture1(TIM2);
TIM_SetCompare1(TIM2, capture + CCR1_Val);
}

Aby uzyskać falę prostokątną o częstotliwości 250 kHz, potrzebuję zmieniać stan na jakimś pinie z częstotliwością 2x większą, 500 kHz. Problem w tym, że przy tym kodzie nie mogę osiągnąć takiej częstotliwości. Przerwanie timera musiałoby się wywoływać co 2 mikrosekundy, a mi udało się zejść do 3 us (zmierzone za pomocą oscyloskopu). Jest pewna graniczna wartość parametru TIM_Pulse (ustawiany w pierwszym fragmencie kodu), poniżej której długość impulsu się nie zmienia. Jest ona równa mniej więcej 110, a dla osiągnięcia częstotliwości 500 kHz musiałbym zejść do 72. Czy ktoś wie dlaczego tak się dzieje? Jak można to obejść? Zauważyłem jedynie, że funkcje wywoływane w przerwaniu mocno spowalniają całość, ale niestety nie wiem jak można to zoptymalizować. Większość kodu ściągnąłem z przykładów dołączonych do TrueSTUDIO.

Procesor to STM32F107VCT6. Rdzeń taktowany z f = 72 MHz, a timer - 36 MHz. Korzystam z TrueSTUDIO.

Link do komentarza
Share on other sites

Takich szybkich rzeczy nie robi się na przerwaniach.

Zauważ, że w optymalnych warunkach masz 2*72=144 cykle zegara na jedno wywołanie przerwania, a Ty w tym czasie wywołujesz kilka funkcji i mieszasz z wieloma zmiennymi. Do tego sama zmiana stanu portu jest względnie wolna.

Użyj timera do generowania sygnału tak jak przy PWM i nie będzie żadnych problemów.

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.