Anda di halaman 1dari 7

Laporan Praktikum Mikrokontroler dan Mikroprosesor

Modul 5 – Timer ARM STM32


Pramudya Rakhmadyansyah Sofyan/17524011
Asisten: Arigo Fahreza Putratama
Tanggal praktikum: 25 November 2019
17524011@students.uii.ac.id
Teknik Elektro – Fakultas Teknologi Industri
Universitas Islam Indonesia

Abstrak—Timer merupakan suatu komponen penting pada B. Systick


sebuah mikrokontroler maupun mikroprosesor yang memiliki Menurut pustaka [2], system timer atau biasa juga disebut
peran mengenai masalah pewaktuan dalam menjalankan suatu
sebagai systick, merupakan suatu sistem pewaktuan untuk dapat
perintah. Pada board STM32F407VG, terdapat dua buah metode
pewaktuan, yaitu systick dan timer. Dengan menggunakan board
menghasilkan interupsi pada interval waktu yang tetap. Dua
STM32F407VG serta software Co-IDE, fitur pewaktu pada board diantara dari banyaknya fungsi yang dapat dilakukan oleh
ini dapat diketahui karakteristiknya dengan menjalankan systick, pertama yaitu untuk mengukur waktu yang telah berlalu
perintah untuk mengatur waktu LED berkedip. Dari seluruh dengan mengimplementasikan fungsi time delay. Selanjutnya,
praktikum yang telah dilaksanakan, disimpulkan bahwa interval contoh kedua adalah suatu tugas spesifik secara berkala, semisal
waktu tunda pada systick dapat ditentukan secara langsung penjadwalan kinerja pada CPU yang mana scheduler pada CPU
karena intervalnya sudah fix, sedangkan interval waktu tunda secara berkala akan memilih proses baru dari antrian proses
dari timer perlu ditetukan terlebih dahulu nilai prescaler serta yang siap untuk dijalankan berikutnya [2]. Berikut ini adalah
period-nya. gambar dari flowchart cara kerja pewaktu systick:
Kata kumci—Timer; Systick; Interval; Prescaler;
Gambar 1 Flowchart Systick
I. PENDAHULUAN
Dalam menjalankan suatu tugas pada suatu perangkat
pemroses, baik itu mikrokontroler maupun mikroprosesor tentu
akan sangat membutuhkan suatu fitur yang dapat mengatur
mengenai masalah pewaktuan sehingga perintah yang diminta
dapat dilaksanakan sebagaimana mestinya. Untuk menjalankan
segala jenis fitur pewaktuan tersebut, maka terdapat salahsatu
fitur bernama timer. Menurut pustaka [1], konsep dasar dari
timer adalah suatu counter yang melakukan pencacahan dari nol
hingga nilai maksimum untuk mencapai kecepatan dan
frekuensi tertentu. Pada praktikum ini, fitur timer akan
dieksplorasi dengan menggunakan board STM32F407VG,
sehingga praktikan mampu unutk mengenal serta memanfaatkan
fitur tersebut pada board ARM STM32.
II. TINJAUAN PUSTAKA III. METODE PRAKTIKUM
A. Timer STM32F4XX Pada praktikum ini terdapat dua jenis percobaan, yang
Pada pustaka [1], dijelaskan bahwa timer merupakan pertama yaitu mengatur kedip LED dengan Systick dan yang
pencacah yang dapat mengatur interval waktu dari output kedua yaitu mengatur kedip LED dengan timer. Untuk percoban
sistem, baik itu menggunakan clock internal maupun eksternal. pertama, hanya saja program yang digunakannya berbeda.
Pada board STM32F4XX, terdapat berbagai jenis timer dari Terlebih dahulu siapkan board STM32F407VG dan pastikan
mulai TIM1 hingga TIM11 yang memiliki fungsinya masing- modul telah terhubung dengan power supply. Setelah itu,
masing, diantaranya yaitu TIM1 dan TIM8 berfungsi sebagai hubungkan board STM32F407VG dengan pc yang akan
advanced control timers, TIM2 hingga TIM5 serta TIM9 hingga digunakan, lalu tulislah program yang akan digunakan untuk
TIM14 berfungsi sebagai general-purpose timers, lalu TIM6 mengatur LED dengan systick pada software CO-IDE. Program
dan TIM7 berfungsi sebagai basic timers. Dengan demikian, terlampir. Kemudian, lakukan kompilasi pada program tersebut
fungsi dari timer secara umum diantaranya untuk melaksanakan dengan menekan menu build. Jika program sudah benar, maka
tugas secara periodik, menghitung panjang pulsa, mencacah akan muncul tulisan “BUILD SUCCESSFUL” pada bagian
banyaknya kejadian, serta menghitung waktu tundaan atau console, lalu pilih Download Code to Flash untuk melihat hasil
delay. secara real-time pada board STM32F407VG. Setelah hasil
secara real-time dapat diamati, selanjutnya lakukan modifikasi
pada program untuk memvariasikan waktu kedip dari LED.
Selanjutnya, lakukan kembali hal yang sama untuk percobaan Gambar 3 Bagian Program Modifikasi Timer
kedua dengan program yang berbeda untuk dapat mengatur
kedip dari LED dengan menggunakan timer. Program untuk
percobaan kedua terlampir.
IV. HASIL DAN ANALISIS
Setelah praktikum dijalankan sesuai dengan metodologi,
data-data hasil praktikum dari dua percobaan yang didapatkan
berupa gambar dari proses simulasi secara real-time. Dari
kedua percobaan tersebut, hasil berupa gambar yang didapatkan
antara kedua percobaan identic, hanya saja metode waktu
tundaannya yang berbeda. Pada percobaan pertama, waktu
tundaan diatur dengan menggunakan systick. Sebelum
melakukan modifikasi, waktu tundaan yang dihasilkan dari
program tersebut yaitu 1000 ms atau 1 detik, sehingga LED
akan berkedip setiap 1 detik sekali. Untuk melakukan variasi
waktu kedip dari LED, maka bagian program yang dimodifikasi
adalah sebagai berikut:
Gambar 2 Bagian Program Modifikasi Systick

Dari gambar 3, untuk dapat mempercepat waktu kedip dari


LED biru, maka bagian DELAY_Ms diganti dengan nilai yang
lebih kecil sesuai dengan keinginan. Semisal, untuk
mendapatkan waktu LED biru berkedip setiap 1 detik, maka
DELAY_Ms diubah menjadi 1000ms. Kemudian, pada LED
merah, waktu tundaan didapatkan dengan mengatur nilai
prescaler serta period untuk mendapatkan waktu yang
diinginkan. Semisal, untuk mendapatkan waktu tundaan yang
lebih besar, dengan kata lain LED akan berkedip lebih lama,
yaitu setiap 10 detik, maka bagian prescaler diubah menjadi
839. Dari modifikasi tersebut, maka LED biru akan berkedip
Dari gambar 2, untuk mendapatkan waktu tundaan yang sesuai
setiap 1 detik sekali, sedangkan LED merah akan berkedip
dengan kebutuhan, maka bagian set delay diubah sesuai dengan
setiap 10 detik sekali. Program hasil modifikasi terlampir.
yang diinginkan dengan satuan ms. Jika nilai msTick semakin
Berikut ini adalah beberapa gambar hasil simulasi secara real-
tinggi, maka waktu yang diperlukan LED untuk berkedip akan
time pada board STM32F407VG dengan variasi kondisi LED
semakin lama. Sebaliknya, jika nilai msTick semakin rendah,
yang menyala:
maka waktu yang diperlukan LED untuk berkedip akan
Gambar 4 LED merah dan LED Biru Tidak Menyala
semakin cepat. Pada percobaan ini, program dimodifikasi
menjadi 10ms, sehingga hasil real-time yang didapatkan LED
akan berkedip sangat cepat yaitu tiap 10ms sekali. Program
hasil modifikasi terlampir.

Selanjutnya, pada percobaan kedua, LED yang akan


dinyalakan pada percobaan kali ini yaitu menjadi dua buah,
yaitu LED merah dan LED biru. LED merah dan LED biru ini
memiliki metode pewaktuan yang berbeda, di mana LED biru
berkedip sesuai dengan mengatur waktu tundaan, sedangkan
LED merah berkedip dengan mengatur prescaler serta period
untuk mendapatkan waktu tundaan. Dari percobaan ini, LED
biru akan berkedip setiap 250ms sekali, sedangkan LED merah
akan berkedip setiap 500ms. Untuk dapat melakukan variasi
waktu kedip antara kedua LED tersebut, maka bagian program
yang dimodifikasi adalah sebagai berikut:
Gambar 5 LED Merah Menyala V. KESIMPULAN
Dari seluruh percobaan yang telah dilaksanakan, dapat
disimpulkan bahwa timer dan systick merupakan fungsi
pewaktu pada board STM32F407VG yang memiliki metode
pewaktuan yang berbeda. Pada timer, interval dari waktu
tundaan ditentukan dengan menggunakan beberapa parameter,
diantaranya yaitu frekuensi pencacah kejadian, periode, dan
prescaler. Berbeda dengan timer, interval dari waktu tundan
telah ditentukan sebelumnya atau fix. Pada percobaan pertama,
bagian set delay pada systick berfungsi untuk mengatur waktu
tundaan pada LED untuk berkedip. Apabila nilai set delay
semakin kecil, maka waktu LED untuk berkedip akan semakin
cepat. Sebaliknya, apabila nilai set delay semakin besar, maka
waktu LED untuk berkedip semakin lama. Lain halnya dengan
timer, waktu tundaan terlebih dahulu diatur dengan
memasukkan nilai pada prescaler dan period untuk
medapatkan waktu tundaan yang diinginkan. Jika nilai
Gambar 6 LED Biru Menyala prescaler yang digunakan semakin kecil, maka waku LED
untuk berkedip akan semakin lama. Namun, jika presacler yang
digunakan lebih besar, maka waktu LED untuk berkedip akan
semakin cepat.
DAFTAR PUSTAKA
[1] J. T. Elektro, Buku Petunjuk Praktikum
Mikrokontroler dan Mikroprosesor,
Yogyakarta, 2019.

[2] Y. Zhu, ARM Cortex-M System Timer


(SysTick), E-Man Press LLC, 2018.

Gambar 7 Kedua LED Menyala


Lampiran

1.Program Systick sebelum modifikasi


#include "stm32f4xx.h" // Toggle LED
#include "stm32f4xx_rcc.h" GPIO_ToggleBits(GPIOD, GPIO_Pin_13);
#include "stm32f4xx_gpio.h" // Set delay 1s (1000ms)
#include "clock.h" msTick = 1000;
__IO uint32_t msTick; // Wait until msTick is zero
// This function will be called every 1ms while (msTick);
void SysTick_Handler(void) }
{ }
msTick--;
}
int main(void)
{
// Set clock to 168MHz
CLOCK_SetClockTo168MHz();
// Update SystemCoreClock variable
SystemCoreClockUpdate();
// Make SysTick overflow every 1ms
SysTick_Config(SystemCoreClock / 1000);
// Enable clock for GPIOD
RCC_AHB1PeriphClockCmd(RCC_AHB1Peri
ph_GPIOD, ENABLE);
// Initialization for PD13 (orange LED) as output
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStruct.GPIO_Mode
= GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Speed
= GPIO_Speed_2MHz;
GPIO_InitStruct.GPIO_OType
= GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd
= GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD, &GPIO_InitStruct);
while (1)
{
2.Modifikasi Program Systick
#include "stm32f4xx.h" // Set delay 1s (10ms)
#include "stm32f4xx_rcc.h" msTick = 10;
#include "stm32f4xx_gpio.h" // Wait until msTick is zero
#include "clock.h" while (msTick);
__IO uint32_t msTick; }
// This function will be called every 1ms }
void SysTick_Handler(void)
{
msTick--;
}
int main(void)
{
// Set clock to 168MHz
CLOCK_SetClockTo168MHz();
// Update SystemCoreClock variable
SystemCoreClockUpdate();
// Make SysTick overflow every 1ms
SysTick_Config(SystemCoreClock / 1000);
// Enable clock for GPIOD
RCC_AHB1PeriphClockCmd(RCC_AHB1Peri
ph_GPIOD, ENABLE);
// Initialization for PD13 (orange LED) as output
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStruct.GPIO_Mode
= GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Speed
= GPIO_Speed_2MHz;
GPIO_InitStruct.GPIO_OType
= GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd
= GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD, &GPIO_InitStruct);
while (1)
{
// Toggle LED
GPIO_ToggleBits(GPIOD, GPIO_Pin_13);
3.Program Percobaan Timer
#include "stm32f4xx.h" DELAY_Ms(2500);
#include "stm32f4xx_rcc.h" }
#include "stm32f4xx_gpio.h" }
#include "stm32f4xx_tim.h" void TIM_INT_Init()
#include "misc.h" {
#include "clock.h" // Enable clock for TIM2
#include "delay.h" RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,
void TIM_INT_Init(void); ENABLE);
void TIM2_IRQHandler() // TIM2 initialization for overflow every 500ms
{ // Update Event (Hz) = timer_clock / ((TIM_Prescaler + 1)
// Checks whether the TIM2 interrupt has occurred or not * (TIM_Period+ 1))
if (TIM_GetITStatus(TIM2, TIM_IT_Update)) // Update Event (Hz) = 84MHz / ((4199 + 1) * (9999 + 1))
{ = 2Hz (0.5s)
// Toggle orange LED (PD13) TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
GPIO_ToggleBits(GPIOD, GPIO_Pin_13); TIM_TimeBaseInitStruct.TIM_Prescaler = 4199;
// Clears the TIM2 interrupt pending bit TIM_TimeBaseInitStruct.TIM_Period = 9999;
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); TIM_TimeBaseInitStruct.TIM_ClockDivision
} = TIM_CKD_DIV1;
} TIM_TimeBaseInitStruct.TIM_CounterMode
int main(void) = TIM_CounterMode_Up;
{ TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
// Set clock to 168MHz // Enable TIM2 interrupt
CLOCK_SetClockTo168MHz(); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
// Initialize delay function // Start TIM2
DELAY_Init(); TIM_Cmd(TIM2, ENABLE);
// Enable clock for GPIOD // Nested vectored interrupt settings
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, NVIC_InitTypeDef NVIC_InitStruct;
ENABLE); NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
// Initialize PD13 and PD15 as output for orange and blue LED NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
GPIO_InitTypeDef GPIO_InitStruct; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; NVIC_Init(&NVIC_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15; }
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOD, &GPIO_InitStruct);
// Initialize timer interrupt
TIM_INT_Init();
while (1)
{
// Toggle blue LED (GPIO15) every 2.5s
GPIO_ToggleBits(GPIOD, GPIO_Pin_15);
4.Modifikasi Program Timer DELAY_Ms(1000);
#include "stm32f4xx.h" }
#include "stm32f4xx_rcc.h" }
#include "stm32f4xx_gpio.h" void TIM_INT_Init()
#include "stm32f4xx_tim.h" {
#include "misc.h" // Enable clock for TIM2
#include "clock.h" RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,
#include "delay.h" ENABLE);
void TIM_INT_Init(void); // TIM2 initialization for overflow every 500ms
void TIM2_IRQHandler() // Update Event (Hz) = timer_clock / ((TIM_Prescaler + 1)
{ * (TIM_Period+ 1))
// Checks whether the TIM2 interrupt has occurred or not // Update Event (Hz) = 84MHz / ((439 + 1) * (9999 + 1)) = 2Hz
if (TIM_GetITStatus(TIM2, TIM_IT_Update)) (0.5s)
{ TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
// Toggle orange LED (PD13) TIM_TimeBaseInitStruct.TIM_Prescaler = 439;
GPIO_ToggleBits(GPIOD, GPIO_Pin_13); TIM_TimeBaseInitStruct.TIM_Period = 9999;
// Clears the TIM2 interrupt pending bit TIM_TimeBaseInitStruct.TIM_ClockDivision
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); = TIM_CKD_DIV1;
} TIM_TimeBaseInitStruct.TIM_CounterMode
} = TIM_CounterMode_Up;
int main(void) TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
{ // Enable TIM2 interrupt
// Set clock to 168MHz TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
CLOCK_SetClockTo168MHz(); // Start TIM2
// Initialize delay function TIM_Cmd(TIM2, ENABLE);
DELAY_Init(); // Nested vectored interrupt settings
// Enable clock for GPIOD NVIC_InitTypeDef NVIC_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
ENABLE); NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
// Initialize PD13 and PD15 as output for orange and blue LED NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
GPIO_InitTypeDef GPIO_InitStruct; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; NVIC_Init(&NVIC_InitStruct);
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; }
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOD, &GPIO_InitStruct);
// Initialize timer interrupt
TIM_INT_Init();
while (1)
{
// Toggle blue LED (GPIO15) every 1s
GPIO_ToggleBits(GPIOD, GPIO_Pin_15);

Anda mungkin juga menyukai