STM32F103 Blink with Timer Interruption
/ 07:56
Introduction
Ada
kalanya interupsi dibutuhkan pada pengerjaan program agar memprioritaskan urutan
proses yang masuk dalam vektor interupsi.
Proses interupsi sangat beragam ada yang diproses dengan mengirimkan
sinyal interupsi untuk menjalankan timer melalui Pin Int Ext yang digunakan,
kemudian interupsi berjalan hingga selesai, ini disebut interupsi eksternal.
Ada proses interupsi yang dijalankan secara internal dengan mengatur timer
hingga overflow ini disebut dengan interupsi internal. Pada MCU STM32F103,
memiliki 4 timer counter untuk interupsi, dan masing masing counter memiliki 4
channel. Kali ini saya akan menggunakan proses interupsi timer secara internal,
artinya tidak dibutuhkan sinyal dari luar ketika proses interupsi di mulai.
Proses
interupsi ini diaplikasikan untuk menyalakan dioda cahaya (LED) blink pada PC13
tanpa melalui fungsi loop. Dengan menerapkan proses interupsi timer kita dapat
membagi bagi pekerjaan CPU secara multitasking misalnya interupsi timer
digunakan untuk menampilkan seven segment yang memiliki tundaan waktu 3ms, dan
fungsi loop mengerjakan pembacaan suhu lalu mengirimkan data ke internet dan
menampilkan data ke seven segment.
Serangkaian proses memiliki durasi waktu
yang berbeda-beda, jika CPU mengerjakan proses yang memiliki waktu tunda 100ms,
maka CPU akan menunggu waktu tunda selama 100ms itu secara sia-sia tanpa mengerjakan
proses yang lain, bagaimana jika ada waktu proses yang dibutuhkan dengan cepat
sedangkan cpu sedang menunggu proses menghabiskan waktu 100ms tadi? maka
jawabnya adalah dengan menggunakan proses interupsi.
Bill Of Material
- Board STM32F103C Blue Pill
- 1x Dioda Cahaya LED 3,5mm
- Bread Board 400 dot point
- 1x Resistor 220 Ohm
- Dan beberapa kabel Jumper Female to Male, dan Male to Male
Wiring Connection
Program
// Timer Interruption
// Blink without loop function
// Note this software only liblary core
STM32Duino regerclarkmelbourne
// Referency from docs.leaflabs.com
// in microseconds; should give 0.5Hz toggles
#define LED_RATE 500000
// We'll use timer 2
HardwareTimer timer( 2 );
void setup() {
// Set up the LED to blink
pinMode(PC13, OUTPUT);
// Pause the timer while we're configuring it
timer.pause();
// Set up period in microseconds
timer.setPeriod(LED_RATE);
// Set up an interrupt on channel 1
timer.setChannel1Mode(TIMER_OUTPUT_COMPARE);
// Interrupt 1 count after each update
timer.setCompare(TIMER_CH1, 1);
timer.attachCompare1Interrupt(handler_led);
// Refresh the timer's count, prescale, and
overflow
timer.refresh();
// Start the timer counting
timer.resume();
}
void loop() {
// Nothing! It's all in the handler_led()
interrupt:
}
void handler_led( void ) {
toggleLED();
}
void toggleLED(){
if
(digitalRead(PC13)==LOW){
digitalWrite(PC13,HIGH);
}
else
if (digitalRead(PC13)==HIGH){
digitalWrite(PC13,LOW);
}
}
Test & Result
Setelah program di upload dan
dijalankan maka LED akan berkedip setiap 0,5 detik nyala dan mati secara terus
menerus. Ini menandakan kalau proses interupsi berhasil dijalankan.
Comments 0
EmoticonEmoticon