Jumat, 27 Desember 2024

Menggunakan NVIC pada STM32

Setting NVIC STM32

NVIC (Nested Vector Interrupt Controller) adalah pengontrol interrupt di dalam mikrokontroler STM32. NVIC bertugas menangani interrupt, termasuk prioritasnya, pengelolaannya, dan penanganan nested interrupt (interrupt bersarang). STM32CubeIDE menyediakan pengaturan untuk NVIC melalui STM32CubeMX, di mana Anda dapat mengonfigurasi interrupt secara visual.

Fungsi Utama NVIC

  1. Mengatur Prioritas Interrupt:

    • NVIC mendukung pengaturan prioritas interrupt untuk menentukan urutan penanganan jika beberapa interrupt terjadi secara bersamaan.
  2. Mengaktifkan atau Menonaktifkan Interrupt:

    • Anda dapat memilih interrupt mana yang diaktifkan atau dinonaktifkan.
  3. Mendukung Nested Interrupt:

    • NVIC memungkinkan interrupt dengan prioritas lebih tinggi untuk memutuskan interrupt dengan prioritas lebih rendah yang sedang berjalan.
  4. Mengelola Sistem Exception:

    • NVIC juga menangani exception dari sistem seperti Reset, NMI (Non-Maskable Interrupt), dan Hard Fault.

Komponen Utama NVIC

  1. Enable Register:

    • Menentukan apakah interrupt tertentu diaktifkan atau tidak.
  2. Priority Register:

    • Menentukan tingkat prioritas untuk setiap interrupt.
  3. Pending Register:

    • Menunjukkan apakah interrupt dalam keadaan pending (menunggu untuk dieksekusi).
  4. Active Register:

    • Menunjukkan apakah interrupt sedang aktif.

Konfigurasi NVIC di STM32CubeIDE

STM32CubeIDE memanfaatkan STM32CubeMX untuk konfigurasi NVIC secara mudah. Berikut langkah-langkahnya:

1. Buka Tab Configuration

  • Di STM32CubeIDE, buka tab Configuration untuk periferal yang membutuhkan interrupt (contoh: UART, Timer, EXTI).
  • Klik periferal yang diinginkan (misalnya USART1, TIM2, atau EXTI).

2. Konfigurasi Interrupt

  • Pada bagian NVIC Settings, Anda dapat:
    • Mengaktifkan interrupt.
    • Mengatur prioritas interrupt (0 adalah prioritas tertinggi, dan semakin besar angka prioritas semakin rendah).

3. Generate Code

  • Klik Project > Generate Code untuk menghasilkan kode C dengan konfigurasi NVIC yang Anda tentukan.

Pengaturan Prioritas NVIC

STM32 menggunakan pengaturan prioritas interrupt dengan grouping (grup prioritas). Grup ini membagi prioritas menjadi dua bagian:

  1. Pre-emption Priority:
    • Menentukan interrupt mana yang dapat memutus interrupt lainnya.
  2. Subpriority:
    • Menentukan urutan jika dua interrupt dengan prioritas sama terjadi.

Contoh Prioritas:

Pre-emption Priority

Subpriority

Hasil

0

0

Paling prioritas

1

0

Kedua paling prioritas

0

1

Sama level dengan pre-emption, tetapi lebih rendah subprioritasnya.

Pengaturan Prioritas di STM32CubeMX:

  1. Pilih System Core > NVIC di STM32CubeMX.
  2. Tentukan priority grouping.
    • Misalnya 4 bits for pre-emption priority, 0 bits for subpriority.

Mengaktifkan NVIC dalam Kode

Kode NVIC biasanya dihasilkan secara otomatis dari STM32CubeMX. Berikut adalah langkah manual untuk menggunakan NVIC:

1. Mengaktifkan Interrupt

Gunakan fungsi HAL_NVIC_EnableIRQ() untuk mengaktifkan interrupt.

HAL_NVIC_EnableIRQ(TIM2_IRQn); // Mengaktifkan interrupt untuk Timer 2

2. Mengatur Prioritas

Gunakan fungsi HAL_NVIC_SetPriority() untuk mengatur prioritas interrupt.


HAL_NVIC_SetPriority(TIM2_IRQn, 0, 1); // Prioritas 0 (tertinggi), subprioritas 1

3. Callback Interrupt

Gunakan callback yang sesuai untuk menangani interrupt. Contoh pada Timer:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) { // Penanganan interrupt untuk Timer 2 } }

Contoh Aplikasi NVIC

Menggunakan EXTI (External Interrupt):

  1. Konfigurasi di STM32CubeMX:

    • Aktifkan EXTI Line pada pin GPIO tertentu (misalnya PA0 untuk tombol).
    • Pilih Interrupt Mode di NVIC Settings.
  2. Kode Generated: STM32CubeIDE akan menghasilkan kode seperti ini:


    void EXTI0_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); // Panggil handler untuk EXTI line 0 } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == GPIO_PIN_0) { // Penanganan tombol ditekan } }

Kesimpulan

  • NVIC adalah pengontrol interrupt yang mengelola prioritas dan pengaktifan interrupt di STM32.
  • Anda dapat mengonfigurasinya melalui STM32CubeMX untuk mempermudah.
  • Penanganan interrupt dilakukan melalui fungsi seperti HAL_NVIC_SetPriority, HAL_NVIC_EnableIRQ, dan callback.

Tidak ada komentar:

Posting Komentar