December 5, 2021

Blogna Kang U-2 Man

STM32, Embedded System, Microcontroller, ARM Cortex-M, RTOS, FreeRTOS

Blue Pill + STM32CubeIDE: Blink with out Delay

3 min read

بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيم

Ada satu fungsi, yang menurut saya sangat terkenal di komunitas Arduino, yaitu fungsi millis(). Berdasarkan definisinya fungsi millis akan memberikan nilai mili detik sejak board Arduino dijalankan. Artinya ketika fungsi ini dipanggil 1 detik setelah board dijalankan, maka fungsi millis() akan memberikan nilai 1000.

Fungsi millis() sering digunakan untuk membuat program non-blocking. Dalam tutorial sebelumnya untuk mengedipkan LED digunakan fungsi HAL_Delay(). Fungsi delay pada dasarnya hanya menghabiskan waktu prosesor dengan menghitung, sehingga pada saat menjalankan fungsi delay, prosesor terblok untuk melakukan fungsi lain. Dengan menggunakan fungsi millis(), program bisa diakalin untuk tidak menggunakan delay. Fungsi delay digantikan dengan membandingkan nilai millis() yang sekarang dengan nilai millis() sebelumnya. Apabila perbedaannya belum sesuai, maka prosesor bisa mengerjakan fungsi lain. Hal inilah yang menyebabkan fungsi millis() disamakan dengan multi task, tentu saja ini tidak benar, karena prosesor tetap melakukan kerja di loop atau fungsi yang sama, hanya tertahan oleh pernyataan if-else.

Fungsi millis() sebenarnya bukan sesuatu yang baru, di pemrograman desktop (PC) ada fungsi Win API (Application Programming Interface) yang fungsinya sama dengan millis(), yaitu fungsi GetTickCount. Begitu juga di HAL STM32 ada fungsi yang berfungsi sama dengan fungsi millis(), yaitu fungsi HAL_GetTick().

Di Arduino, fungsi millis() berjalan melalui sebuah timer sebagai dasar pewaktuan (time base), yang diatur untuk berinterupsi setiap 1 mili detik. Di STM32 juga sama. Secara default, pada saat pembuatan proyek dengan STM32CubeMX, dasar pewaktuan akan menggunakan timer SysTick. Timer SysTick merupakan timer yang menjadi bagian dari core ARM Cortex-M3. Artinya semua prosesor ARM Cortex-M3 akan mempunyai timer SysTick, walaupun beda pabrik pembuatnya.

Perhatikan kembali program yang dibuat di tutorial sebelumnya. Fungsi main() pasti akan selalu diawali dengan memanggil fungsi HAL_Init() kemudian dilanjutkan dengan memanggil fungsi SystemClock_Config(). Fungsi HAL_Init() pada dasarnya akan menginisialisasi pustaka HAL, flash memori dan juga menginisialisasi timer SysTick, dengan memanggil fungsi HAL_InitTick. Namun pada saat ini, prosesor masih bekerja dengan menggunakan osilator internal (HSI) dan sistem clock diatur di 16 MHz.

Setelah memanggil fungsi HAL_Init, program kemudian akan memanggil fungsi SystemClock_Config(), yang akan menkonfigurasi sistem sesuai dengan yang diinginkan, yaitu 72 MHz dengan kristal 8 MHz, dengan mengkonfigurasi PLL. Karena sistem clock berubah, maka timer SysTick harus diinisialisasi kembali dengan clock yang baru, yaitu 72 MHz.

Timer SysTick diatur untuk berinterupsi setiap 1 mili detik. Rutin interupsi SysTick (SysTick_Handler) hanya melakukan penambahan sebuah variabel (variabel uwTick). Setiap terjadi interupsi timer SysTick, variabel uwTick akan ditambah dengan uwTickFreq (dalam hal ini 1). Fungsi layanan interupsi, ada di file stm32f1xx_it.c.

Dan fungsi HAL_GetTick hanya membaca nilai uwTick tersebut.

Untuk memanfaatkan fungsi HAL_GetTick dalam program non-blocking, cukup dengan sebuah variabel yang akan menyimpan nilai uwTick yang sekarang. Kemudian variabel tersebut dibandingkan dengan uwTick berikutnya, jika perbedaanya sudah sesuai dengan nilai delay yang diinginkan, maka program akan mengeksekusi perintah yang sudah ditentukan. Berikut contoh blink LED dengan fungsi HAL_GetTick. Variabel ledtimer (integer 32 bit) digunakan untuk menyimpan nilai uwTick. Nilai ini kemudian digunakan untuk mengurangi nilai uwTick berikutnya (melalui fungsi HAL_GetTick), jika selisihnya sudah sesuai dengan yang diinginkan (misal 100 milidetik), maka program akan men-toggle LED yang terhubung ke PC13 di board blue pill.

Semoga bermanfaat…

Visits: 4 Visits: 97944

1 thought on “Blue Pill + STM32CubeIDE: Blink with out Delay

Leave a Reply

Your email address will not be published. Required fields are marked *

Copyright © All rights reserved. | Newsphere by AF themes.