Sabtu, 03 September 2011

Tutorial 3 - Led Blink Dan Button

Kita akan mengedit main.c dari tutorial 2. Function yang ditambahkan adalah DelayMs, function ini akan membuat microcontroller menunggu selama x milisecond. Ada modifikasi jg di file stm32f10x_it.c di function Systick_Handler.
Perhatikan pada function DelayMs, saya menggunakan down counter dimana nilai uDelayTimerCounter ditest apakah tidak bernilai 0. Mentest suatu variable dengan bilangan 0 lebih effisien daripada mentest variable <= X.

Tidak Efisien:


if(uDelayTimerCounter >= milis)
uDelayTimerCounter++;



Code diatas tidak effisien karena processor akan mentest overflow dari data type variable tsb.

Untuk membuat USER button berfungsi, clock pada APB2 GPIO A perlu dienable. USER button dalam discovery board dihubungkan pada port PA0.
Perhatikan pada main loop, kita mengambil nila dari USER button 2 kali dengan delay sebesar X ms. Ini dimaksudkan untuk memastikan apakah button masih ditekan.

file main.c



/* Includes */
#include
#include "stm32f10x.h"

volatile uint32_t uDelayTimerCounter;

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);

/* Enable GPIO Port A */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, 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 USER button di GPIO PA0*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

/* Gunakan mode Input floating */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

/* default speed 50Mhz, pin akan didrive cepat */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

/* Inisialisasi PORT C */
GPIO_Init(GPIOA, &GPIO_InitStructure);


/* Konfigurasi systick timer setiap 1ms. Systick interrupt akan aktif setiap 1ms.
* 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
* Dalam 1ms clock tick adalah 24.0000
* Systick_Config akan error bila diberi nilai 24.000.000
*/
if (SysTick_Config(SystemCoreClock / 1000))
{
/* 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);
}

void DelayMs(uint32_t milis)
{
uDelayTimerCounter = milis;

/* Loop sampai uDelayTimerCounter = 0
* Nilai uDelayTimerCounter akan berkurang tiap 1ms (lihat functino Systick_Handler)
* */
while(uDelayTimerCounter!=0);

}

int main(void)
{
int buttonState = 0; /* By default button is no pressed */
int ledStatus = 0;

initBoard();
ledOff();

/* Main loop. Never exit from this main loop */
while(1){
if(ledStatus == 0){
ledOn();
DelayMs(500);
ledOff();
DelayMs(100);
}

/* Nilai buttonState akan 1 apabila button dalam keadaan idle
* buttonState akan 0 apabila button ditekan
*/
buttonState = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
if(buttonState == 1){
/* Tunggu sebentar, check lagi apakah button masih ditekan */
DelayMs(50);
buttonState = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
if(buttonState == 1){
ledStatus = !ledStatus;
/* Tambah delay untuk nunggu button debounce */
DelayMs(500);
}
}
}
return 0;
}




file stm32f10x_it.c




/* Gunakan keyword extern apabila variable atau function
* dideclare di file lain
*/
extern void ledOn(void);
extern void ledOff(void);
extern uint32_t uDelayTimerCounter;

/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
if(uDelayTimerCounter!=0)
--uDelayTimerCounter;
}





Next PwM di STM32

Jumat, 02 September 2011

Tutorial 2 - Led blink

Lanjutan dari tutorial 1.

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.

Kamis, 01 September 2011

Tutorial 1 - Create Project With Atollic IDE

Tutorial STM32 Discovery board menggunakan compiler Atollic.

1. Buka aplikasi atollic untuk STM32. Jika belum diinstall bisa didownload free (limited edition) dari website Atollic http://www.atollic.com. Pada saat installasi, installation key akan dibuat dan anda harus registrasi dengan mengisikan nama, email, alamat, etc.

2. Klik menu File->New->C Project. Dialog new project akan muncul. Ketik nama project tut1-ledblink. Project type STM32 C Project, dialog baru akan muncul.
Di bagian target pilih:
- evaluation board: STM32_Discovery
- Floating point: Software (default)
- Code location: Flash (default)
Instruction set thumb2
Endianess little endian
Optimization biarkan default

Klik next. Pilih debug probe ST-LINK.
Klik Next. Pilih configurations Debug dan Release
Klik Finish.

3. Atollic akan membuat project dengan template default, yaitu LED PC8 (led biru) dan PC9 (led hijau) akan toggle apabila button USER di teken.
Klik project->Build All (Ctrl+B). Klik Run->Debug (F11). Pertama kali mungkin akan ditanya konfigurasi debug, pilih saja nilai defaultnya lalu klik finish.


Setiap mulai debugging, program akan berhenti di awal funtiono main. Klik resume (f8) untuk melanjutkan debugging.

Pastikan led hijau pada board menyala, dan apabila button user (button biru) ditekan led biru akan nyala dan led hijau akan mati.

Selanjutnya tutorial 2 akan membuat led blink setiap 500ms.