Sabtu, 15 Agustus 2026

Debug program STM32G474RE PWM TIM




Debugging pada STM32 bukan sekadar mencari error compile. Tujuannya adalah menjalankan program secara bertahap sambil melihat nilai variabel, register, peripheral, dan aliran eksekusi secara real-time.

Untuk kasus STM32G474RE + STM32CubeIDE + PWM TIM1, alurnya seperti ini:

1. Build program

Di STM32CubeIDE:

Project → Build Project

Periksa bagian Console.

  • 0 errors → program berhasil dikompilasi.
  • warning → belum tentu fatal.
  • error → program belum bisa di-debug.

2. Pastikan debugger ST-LINK

Nucleo-G474RE sudah memiliki ST-LINK onboard.

Hubungkan USB dari PC ke konektor ST-LINK USB pada board.

Kemudian:

Run → Debug As → STM32 Cortex-M C/C++ Application

CubeIDE akan masuk ke Debug Perspective.


3. Pasang Breakpoint

Breakpoint adalah titik tempat CPU berhenti sementara.

Misalnya program:

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

while (1)

{

    HAL_Delay(100);

}

Pasang breakpoint pada:

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

Caranya:

double-click nomor baris di sebelah kiri kode.

Akan muncul tanda breakpoint.

Ketika program berjalan dan mencapai baris tersebut, CPU berhenti.


4. Gunakan tombol utama Debug

Di toolbar Debug biasanya ada:

TombolFungsi
▶ ResumeMelanjutkan program
⏸ SuspendMenghentikan CPU
↪ Step IntoMasuk ke dalam fungsi
↷ Step OverMenjalankan satu baris
↩ Step ReturnKeluar dari fungsi
⏹ TerminateMenghentikan debugging

 Yang paling sering digunakan adalah:

Breakpoint → Resume → lihat nilai → Step Over

5. Contoh debugging PWM TIM1

Misalnya Anda ingin:

TIM1_CH1 → PA8 → PWM 1 kHz → duty cycle 50%

Konfigurasi:

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

Kemudian:

__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 500);

Jika:

ARR = 999

CCR1 = 500

maka secara sederhana:

6. Periksa variabel dengan Watch

Saat breakpoint aktif, buka:

Window → Show View → Expressions

Tambahkan:

htim1.Instance

htim1.Init.Prescaler

htim1.Init.Period

Untuk PWM, yang paling penting:

TIM1->PSC

TIM1->ARR

TIM1->CCR1

Misalnya hasil:

PSC  = 169
ARR  = 999
CCR1 = 500

berarti kita dapat memeriksa konfigurasi PWM langsung dari register hardware.


7. Debug register TIM1

Ini bagian yang sangat penting untuk STM32.

Jangan hanya melihat kode C. Periksa juga register peripheral.

Buka:

Window → Show View → SFRs

atau gunakan Live Expressions/Expressions.

Perhatikan:

TIM1->PSC
TIM1->ARR
TIM1->CCR1
TIM1->CR1
TIM1->CCMR1
TIM1->CCER
TIM1->BDTR

Contoh interpretasi:

RegisterYang diperiksa
PSCPrescaler
ARRPeriode PWM
CCR1Duty cycle CH1
CR1Counter configuration
CCMR1PWM mode
CCERChannel enable
BDTRMain Output Enable

8. Mengapa TIM1 berbeda dari timer biasa?

TIM1 adalah Advanced-Control Timer.

Ini penting.

Untuk PWM TIM1/TIM8 terdapat konsep Main Output Enable (MOE) melalui register:

TIM1_BDTR

Bit penting:

MOE = 1

Jika konfigurasi timer terlihat benar tetapi output PWM tidak muncul, BDTR/MOE perlu diperiksa.

Namun jika Anda menggunakan:

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

HAL biasanya menangani kebutuhan output utama tersebut untuk penggunaan PWM normal.


9. Debug GPIO PA8

TIM1_CH1 pada konfigurasi umum dapat menggunakan:

PA8

PA8 tidak boleh dikonfigurasi sebagai GPIO Output biasa jika ingin menghasilkan PWM hardware.

Harus menjadi:

PA8
AF1
TIM1_CH1

Di CubeMX:

Pinout → PA8 → TIM1_CH1

Kemudian GPIO akan dikonfigurasi sebagai Alternate Function.

Secara konsep:

TIM1

 │

 └── CH1

      │

      ▼

     PA8

      │

      ▼

    PWM OUT

10. Debug frekuensi PWM

Misalnya clock TIM1:

TIM1CLK = 170 MHz

Prescaler:

PSC = 169

Maka:


Jika:

ARR = 999

maka:



Jadi konfigurasi:

TIM1CLK = 170 MHz
PSC     = 169
ARR     = 999
CCR1    = 500

menghasilkan kira-kira:

PWM = 1 kHz
Duty = 50%

11. Jika PWM tidak keluar

Gunakan urutan debugging berikut:

PROGRAM │ ▼ HAL_TIM_PWM_Start() │ ▼ TIM1 berjalan? / \ NO YES │ │ ▼ ▼ cek clock cek CH1 │ ▼ PA8? / \ NO YES │ │ ▼ ▼ cek AF1 cek CCR1 │ ▼ cek CCER │ ▼ cek BDTR │ ▼ OSCILLOSCOPE

12. Debug dengan oscilloscope

Setelah software benar, ukur:

PA8 ───────── Oscilloscope CH1
GND ───────── Oscilloscope GND

Jika target:

Frequency = 1 kHz
Duty      = 50%

maka waveform kira-kira:

3.3V  ┌───────┐       ┌───────┐
      │       │       │       │
0V ───┘       └───────┘       └────
       0.5 ms   0.5 ms
       <------ 1 ms --------->

Catatan: level logika STM32G474RE umumnya 3.3 V; jangan menghubungkan output PA8 langsung ke beban yang membutuhkan tegangan lebih tinggi.


13. Debug program secara sistematis

Untuk program STM32 yang lebih kompleks, gunakan urutan:

Level 1 — Compile

Apakah program berhasil build?

Level 2 — Program execution

Apakah CPU masuk main()?

Level 3 — Peripheral initialization

Apakah MX_TIM1_Init() dijalankan?

Level 4 — Peripheral start

Apakah HAL_TIM_PWM_Start() dijalankan?

Level 5 — Register

PSC
ARR
CCR1
CCER
BDTR

Level 6 — Pin

PA8 = TIM1_CH1 / AF1

Level 7 — Hardware

Oscilloscope / Logic Analyzer

Ini jauh lebih efektif daripada langsung mengubah-ubah kode secara acak.

Untuk STM32G474RE Anda, pola debug yang paling saya sarankan:

STM32CubeIDE
      │
      ▼
Build
      │
      ▼
Debug
      │
      ▼
Breakpoint
      │
      ▼
main()
      │
      ▼
MX_TIM1_Init()
      │
      ▼
HAL_TIM_PWM_Start()
      │
      ▼
Check TIM1 Registers
      │
      ▼
Check PA8 / AF1
      │
      ▼
Oscilloscope

Intinya: debugging STM32 yang benar dilakukan dari software → peripheral → register → GPIO → sinyal fisik. Untuk kasus PWM TIM1, jangan berhenti pada “program tidak error”; pastikan TIM1 benar-benar running dan PA8 benar-benar mengeluarkan waveform PWM.


0 komentar:

ADS Article