LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
IoT

Sygnały zegarowe w STM32F1 Connectivity Line

Listing 1. Konfiguracja bloku RCC (Reset and Clock Control)

void RCC_Configuration(void)
{
	u16 StartUpCounter=0;
	uint32_t HSEStatus;

	/* Włącz HSE */
	RCC_HSEConfig(RCC_HSE_ON);

	/* Czekaj, aż HSE sie uruchomi lub zostanie przekroczony dozwolony czas */
	do
	{
		StartUpCounter++;
	} while((RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET) &&
						(StartUpCounter != HSEStartUp_TimeOut));

	if(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == SET)
	{
		HSEStatus = SUCCESS;
	}
	else
	{
		HSEStatus = ERROR;
	}

	if (HSEStatus == SUCCESS)
	{
		FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

		/* 2x "waitstate" */
		FLASH_SetLatency(FLASH_Latency_2);

		/* HCLK = SYSCLK */
		RCC_HCLKConfig(RCC_SYSCLK_Div1);

		/* PCLK2 = HCLK */
		RCC_PCLK2Config(RCC_HCLK_Div1);

		/* PCLK1 = HCLK/2 */
		RCC_PCLK1Config(RCC_HCLK_Div2);

		/* PREDIV2: PREDIV2CLK = HSE / 2 = 5 MHz */
		RCC_PREDIV2Config(RCC_PREDIV2_Div2 );

		/* PLL3: PLL3CLK = (HSE / 2) * 10 = 50 MHz */
		RCC_PLL3Config(RCC_PLL3Mul_10);
		/* Włacz PLL3 */
		RCC_PLL3Cmd(ENABLE);
		while(RCC_GetFlagStatus(RCC_FLAG_PLL3RDY) == RESET);

		/* MCO: MCO_OUT = PLL3 / 2 = 25 MHz*/
		RCC_MCOConfig(RCC_MCO_PLL3CLK_Div2);

		/* PLL2: PLL2CLK = (HSE / 2) * 8 = 40 MHz */
		RCC_PLL2Config(RCC_PLL2Mul_8);
		RCC_PLL2Cmd(ENABLE);
		while(RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET);

		/* PREDIV1: PREDIV1CLK = PLL2 / 5 = 8 MHz */
		RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div5);

		/* PLL: PLLCLK = PREDIV1 * 9 = 72 MHz */
		RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9);

		/* Wlasz PLL */
		RCC_PLLCmd (ENABLE);
		while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

		/* PLL źródlem SYSCLK */
		RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
		while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08);

		/* Źródło taktowania USB */
		RCC_OTGFSCLKConfig(RCC_OTGFSCLKSource_PLLVCO_Div3);

		/* Włączenie taktowania ETHERNET i USB */
		RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ETH_MAC | RCC_AHBPeriph_ETH_MAC_Tx |
							RCC_AHBPeriph_ETH_MAC_Rx | RCC_AHBPeriph_OTG_FS, ENABLE);
	}

	/* Wlącznie taktowania GPIO */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
						   RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
						   RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
}

 

Domyślnie po włączeniu zasilania mikrokontroler używa do pracy wewnętrzny generator RC o częstotliwości około 8 MHz. Szybki oscylator zewnętrzny (HSE – High Speed External), zanim zostanie użyty, musi zostać włączony. Działanie to realizuje wywołanie funkcji RCC_HSE_Config. Następnie w pętli sprawdzany jest stan flagi, która informującej o tym, czy HSE został poprawnie uruchomiony. Oczekiwanie na poprawne włączenie się oscylatora trwa do 1280 (szesnastkowo 0x0500) wywołań pętli. Wartość ta jest określona przez definicję HSEStartUp_TimeOut. Ograniczenie liczby wywołań pętli służy zabezpieczeniu przed zablokowaniem się w przypadku braku poprawnej inicjalizacji HSE. W bibliotece API dostarczanej przez firmę STMicroelectronics dyrektywy preprocesora umieszczone są w pliku stm32f10x.h.

Jeśli flaga HSERDY po przekroczeniu czasu wyznaczonego przez pętlę jest nadal wyzerowana, to wtedy instrukcja warunkowa zapisuje do zmiennej statusu HSEStatus wartość ERROR. Wystąpienie takiej sytuacji skutkuje przerwaniem procesu konfiguracji sygnałów zegarowych, włączane jest jedynie taktowanie dla portów wejścia/wyjścia. W przypadku poprawnego startu HSE rozpoczyna się właściwy proces konfiguracji RCC. W ramach ,którego ustawiane są m. in. mnożniki i dzielniki sygnałów zegarowych.

Pamięć FLASH wbudowana w mikrokontrolery STM32 serii F1 może pracować z maksymalną częstotliwością 24 MHz, w związku z czym należy ustawić dla niej tzw. „wait state”, czyli opóźnienie.

Dalej konfiguracja odbywa się jakby od końca. Najpierw ustalane są częstotliwości sygnałów wyznaczanych na podstawie zegara systemowego SYSCLK, a więc taktowanie wszystkiego, co jest podłączone do magistrali AHB (patrz rys. 2). Wybierane jest źródło sygnału zegarowego m. in. dla: rdzenia mikrokontrolera, magistral APB1 (PCLK1) i APB2 (PCLK2), opcjonalnie również taktowanie przetworników A/C, liczników itd.. Dodać tu należy, że magistrala APB1 może być taktowana sygnałem o maksymalnej częstotliwości 36 MHz, natomiast dla magistrali APB2 jest to wartość 72 MHz.

Gdy fragment bloku RCC podłączony do magistrali AHB ma ustalone swoje parametry pracy, należy przystąpić do właściwej konfiguracji układów PLL, multiplekserów i dzielników.

Polski portal branżowy dedykowany zagadnieniom elektroniki. Przeznaczony jest dla inżynierów i konstruktorów, projektantów hardware i programistów oraz dla studentów uczelni technicznych i miłośników elektroniki. Zaglądają tu właściciele startupów, dyrektorzy działów R&D, zarządzający średniego szczebla i prezesi dużych przedsiębiorstw. Oprócz artykułów technicznych, czytelnik znajdzie tu porady i pełne kursy przedmiotowe, informacje o trendach w elektronice, a także oferty pracy. Przeczyta wywiady, przejrzy aktualności z branży w kraju i na świecie oraz zadeklaruje swój udział w wydarzeniach, szkoleniach i konferencjach. Mikrokontroler.pl pełni również rolę patrona medialnego imprez targowych, konkursów, hackathonów i seminariów. Zapraszamy do współpracy!