Skocz do zawartości

[C] STM32F4 discovery, konfiguracja SysTic od podstaw w coocox.


Pomocna odpowiedź

To już zmieniłem, systick teraz działa dobrze tylko problem się zmienił. Mianowicie sprzęt działa tyko na HSI.

Różnica w czestotliwości wynosiła dokładnie 10,5 jak się okazuje, gdyż: Systick w konfuguracji miał podaną częstotliwość docelową PLL 168Mhz, a działał z częstotliwością HSI=16Mhz. Gdy wrzuciłem polecenie SYstemCoreClockUpdate, wówczas zmienna SystemCoreClock aktualizowała się do 16Mhz i już wszystkoo działało poprawnie na zegarze wewnętrznym. Tylko dlaczego nie działa inne taktowanie niż HSI?

Spróbuj ustawić zegar bezpośrednio z HSE. Albo z PLL korzystającego z HSI. Albo przypisz HSE_VALUE do zmiennej w funkcji main() i zobacz czy rzeczywiście jest równe 8000000. Nie wiem co może być źle.

  • 10 miesiące później...

Czy problem został rozwiązany ? W swojej STM mam podobnie . SystemCoreClock pokazuje 16000000 czyli HSI. Sprawdziłem w main i debugerze wartosc HSE i jest dobra 8000000.

(pytanie przy okazji. Czy ustawiając timer do generacji PWM o częstotliwości 50Hz muszę te HSI 16000000 podzielić przez preskaler 160 a następnie okres 2000 ? robię tak ale moje serwo nie reaguje tak jak bym sobie tego oczekiwał dla wartości 1500+ powinno się kręcić w prawo dla 1500- w lewo a ciągle kręci w jedną z minimalną zmianą prędkości)

Czy problem został rozwiązany ? W swojej STM mam podobnie . SystemCoreClock pokazuje 16000000 czyli HSI. Sprawdziłem w main i debugerze wartosc HSE i jest dobra 8000000.

Czy korzystasz z płytki STM32F4 DISCOVERY lub z jakiejś własnej? Jeżeli z własnej to czy masz kwarc podpięty do właściwych pinów (a nie do przypadkiem OSC32)?

Możesz sprawdzić aktualne wartości zegarów używając:

RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq(&RCC_Clocks);

w wyniku tych operacji otrzymasz strukturę z poszczególnymi wartościami np sysclk.

(pytanie przy okazji. Czy ustawiając timer do generacji PWM o częstotliwości 50Hz muszę te HSI 16000000 podzielić przez preskaler 160 a następnie okres 2000 ? robię tak ale moje serwo nie reaguje tak jak bym sobie tego oczekiwał dla wartości 1500+ powinno się kręcić w prawo dla 1500- w lewo a ciągle kręci w jedną z minimalną zmianą prędkości)

Musisz jeszcze uwzględnić, że szyna APB1 na której znajdują się timery np TIM3,4 ma maksymalne taktowanie 84MHz, ponieważ minimalny jej prescaler to 2 (datasheet: clock tree).

Opiszę na przykładzie jak wygenerować sygnał PWM o częstotliwości 50 Hz dla STM32F4 używając TIM4. W trakcie konfiguracji timera musimy uzupełnić wartości dwóch rejestrów:

TIM_BaseStruct.TIM_Prescaler;
TIM_BaseStruct.TIM_Period; 

Mamy system core clock taktowany z częstotliwością 168 MHz. Szyna APB1 pracuje z częstotliwością 84 MHz.

Zatem mamy TIM4 działający z tą częstotliwością (ponieważ pracuje on na szynie APB1), czyli teoretycznie wystarczyłoby policzyć jaki chcemy okres

84000000 [Hz]/x = 50 [Hz] 
x = 84000000/50 = 1680000
TIM_Period = 1680000-1

niestety nie możemy tej wartości wpisać do rejestru, ponieważ rejestr ten jest 16 bitowy, czyli aby wszystko zadziałało musimy wpisać wartość od 0 do 65535. Musimy zatem ustawić wartość Prescalera tego timera. Czyli przykładowo:

TIM_BaseStruct.TIM_Prescaler = 1000-1;

TIMer teraz pracuje z częstotliwością 84000000/1000 = 84000[Hz] i możemy już ustawić nasz TIM_Period o odpowiednio niższa wartość, aby nie przekraczać limitu

TIM_Period: 84000 [Hz]/x = 50 [Hz] 
x = 84000/50 = 1680

wówczas uzyskamy sygnał PWM o częstotliwości 50 Hz.

Zauważyć można, że manipulując wartościami TIM_Prescaler i TIM_Period możemy uzyskać większą/mniejszą rozdzielczość naszego kanału. W tym przypadku możemy zmieniać wypełnienie naszego sygnału od 0 do 20ms (bo mamy 50 Hz), a nasz rejestr może przyjmować wartości od 0 do 1680. W tym przypadku jest to dość spora i wystarczająca wartość, ale gdybyśmy ustawili TIM_Prescaler nie na 1000, ale na 10000, wówczas TIM_Period mógłby przyjmować wartości od 0 do 168, co już jest dość niską wartością.

  • Lubię! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...