Skocz do zawartości
Mellon

Sygnały zegarowe i procedura startowa STM32

Pomocna odpowiedź

Warto może dodać odcinek o sygnałach zegarowych i procedurze uruchamiania mikrokontrolera.

Treker // Posty zostały wydzielone z poniższego tematu:

 

Udostępnij ten post


Link to post
Share on other sites

W sumie taki był pierwotny plan... przynajmniej jak chodzi o sygnały zegarowe. Ogólnie kurs powstał ze starszej wersji bazującej na stdperiph, a tam nie było potrzeby zmian ustawień bo domyślnie wszystko działało na 64 MHz. W nowej wersji miała być część o zegarach, ale jakoś się zgubiła.

Masz jakieś konkretne pytania odnośnie sygnałów zegarowych oraz procedury startowej, czy to była tylko taka ogólna uwaga?

Udostępnij ten post


Link to post
Share on other sites
Dnia 6.02.2018 o 22:38, DariuszC napisał:

Witam

Nucleo-F103RB bez problemu działa na 72MHz o ile jest w całości z programatorem. Wtedy z niego idzie sygnał taktujący 8MHz do głównego modułu.

W CubeMX trzeba wybrać RCC->High Speed Clock (HSE) -> Bypass Clock Source.

Zresztą w schemacie do Nucleo jest to połączenie.

Natomiast po rozdzieleniu to już tylko HSI lub trzeba wlutować kwarc wraz z kondensatorami.

Pozdrawiam

Zgadza się. Sygnał MCO z programatora jest podłączony do F103RB (poprzez zworki SB16, SB50). Jeśli mikrokontroler programatora(STM32F103CBT6) ma ustawiony MCU na HSE to mamy 8 MHz.

Warto byłoby wiedzieć jak w HAL ustawiane są sygnały zegarowe. Wiem, że najpierw ustawiany jest wewnętrzny zegar HSI potem jak on się poprawnie uruchomi to można zmienić na HSE. Ale warto co na jakiej szynie czym jest taktowane.

Udostępnij ten post


Link to post
Share on other sites

W tym kursie podjęliśmy decyzję zostania tylko przy wbudowanym generatorze RC, więc jeśli już to i tak ten brakujący odcinek byłby o uzyskaniu 64MHz za pomocą PLL.

Ponieważ ta dyskusja nie ma związku z GPIO, proponowałbym założyć nowy temat. Inaczej będzie dużo wpisów, niezwiązanych z głównym wątkiem.

Udostępnij ten post


Link to post
Share on other sites

Ja bym proponował napisać odcinek kursu. To wszyscy by zrozumieli co i jak. Bez tego to czarna magia będzie dla innych czemu z 72MHz zmieniamy na 8MHz. Jak coś napiszę mogę podesłać.

Udostępnij ten post


Link to post
Share on other sites

Tak jak napisałem powyżej - proponuję dyskusję o zegarach wydzielić z GPIO, najlepiej do nowego wątku.

Natomiast nic się z 72MHz nie zamieniło na 8MHz - to właśnie 8MHz jest domyślną konfiguracją, biblioteka HAL w odróżnieniu od stdperiph nie zmienia domyślnych ustawień. Dopiero programista może wybrać jak chce skonfigurować taktowanie procesora i peryferiów. W przypadku generatora wbudowanego maksymalne taktowanie to 64MHz, ale nawet z sygnałem zewnętrznym wcale nie trzeba zawsze ustawiać 72MHz. Warto chociaż wiedzieć, że są inne możliwości.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
#include "stm32f1xx.h"
 
int main(void)
{
    SystemCoreClock = 8000000; // taktowanie 8Mhz
 
    HAL_Init();

Przyznasz, że to dziwna konstrukcja.

Edytowano przez Mellon

Udostępnij ten post


Link to post
Share on other sites

Tak, ta zmienna ma złą wartość. Ale takie przypisanie nie zmienia taktowania jeśli o to chodzi - ewidentnie autorzy HAL podczas testowania przegapili inne możliwości. To nie jedyny błąd w tej bibliotece niestety.

Udostępnij ten post


Link to post
Share on other sites

Zgodnie z sugestią posty zostały wydzielone z komentarzy do artykułu na temat GPIO.

Udostępnij ten post


Link to post
Share on other sites

Korzystając z rezonatora w programatorze:

HAL_Init();

	RCC_OscInitTypeDef  osc;
	osc.OscillatorType = RCC_OSCILLATORTYPE_HSE;
	osc.HSEState = RCC_HSE_BYPASS;
	osc.HSIState = RCC_HSI_OFF;
	osc.PLL.PLLState = RCC_PLLSOURCE_HSE;
	osc.PLL.PLLMUL = RCC_PLL_MUL9;
	HAL_RCC_OscConfig(&osc);

	RCC_ClkInitTypeDef clk;
	clk.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
			| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
	clk.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
	clk.AHBCLKDivider = RCC_SYSCLK_DIV1;
	clk.APB1CLKDivider = RCC_HCLK_DIV2;
	clk.APB2CLKDivider = RCC_HCLK_DIV1;

	HAL_RCC_ClockConfig(&clk, FLASH_LATENCY_2);

	SystemCoreClockUpdate();

Tylko nie wiem jak sprawdzić częstotliwość rdzenia z jaką on rzeczywiście pracuje?

Udostępnij ten post


Link to post
Share on other sites

Wpisy w tym wątku powinny dotyczyć kursu oraz GPIO - administrator wydzielił poprzednią część dyskusji do nowego wątku

Wydaje mi się że powinniśmy przenieść tam ewentualną dyskusję o taktowaniu STM32.

Udostępnij ten post


Link to post
Share on other sites

Mam pytanie dot. przerwań.

W SPL wyglądało to tak:

  1. wybranie grupy priorytetów (jest w HAL_Init())
  2. ustawienie priorytetu i sub-priorytetu, kanału i jego włączenie NVIC_InitStruct :NVIC_Init
  3. Skonfigurowanie GPIO :GPIO_Init
  4. Ustawienie źródła przerwania GPIO_EXTILineConfig
  5. Skonfigurowanie kontrolera zewnętrznych przerwań/zdarzeń (sygnał opadający/rosnący oba): EXTI_Init()
  6. Utworzenie funkcji przerwania.

Jak ustawić priorytety przerwania w HAL?

Udostępnij ten post


Link to post
Share on other sites

Domyślam się, że pytasz o HAL_NVIC_SetPriority oraz HAL_NVIC_SetPriorityGrouping - możesz równie dobrze  bezpośrednio używać CMSIS, ale te funkcje powinny pomóc.

Jeśli przeniesiesz poprzedni post dotyczący taktowania do utworzonego wątku to możemy dalej porozmawiać jak używać zewnętrznego generatora oraz PLL.

  • Lubię! 1
  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

Tematy zostały połączone.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Dzięki Elvis

Dnia 27.10.2018 o 21:31, Elvis napisał:

Domyślam się, że pytasz o HAL_NVIC_SetPriority oraz HAL_NVIC_SetPriorityGrouping - możesz równie dobrze  bezpośrednio używać CMSIS, ale te funkcje powinny pomóc.

Jeśli przeniesiesz poprzedni post dotyczący taktowania do utworzonego wątku to możemy dalej porozmawiać jak używać zewnętrznego generatora oraz PLL.

Właśnie tego brakowało w kursie o przerwaniach.

Wystarczy pierwsza z nich. Drga służy do wybrania grupy od 1 do 4 (priorytetów i podpriorytetów)

HAL_NVIC_SetPriority(EXTI15_10_IRQn,0,0);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

 

Edytowano przez Mellon

Udostępnij ten post


Link to post
Share on other sites

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