Monday, February 22, 2016

IRQHandler pada StdPeriph dan Cube HAL

Latar belakang saya menulis postingan ini adalah saya ingin membahas tentang interrupt pada usart dari sudut pandang Cube HAL, namun setelah dipikir pikir, akan lebih mudah menjelaskan atau mempelajari perbedaan antara kode pada StdPeriph dengan kode Cube HAL jika penjelasannya menggunakan contoh external interrupt. Baiklah mari kita mulai dari sesuatu yang telah ada lebih dulu yaitu StdPeriph. untuk style ini saya menggunakan IDE CoIDE, sementara untuk Cube HAL saya akan menggunakan trueStudio. Berikut ini adalah beberapa alasan pembelaan diri saya.

Mengapa saya menggunakan dua IDE yang berbeda dalam percobaan ini atau lebih tepatnya dalam postingan ini, karena untuk contoh project penggunanan StdPeriph sangat mudah diperoleh pada CoIDE, sementara untuk Cube HAL, contoh project interupt tersedia untuk empat IDE yaitu IAR, Keil, TrueStudio dan SW4STM (AC6). Mengapa saya memilih trueStudio, karena dari keempat contoh project yang ada sebenarnya ada dua yang berbasis eclipse, namun saya lebih memilih trueStudio, karena menganggap IDE ini lebih stabil dari lainya.

Baiklah, mari kita mulai mengupas... bukan perbedaan melainkan gaya penulisannya pada masing masing project. karena pada akhirnya register yang diakses adalah sama karena untuk tujuan yang sama juga. yaitu untuk menangani eksternal interupsi yang terjadi pada sistem.

  • Bentuk struktur dari project
Pertama yang ingin saya tunjukkan adalah perbedaan struktur project dari kedua style ini, yaitu sebagai berikut

Dari struktur project dapat kita lihat perbedaan yang signifikan. pertama dari group file CMSIS, Pada StdPeriph terdiri dari tiga file, sementara pada Cube HAL hanya terdapat satu file. Pada postingan ini tidak akan membahas lebih dalam mengapa hal itu berbeda. Selanjutnya kita masuk pada inti dari pembahasan dari blog ini yaitu penelusuran intrrupt dan perbedaan pola penulisannya.
  • EXT INTERRUPT
Berikut ini adalah contoh kode yang terpada pada StdPeriph style.
void EXTI15_10_IRQHandler(void)
{
  if (EXTI_GetITStatus(USER_BUTTON_EXTI_LINE) != RESET)
  {  
    if(BlinkSpeed == 1)
    {
      BlinkSpeed = 0;
    }
    else
    {
      BlinkSpeed ++;
    }
    /* Clear the EXTI line pending bit */
    EXTI_ClearITPendingBit(USER_BUTTON_EXTI_LINE);
  } 
}
Potongan kode di atas merupakan fungsi IRQHandler, yaitu fungsi yang akan dieksekusi jika terjadi interupsi eksternal. Label USER_BUTTON_EXTI_LINE  adalah label yang bebas didefinisi oleh programer, label menunjukkan line external interupt yang digunakan. Misalnya dalam hal ini USER_BUTTON_EXTI_LINE = EXTI_Line13,  line ini menunjukkan bahwa yang difungsikan untuk menerima sinyal interrupt eksternal adalah pin 13. Pada contoh kode diatas, penanganan aksi dari interupsi yang terjadi langsung dilakukan dalam fungsi tersebut. Pada contoh ini aksi dari interupsi adalah mengubah kecepatan kedip dari LED. Mari kita tinjau kode pada project dengan Cube HAL style.
void EXTI15_10_IRQHandler(void)
{
  HAL_GPIO_EXTI_IRQHandler(USER_BUTTON_PIN);
}
Kode di atas adalah kode yang terdapat dalam file stm32f1xx_it.c. Fungsi yang menangani jika terjadi interupsi... bisa kita lihat... isi dari fungsi ini hanya satu baris.... waw... mari kita telusuri apa yang ada di balik satu baris ini...
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  /* EXTI line interrupt detected */
  if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET) 
  { 
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
    HAL_GPIO_EXTI_Callback(GPIO_Pin);
  }
}
Setelah klik, ternyata isi dari fungsi HAL_GPIO_EXTI_IRQHandler(USER_BUTTON_PIN); adalah seperti list kode di atas. Mari kita lihat, apakah fungsi ini sudah menunjukkan suatu aksi jika interupsi itu terjadi... ternyata belum, fungsi ini bukan lah akhir yang menunjukkan aksi dari suatu interupsi. dalam fungsi ini masi ada fungsi lain yaitu HAL_GPIO_EXTI_Callback(GPIO_Pin);. Baiklah. mari kita lihat apa isi dari fungsi ini... CTRL+Klik. Kemudian saya diarahkan ke sebuah fungsi yang diawali dengan __weak  hem... sesuatu hal yang baru bagi saya. setelah di googling saya menemukan link ini. Ternyata fungsi itu bukan berisi kode yang saya cari. setelah ditelusuri ternyata ada fungsi lain yang memiliki nama yang sama dan berisi seperti pada list kode di bawa ini
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if (GPIO_Pin == GPIO_PIN_0)
  {
    /* Toggle LED3 */
    BSP_LED_Toggle(LED3);
  }
}
Jika dilihat isi dari fungsi di atas, fungsi ini berisi suatu aksi yaitu toggle LED. Sehingga fungsi ini merupakan akhri interupsi yang terjadi. Gambar berikut menunjukkan inti dari blog ini, yaitu sebuah ilustrasi dengan Diagram Use Case, bagaimana sebuah interup ditangani berdasarkan dua style project yang ada.


No comments:

Post a Comment