STM32F429 Clock Configuration and Timer

unnamedDaha önce 8/16 bitlik işlemcilerle çalışmış biri için ARM mimarisine sahip işlemcilerle çalışmak bir hayli zor gelir hele ki akla gelen ilk soru “Clock” ayarlarıdır.STM32F429 Discovery kitiyle çalışırken bu ayarların nasıl yapıldığını bir kenara not alarak basit bir uygulama gerçekleştirdim.Bu örnek Clock ayarlarının nasıl yapıldığı hakkında fikir verecek ve ne kadar basit olduğunu gösterecektir.

Derleyici olarak Em:.Blocks kullanıyordum.Fakat yakın yeni sürüm olarak Embitz ile devam ediyorum.Standart Peripheral Library ile uygulamalara devam ediyorum.

Öncelike bir proje oluşturalım.Bu kitte STM32F429ZI işlemcisi bulunmaktadır.180 MHz de çalışan bu canavar 2MB kod hafızasına ve saymakla bitmeyecek çevre birimlerine sahiptir.Projeyi açtıysak ilk olarak stm32f4xx.h dosyasında HSE (High Speed External ) tanımlamasını düzeltmemiz gerekli.Normalde bu şu şekilde tanımlanmıştır.

#if !defined (HSE_VALUE)
#define HSE_VALUE ((uint32_t)25000000)
#endif

Kitin üzerinde 8MHz OSC bulunuyor bunu 8MHz olarak ayarlayalım.

#if !defined (HSE_VALUE)
#define HSE_VALUE ((uint32_t)8000000)
#endif

İkinci adımda system_stm32f4xx.c dosyasını açıyoruz.Bu dosyada şu bölümü görmekteyiz.

/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M 25
#define PLL_N 336

/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P 2

/* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */
#define PLL_Q 7

Buradan özetle şunu anlayabiliriz SYSCLK = (((HSE or HSI) / PLL_M) * PLL_N) / PLL_P dir.

Maksimum hız bu tanımlamaları şu şekilde düzenliyoruz.

/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M 8
#define PLL_N 360

/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P 2

/* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */
#define PLL_Q 7

Buradan 8 / 8 * 360 / 2 ile 180 değerini elde ederiz.3.adımda yine aynı dosyadan

uint32_t SystemCoreClock = 168000000;

değerini 180MHz olarak değiştirmeliyiz.

uint32_t SystemCoreClock = 180000000;

Ve son olarak main fonksiyonunun en üstüne aşağıdaki kodları ekliyoruz.

#include “stm32f4xx_conf.h”

int main(void)
{
	//Enable HSE clock
	RCC_HSEConfig(RCC_HSE_ON);

	//Wait for clock to stabilize
	while (!RCC_WaitForHSEStartUp());

	for(;;)
	{

	}
}

Bu işlemler tamamlandığına göre basit bir Timer uygulaması yapalım.Bu örnekde TIM2 kullandım.

int main(void)
{
	//Enable HSE clock
	RCC_HSEConfig(RCC_HSE_ON);

	//Wait for clock to stabilize
	while (!RCC_WaitForHSEStartUp());

	// GPIO Configuration
	GPIO_Config();

	// TIMER2 and NVIC Configuration
	TIMER2_Config();

	for(;;)
	{

	}
}

GPIO_Config

void GPIO_Config(void)
{
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);

	GPIO_InitTypeDef GPIO_InitStructure;

	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

	GPIO_Init(GPIOG, &GPIO_InitStructure);
}

TIMER2_Config

void TIMER2_Config(void)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

	TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 1000 – 1;
	TIM_TimeBaseInitStructure.TIM_Prescaler = 84 – 1;

	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	TIM_Cmd(TIM2, ENABLE);

	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);
}

Ve son olarak kesme fonksiyonu

void TIM2_IRQHandler(void)
{
	static uint8_t tick = 0;

	if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
	{
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

		if(tick++ == 100)
		{
			tick = 0;
			GPIO_ToggleBits(GPIOG, GPIO_Pin_13);
		}
	}
}

GPIOG.13 dek LED’in hızlı bir şekilde blink olduğunu görebilirsiniz.Şimdilik bu kadar.

Esen Kalın !

 

 

You may also like...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir