1. Buka file src/main.c, hapus semua baris di main.c kita akan menulis code dari scratch supaya lebih ringkas dan mudah dimengerti. Code tinggal di copy paste aja, keterangannya ada di source code.
file main.c
/* Includes */
#include
#include "stm32f10x.h"
void initBoard()
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Aktifkan clock untuk portC. Lihat Discovery Board manual page 8 atau STM32F100RBT6B block diagram */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
/* Konfigurasi led hijau di pin PC9*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
/* Gunakan mode PushPull, led akan nyala bila diberi tegangan (aktif high) */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/* default speed 50Mhz, pin akan didrive sangat cepat */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/* Inisialisasi PORT C */
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* Konfigurasi systick timer setiap 500ms. Systick interrupt akan aktif setiap 500ms.
* Systick interrupt akan di handle oleh function Systick_Handler di file stm32f10x_it.c
* Note: Microcontroller pada board ini mempunyai clock max 24Mhz, dalam 1 detik clock ticknya 24.000.000
* berarti dalam 1/2 detik. clock tick 24Mhz/2 = 12Mhz
* Systick_Config akan error bila diberi nilai 24.000.000
*/
if (SysTick_Config(SystemCoreClock / 2))
{
/* Capture error */
while (1);
}
}
void ledOn()
{
/* Set bit 1 to PC9 */
GPIO_SetBits(GPIOC, GPIO_Pin_9);
}
void ledOff()
{
/* Reset bit PC9*/
GPIO_ResetBits(GPIOC, GPIO_Pin_9);
}
int main(void)
{
initBoard();
/* Main loop. Never exit from this main loop */
while(1){
}
return 0;
}
modifikasi functino Systick_Handler difile stm32f10x_it.c
extern void ledOn(void);
extern void ledOff(void);
static volatile int ledStatus = 0;
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
if(ledStatus){
ledOff();
}else{
ledOn();
}
ledStatus = !ledStatus;
}
Systick timer adalah system timer yang sengaja dibuat untuk memudahkan porting antar OS.
Perhatikan keyword volatile pada baris static volatile int ledStatus = 0. Volatile menginstruksikan compile untuk tidak mengoptimisasi variable ledStatus. Karena variable ledStatus dipanggil dari interrupt, dan bisa dipanggil kapan saja.
Sebagai catatan, setiap variable yg dipangil dari interrupt harus diberikan keyword volatile.
Selanjutnya Bikin delay dan tambah input button..
Tugas:
1. Setiap 500ms blinkledHijau(PC9) dan ledBiru (PC8).
2. Ganti waktu timer jadi 200ms.
3. Gunakan led external dan hubungkan dengan pin PA2, buat blink setiap 500ms.