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--){}
}
No comments:
Post a Comment