PLL adalah mesin pembangkit clock yang pakai Pertamax! 🙂
Jika angka clock 16MHz bisa jadi 100MHz, 8MHz naik jadi 420MHz, maka PLL adalah tersangka utama. Tapi jika 16 Juta bisa jadi 100 Juta dalam 3 bulan (janjinya), itu investasi bodong! lol
Setelah reset, sumber clock utama yang dipakai STM32 adalah HSI (High Speed Internal clock). Jika ingin memakai HSE (High Speed External clock), STM32 perlu di konfigurasi lebih dulu. Sebagai contoh, STM32F411CE punya HSI sebesar 16MHz. Bagi penggemar balapan, angka 16MHz ini termasuk kecil jika berurusan dengan jeroan perangkat yang bisa dipacu dengan kecepatan tinggi (tergantung spek dan kebutuhan). Jika pakai HSE, biasanya xtal yang dipakai 8MHz-25MHz. Ini juga termasuk kecil jika dibanding spek mesin STM32F411 yang bisa 100MHz. Untuk tipe STM32H743 misalnya, jeroan chip ini bisa dipacu sampai 420MHz!
Untuk HSI, karena menggunakan rangkaian internal osilator RC, tingkat presisi dan kestabilan HSI tidak akan sebaik HSE yang menggunakan xtal. Untuk kecepatan tinggi dengan PLL, HSE adalah pilihan terbaik.
Gambaran besar sistem clock STM32 seperti di bawah. Peripheral APB1 dan 2 misalnya mendapat supply 16MHz. AHB juga dapat jatah 16MHz. PLL bisa dipakai atau tidak dalam sistem clock STM32. Hanya saja, untuk pengaturan yang rigid, PLL diperlukan. Jika tidak, opsi besaran frekuensi akan terbatas.

Bagian PLL punya nama blok M,N,P, dan Q. Blok Q khusus untuk Sumber clock urusan USB yang perlu tepat 48MHz. Kalau kurang jatahnya, bisa “ngambek” USB nya lol. Sedang kecepatan 96+MHz mewajibkan waktu baca flash jadi 2WS. Kalau tidak sistem angkat tangan alias hang karena terlalu cepat.
Menghitung manual akan menghasilkan ribuan kombinasi nilai clock yang tidak semuanya bisa dipakai. Ada batasan besar frekuensi. Misal blok APB1 maksimal 50MHz, APB2 100MHz. Tergantung dari tipe STM32 yang dipakai.

Cara termudah untuk mengetahui faktor pembagi dan pengali di PLL adalah lewat simulasi di STM32CubeMX atau STM32CubeIDE. Gambar di bawah digunakan HSE 25MHz. Xtal onboard 25MHz sudah terpasang pada board Black Pill. Cek skema untuk memastikan.
Selanjutnya akan diatur max speed dari STM32 ini. Cepat itu baik untuk unjuk gigi kalau I/O pin STM32 bisa sampai 50MHz spek nya.
Blok M :

Pengaturan PLL ada pada register PLLCFGR. Untuk mencapai nilai max 100MHz pada HCLK, maka faktor pembagi pada blok M adalah 12. Mengapa 12? Sebenarnya tidak harus 12. Boleh angka lain.
Frekuensi yang keluar dari blok M dibatasi antara 1MHz – 2 MHz. Tidak boleh lebih dari 2MHz agar tidak muncul variasi signal – PLL Jitter berlebih. Nilai M punya syarat 2<=M<= 63. Jadi nilai M ini boleh diisi 32 , boleh 63, tapi tidak boleh 3, atau 5, apalagi 1 lol.
(Nilai HSE 25MHz/5=5MHz. Meski nilai M=5 masuk syarat dan ketentuan, tapi tidak sah karena hasil bagi lebih dari 2MHz)

Dengan Xtal HSE 25MHz, jika faktor pembagi pada blok M adalah 12, maka nilai yang didapat 2,0833MHz. Untuk menghasilkan faktor pembagi 12, perlu dilakukan konfigurasi pada register PLLCFGR.
STM32CubeIDE dapat memproses otomatis untuk membangkitkan kode ala HAL atau LL. Tapi memahami bagaimana cara kerja berdasar register lebih berharga dimasa depan. Apalagi calon mertua Anda seorang “embedded engineer”.


Pada gambar di atas, Bit PLLM Division factor di mulai dari PLLM5 – PLLM0. Jika diinginkan nilai 12, maka perlu set nilai 0b01100.
Blok N :
Nilai pengali N adalah 50<=N<=432. Silahkan main petak umpet dengan range nilai sebanyak itu hehe. Simulasi menganjurkan nilai 96. Jika dihitung, 2,08333 * 96 = 200MHz. Jadi pada blok N ini dihasilkan nilai 200MHz. Output pada blok N ini mesti diantara 100-432MHz. Nilai 200MHz masih dalam range, jadi tidak masalah.


Blok P :
Selanjutnya masuk blok pembagi P. Syarat utama blok ini : nilai output dari blok P ini tidak boleh lebih dari 100MHz. Ini untuk STM32F411. Lebih dari itu bakalan rontok jeroan gigi mesin :).

Output frekuensi blok P dari PLL sudah berhasil mencapai angka 100MHz. Trus bagaimana dengan blok Q?
Sebelum lanjut ke blok Q, bereskan urusan dengan AHB dan APB1 prescaler! PCLK1 mesti 50MHz karena APB1 Peripheral Clock max 50MHz. Jika tidak butuh lanjut ke Q, start PLL.

Blok Q :
Ada kompromi tertentu yang mesti diketahui. Mengatur frekuensi max misal PLLCLK 100MHz untuk STM32F411 bisa jadi mengabaikan syarat clock perangkat lain. Misal frekuensi 48MHz untuk USB yang tidak bisa tercapai.
Dalam kasus ini, blok Q menyerah jika diminta setor 48MHz (sedang blok P tetap ngotot minta 100MHz).
Kecerdasan buatan paling canggih sedunia tidak akan bisa menyelesaikan hitungan ini. PLLCLK minta 100MHz sedang output blok Q minta 48MHz pas. Garry Kasparov pun angkat tangan.
Untuk detail pemrograman bisa dilihat di Github ini. HSI pun lewat PLL bisa di set untuk max PLLCLK 100MHz jika ingin. Tapi akurasi adalah taruhannya. Untuk mengetahui apakah PLL dan speed clock yang diinginkan sesuai, gunakan Timer atau SysTick dan ukur hasilnya di osiloskop atau logic analyzer.
Kesimpulan :
Jika ingin cepat, gunakan PLL. Tidak ada jalan lain. Tanpa pengaturan, default clock HSI yang dipakai dan PLL tidur. Gunakan STM32CubeMX untuk simulasi sepuas hati.
Aktifkan opsi HSE –> Pilih “Main PLL” sebagai sumber clock –> M –> N–> P–> Q (jika perlu).–> AHB/APB1,2 prescaler –> test dengan SysTick/Counter