Sunday, October 6, 2013

Setting Clock Pada STM32F4 Discovery

Setting Clock Pada STM32F4 Discovery

Menurut ST32 Reference manual (RM0090) terdapat tiga sumber clock untuk system clock (SYSCLK), yaitu:
1.      High Speed Internal (HSI) oscillator.
HSI pada STM32F4 mempunyai nilai 16MHz. Keuntungan menggunakan HSI rangaian tidak perlu menambahkan external clock. Tetapi HIS ini mempunyai frekuensi dengan akurasi yang lebih rendah.
2.      High Speed External (HSE) oscillator.
Dengan memasang external clock dimungkinkan meningkatkan akurasi dari frekuensi clock pada STM32. Pemasangan external clock bisa bermacam-macam antara 4-16MHz. Pada STM32F4 Discovery bernilai 8MHz.
3.      Phase Locked Loop (PLL).
PLL digunakan untuk mengalikan (multiply) input dari sumber clock HIS atau HSE.
Dan dua sumber clock sekunder, yaitu:
1.      Low Speed Internal (LSI) oscillator.
32kHz internal clock yang digunakan pada watchdog dan RTC untuk Auto Wake Up dari Stop/Standbye mode (optional).
2.      Low Speed External (LSE) oscillator.
32.768kHz external crystal clock yang digunakan untuk RTC clock.

Konfigurasi clock
1.      Download clock configuration tool dari ST,
2.      Buka file excelnya (enable macros diperlukan).
Pada HSE OSC atur menjadi 8MHz. Pada HCLK atur menjadi 168MHz. Klik RUN dan pilih sumber clock yang akan digunakan. Pada kasus ini dpilih HSE. Kemudian klik Generate sehingga muncul file system_stm32f4xx.c.

3.      Gunakan file ini pada project.
4.      Pada stm32f4xx.c pastikan HSE bernilai 8MHz.
#if !defined  (HSE_VALUE)
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */
5.      Pada startup_stm32f4xx.c lepaskan komen pada fungsi SystemInit().
6.      Pada file yang sama terdapat fungsi
void Default_Reset_Handler(void)
tambahkan SystemInit() sebelum main().
7.      Sehingga pada program utama bias ditambahkan
            RCC_HSEConfig(RCC_HSE_ON);
            while(!RCC_WaitForHSEStartUp()){}




Berikut contoh program membuat led berkedip
#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"

void kedip (void);
void delay(__IO uint32_t count);
void tunda(unsigned int isi);

void RCC_inisialisasi(void)
{
                RCC_HSEConfig(RCC_HSE_ON);
                while(!RCC_WaitForHSEStartUp()){}
                RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
}

void GPIO_inisialisasi(void)
{
                GPIO_InitTypeDef  GPIO_InitStruct;
                GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_12;
                GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
                GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
                GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
                GPIO_Init(GPIOD, &GPIO_InitStruct);
}

int main(void)
{
                RCC_inisialisasi();
                GPIO_inisialisasi();
    while(1)
    {
                kedip();
    }
}

void kedip (void){
                GPIO_SetBits(GPIOD, GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_12);
                tunda(10);
                GPIO_ResetBits(GPIOD, GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_12);
                tunda(10);
}

void tunda(unsigned int isi)
{
                unsigned int i;
                for(i=0;i<isi;i++)
                                delay(0xFFFF);

}
void delay(__IO uint32_t count)
{
                while(count--){}
}