STM32F429 Clock Configuration and Timer
Daha ö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 !
Son yorumlar