7 Des 2019

0
Komentar

Pemrograman STM32 di Linux


Bismillahirrahmaanirrahiim.

Saat ini, mungkin hampir semua orang sudah mendengar istilah "ARM". Arsitektur processor 32 bit ini merupakan arsitektur yang saat ini paling banyak digunakan. Mulai dari smartphone, tablet, embedded system seperti RaspberryPi dan semacamnya, dan tentunya mikrokontroler. Selain memiliki banyak sekali fitur, ARM juga sangat rendah daya. Dan yang paling menarik, harganya yang cukup murah.

Saya yang selama ini terbiasa menggunakan AVR sebagai mikrokontroller andalan, perlahan telah mulai memberanikan diri untuk 'hijrah'.

Di sini, saya ingin berbagi catatan mengenai pemrograman salah satu mikrokontroler berbasis ARM. yaitu STM32. Semoga di post-post berikutnya, saya bisa menjelaskan beragam fitur-fiturnya secara bertahap. Tentunya lebih berfokus pada contoh aplikasinya.

Sebagai catatan, disini saya menggunakan OS Ubuntu (Linux). Namun umumnya untuk pengguna OS lain, pada dasarnya langkah-langkah yang digunakan atau apa saja yang perlu di install adalah sama. Perbedaannya hanya pada prosedur instalasinya saja.

Baiklah, kita mulai.

Persiapan Hardware

Pertama, mikrokontroler STM32F103. Atau biasa dikenal dengan istilah "Blue pill".


Kedua ST-Link V2, perangkat ini digunakan untuk melakukan flashing program yang telah kita buat ke flash memory (atau istilah di Arduino : Upload). Fungsinya serupa dengan "downloader" USBASP untuk mikrokontroler AVR. Namun dengan ST-Link, kita juga bisa sekaligus melakukan debugging.


Ketiga, rangkai stm32f103 dengan STLink-v2 dengan konfigurasi seperti berikut ini (klik gambar untuk memperbesar) :




Setup Environment

Di bagian ini kita akan menyiapkan environtment  untuk dapat melakukan pemrograman, kompilasi, hingga flashing.

Pertama, buka terminal dan install make. Make digunakan untuk eksekusi perintah kompilasi.

sudo apt-get install make
view raw install-make hosted with ❤ by GitHub


Setelah instalasi selesai, Coba masukan perintah "make" lalu tekan enter. Seharusnya akan muncul pesan seperti ini :



Untuk dapat melakukan kompilasi program ARM, kita memerlukan compiler gcc-arm-none-eabi, dengan menginstall toolchain ARM dibawah ini :

sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa
sudo apt-get update
sudo apt-get install gcc-arm-none-eabi


Selanjutnya, kita akan menginstall program untuk bisa menggunakan ST-Link. Sebelumnya, install dependencies berikut ini :



Lalu kita akan build ST-Link binaries dengan download (cloning) source dari git. Disini saya mendownloadnya ke direktori $HOME, jika ingin direktori lain silahkan sesuaikan dengan kebutuhan.

view raw build-stlink hosted with ❤ by GitHub


Jika semua perintah diatas telah dilakukan, coba masukkan perintah "st-flash". Jika ST-Link sudah terinstall dengan benar, maka akan muncul pesan seperti di bawah ini :



Selanjutnya, kita akan membuat USB rule agar ST-Link dapat diakses tanpa perlu menggunakan "sudo". Perintah dibawah akan membuka editor teks Nano.

cd /etc/udev/rules.d/
sudo nano 50-usb-stlink.rules
view raw set-usb-rules hosted with ❤ by GitHub


Copy-paste script berikut ini ke dalam editor Nano :

view raw add-stlink hosted with ❤ by GitHub


*) Opsi: jika anda menggunakan selain ST-Link V2, bisa pilih salah satu dari list dibawah ini :



Save dan Exit, lalu restart USB service.

sudo service udev restart


Terakhir, download Standard Peripherals dibawah dan ekstrak di direktori yang diinginkan.
STDPeriphLib


Sampai tahap ini, environment untuk programming STM32 telah siap.


Testing Program


Setelah menyiapkan environment, sekarang saatnya kita mulai memprogram!

Buka editor teks yang biasa kamu gunakan. Kemudian buat program seperti berikut ini dan simpan sebagai "main.c".

#include "stm32f10x.h"
void delay(uint16_t millis);
int main()
{
GPIO_InitTypeDef GPIO_InitStructure;
/* GPIOC Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
/* Configure PD0 and PD2 in output pushpull mode */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
while (1)
{
/* Set PD13*/
GPIOC->BSRR = GPIO_Pin_13;
delay(500);
/* Reset PD13 */
GPIOC->BRR = GPIO_Pin_13;
delay(500);
}
}
void delay(uint16_t millis)
{
while (millis-- > 0)
{
volatile int16_t x = 5971;
while (x-- > 0)
{
__asm("nop");
}
}
}


Program diatas merupakan testing program atau bisa dibilang sebagai "Hello World"-nya mikrokontroler, yaitu blinking LED. Di module STM32F103 "Blue Pill" kita bisa memanfaatkan LED yang sudah built-in di pin PC13, lalu kita set dan reset dengan jeda 500ms.

Setelah itu, buat file konfigurasi kompilasi dibawah ini. Ubah direktori STD_PERIPH_LIBS dengan path direktori STDPeriphLib yang sudah di download sebelumnya. Simpan dengan nama "makefile", di folder yang sama dengan "main.c".

# path menuju direktori STM32F103 standard peripheral library
STD_PERIPH_LIBS ?= ./STM32F10x_StdPeriph_Lib_V3.5.0/
# list of source files
SOURCES = main.c
SOURCES += $(STD_PERIPH_LIBS)/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c
SOURCES += $(STD_PERIPH_LIBS)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c
SOURCES += $(STD_PERIPH_LIBS)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c
SOURCES += $(STD_PERIPH_LIBS)/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_md.s
# name for output binary files
PROJECT ?= main
# compiler, objcopy (should be in PATH)
CC = arm-none-eabi-gcc
OBJCOPY = arm-none-eabi-objcopy
# path to st-flash (or should be specified in PATH)
ST_FLASH ?= st-flash
# specify compiler flags
CFLAGS = -g -O2 -Wall
CFLAGS += -T$(STD_PERIPH_LIBS)/Project/STM32F10x_StdPeriph_Template/TrueSTUDIO/STM3210B-EVAL/stm32_flash.ld
CFLAGS += -mlittle-endian -mthumb -mcpu=cortex-m4 -mthumb-interwork
CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
CFLAGS += -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER
CFLAGS += -Wl,--gc-sections
CFLAGS += -I.
CFLAGS += -I$(STD_PERIPH_LIBS)/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/
CFLAGS += -I$(STD_PERIPH_LIBS)/Libraries/CMSIS/CM3/CoreSupport
CFLAGS += -I$(STD_PERIPH_LIBS)/Libraries/STM32F10x_StdPeriph_Driver/inc
OBJS = $(SOURCES:.c=.o)
all: $(PROJECT).elf
# compile
$(PROJECT).elf: $(SOURCES)
$(CC) $(CFLAGS) $^ -o $@
$(OBJCOPY) -O ihex $(PROJECT).elf $(PROJECT).hex
$(OBJCOPY) -O binary $(PROJECT).elf $(PROJECT).bin
# remove binary files
clean:
rm -f *.o *.elf *.hex *.bin
# upload program
flash:
sudo $(ST_FLASH) write $(PROJECT).bin 0x8000000



Setelah itu, lakukan kompilasi dan flash dengan perintah :

make all && make flash
view raw build-and-flash hosted with ❤ by GitHub


Dengan program tersebut, led di pin PC13 akan berkedip setiap 500ms.

Selamat, pemrograman STM32 telah sukses.

Penutup

Dalam library STD Periph diatas, terdapat berbagai program contoh yang dapat kita jadikan referensi. Jadi, jangan ragu untuk mencoba !


Tutorial diatas dibuat bersasarkan informasi dari berbagai sumber dengan penyesuaian saya sendiri. Jika ada yang perlu didiskusikan, silahkan komen dibawah.

Feel free to discuss | Berikan tanggapanmu!

Posting Komentar