Rabu, 11 Januari 2012

SETTING CLOCK STM32

Setting PLL

Standar clock eksternal yang disarankan untuk STM32 adalah 8 Mhz, sehingga STM32 bisa diseting pada frekuensi kerja 72 Mhz. Untuk beberapa aplikasi yang mengharuskan power saving, kita dapat menggunakan osilator internal, atau osilator eksternal tapi dibawah 8 Mhz.
Limitation
Jika kita ingin mengubah clock eksternal dari standar 8 Mhz, harus diperhatikan bahwa sumber clock STM32 mempunyai batasan dari min. 4 Mhz sampai maks. 16 Mhz. STM32 juga mempunyai 2 bus internal yang tidak boleh melebihi kecepatan tertentu. Kesalahan ini akan mengakibatkan kerusakan peripheral di dalam ST32 dan hal-hal yang tidak diharapkan lainnya.
  • APB1 (low speed) bus tidak boleh melebihi 36 Mhz
  • APB2 (high speed) bus tidak boleh melebihi 72 Mhz
RCC (Reset and Clock Control)
RCC digunakan untuk setting clock dan mereset STM32, RCC mempunyai register-register yang sama untuk keluarga STM32:
  • CR – Clock Control Register
  • CFGR – Clock Configuration Register
  • CIR – Clock Interupt Register
  • APB2RSTR - APB2 peripheral reset register
  • APB1RSTR - APB1 peripheral reset register
  • AHBENR - AHB Peripheral Clock enable register
  • AHB2ENR - APB2 peripheral clock enable register
  • AHB1ENR - APB1 peripheral clock enable register
  • BDCR - Backup domain control register
  • CSR - Control/status register
Hal pertama yang perlu dilakukan yaitu membuat RCC bekerja pada state yang diketahui, untuk memastikan STM32 mempunyai start-up yang stabil setiap saat. Program dibawah ini merubah clock ke clock internal , sehingga kita dapat menyeting clock sesuai dengan yang kita butuhkan seperti untuk aplikasi power saving

/* turn on the internal oscillator */
RCC->CR |= RCC_CR_HSION;

/* turn off the external oscillator, the clock security system, and the PLL */
RCC->CR &= ~(RCC_CR_HSEON | RC_CR_CSSON | RC_CR_PLLON);

/* disable and clear any pending interrupts  */

RCC->CIR = RCC_CIR_LSIRDYC | RCC_CIR_LSERDYC | RCC_CIR_HSIRDYC | RCC_CIR_HSERDYC | RCC_CIR_PLLRDYC | RCC_CIR_CSSC;

/* reset the CFG2 register */
RCC->CFG2 = 0x0;


Kemudian baru kita bisa melakukan setting clock, contoh di bawah ini asumsi clock eksternal 8 Mhz

/* turn on the external oscillator */
RCC->CR |= RCC_CR_HSEON;

/* wait for the HSE to become ready */
while(RCC->CR & RCC_CR_HSERDY == 0){}


Disini kita harus memasukkan timeout, untuk memastikan HSE menyala, jika tidak maka batalkan dan peringatkan user telah terjadi hardware fault.

Setting Clock (Final)

Sekarang clock telah bekerja pada state yang diketahui, kita dapat melakukan setting agar STM32 bekerja pada frekuensi yang diinginkan (pada contoh ini 72 Mhz)
Pertama kita harus mengatur flash pre-fetch buffer dan delay, karena flash mengikuti frekuensi kerja 72 Mhz. Program ini akan dijelaskan pada post selanjutnya.

/* turn on the flash pre-fetch buffer and set its wait state to 2 */
FLASH->ACR |= FLASH_ACR_PRFTBE;
FLASH->ACR  = (FLASH->ACR & ~FLASH_ACR_LATENCY) | FLASH_ACR_LATENCY_2;


Sekarang kita hapus seting PLL sebelumnya dan seting, karena clock eksternal yang kita gunakan yaitu 8 Mhz, maka untuk mendapatkan 72 Mhz, kita kalikan dengan 9. Untuk menghindari APB2 bus dari overclocking, kita butuh untuk membagi clock APB2 dengan 2, sehingga kita dapatkan 36 Mhz.

/* clear the PLL configuration bits */
RCC->CFGR &= ~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL);

/* set the PLL to use the external oscillator, and multiply by a factor of 9 (8mhz * 9 = 72) */
RCC->CFGR |= RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9;

/* set the divider for the main system clock (72 / 1 = 72) */
RCC->CFGR |= RCC_CFGR_HPRE_DIV1;

/* set the divider for the APB2 bus (72 / 1 = 72) */
RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;

/* set the divider for the APB1 bus (72 / 2 = 36) */
RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;


Sekarang kita butuh untuk mengaktifkan PLL dan menunggunya karena butuh beberapa microsecond agar PLL stabil. Setelah selesai, kita atur STM32 agar menggunakan PLL sebagai sumber clock.

/* turn on the PLL *
RCC->CR |= RCC_CR_PLLON;

/* wait till the PLL is ready (check for timeout here) */
while((RCC->CR & RCC_CR_PLLRDY) == 0){}

/* make the PLL the system clock */
RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_SW) | RCC_CFGR_SW_PLL;

/* wait for the PLL to become active */
while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) {}


Sekali lagi, dibutuhkan timeout pada loop ini untuk memastikan pengaturan telah berhasil, dan jika tidak maka peringatkan untuk hardware fault.

Over-clocking

Kita dapat melakukan overclock pada STM32, tapi akan sangat berbahaya karena akan mengakibatkan hal-hal yang tidak diinginkan. Tapi jika teman-teman ingin mencoba, pastikan untuk membagi clock APB1 dan APB2 dengan angka yang tepat.

Reference: STM32 Basic

Tidak ada komentar:

Posting Komentar

Related Posts Plugin for WordPress, Blogger...