Skocz do zawartości

STM32F103 bare metal - PWM nie działa


QAQAQ

Pomocna odpowiedź

Cześć, programuje swojego f103 w bare metal i zatrzymałem się na PWM. Mianowicie, postępuje zgodnie z krokami opisanymi w manualu ale wciąż nie mogę dojść dlaczego to nie działa. Używam timer'a 4 i kanału 4 (PB9) , zegar taktuję częstotliwością 32MHz przez HSI. Nieważne jakie ustawie duty cycle, czy to 50%, czy 25% czy 100% przy częstotliwości 1kHZ ciągle na wyjściu mam 0,1V - 0,3V. Nie posiadam oscyloskopu więc, nie mogę sprawdzić jak wygląda przebieg sygnału ale używam do pseudo testu zwykłej czerwonej diody LED, która oczywiście nie reaguje w żaden sposób na zmiany.

Załączam obecny kod odpowiedzialny za konfigurację portu i timera:

RCC->APB2ENR |= RCC_APB2ENR_IOPBEN | RCC_APB2ENR_AFIOEN;
	RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
	
	GPIOB->CRH |= GPIO_CRH_MODE9_0 | GPIO_CRH_MODE9_1 | GPIO_CRH_CNF9_1;
	GPIOB->CRH &= ~(GPIO_CRH_CNF9_0);
	
	TIM4->CCER |= TIM_CCER_CC4E;
	TIM4->CR1 |= TIM_CR1_ARPE;
	TIM4->CCMR2 |= TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4PE;
	
	TIM4->PSC = 32;
	TIM4->ARR = 1000;
	TIM4->CCR4 = 500;
	
	TIM4->EGR |= TIM_EGR_UG;
	TIM4->CR1 |= TIM_CR1_CEN;

 

Link do komentarza
Share on other sites

1 godzinę temu, Zealota napisał:

Wszystko wskazuje na to, że nie ustawiasz funkcji alternatywnych dla pinu.

Nie włączyłeś globalnej flagi TIM_BDTR_MOE - "Main output enable"

Hmm, wydaje mi się, że ustawiam funkcję alternatywną dla pinu, ponieważ powinienem ustawić w takim wypadku CNF na 10. A co to rejestru BDTR to chyba nie trzeba go obsługiwać w przypadku PWM? Bo do PWM wystarczą timery general purpose, a ten rejestr jest dla zaawansowanych timerów? W każdym bądź razie ustawienie tej flagi nie zmieniło niczego.

Link do komentarza
Share on other sites

6 godzin temu, QAQAQ napisał:

Hmm, wydaje mi się, że ustawiam funkcję alternatywną dla pinu

Źle spojrzałem i faktycznie  są bity ustawione. Co do MOE to faktycznie w tym przypadku nie jest wymagane.

Wg ustawień taktowania PWM to częstotliwość ustawiłeś na ok. 1000 Hz, około bo poprawne wartości PSC i ARR powinny być zmniejszone o 1.

Wrzuciłem Twój kod na BluePill i faktycznie mam na wyjściu PB9 1000 Hz - zatem kod dla PWM jest poprawny, może inne ustawienia masz niepoprawne, może ustawienia zegara powodują błąd i procesor nie startuje poprawnie.  Sprawdź w debuggerze.

Zmniejsz częstotliwość przebiegu do 1 Hz, podłącz diodę z rezystorem i wtedy będziesz mógł ocenić czy masz przebieg na wyjściu. Jeśli nie będzie efektu, to szukaj też błędów w połączeniach.

  • 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.