January 20, 2022

Blogna Kang U-2 Man

STM32, Embedded System, Microcontroller, ARM Cortex-M, RTOS, FreeRTOS

Memprogram Blue Pill dengan STM32CubeIDE

10 min read

MUKADIMAH

Blue Pill, entah dari mana asal nama ini, pada dasarnya adalah development board berbasis STM32F103C8 (48 pin). STM32F103C8 merupakan mikrokontroler STM32 dengan core ARM Cortex-M3. STM32F103C8 mempunyai flash memori sebesar 64 KB dan RAM sebesar 20 KB. Board ini dilengkapi dengan kristal 8 MHz yang terhubung dengan osilator utama HSE dan kristal 32 KHz yang terhubung ke LSE.

Pin Out Blue Pill

Di dalam board juga sudah terdapat LED yang terhubung ke pin PC13, konektor USB micro sehingga board ini bisa digunakan sebagai USB Device. Semua pin GPIO juga dikeluarkan melalui pin header di kedua sisi PCB, sehingga lebih leluasa untuk memanfaatkan semua fitur yang dimiliki oleh STM32F103C ini. Untuk keperluan debug dan download program, port debug (SWD, Serial Wire Debug) juga dikeluarkan melalui sebuah pin header yang berada di sisi yang berseberangan dengan konektor USB. ST Link atau alat debugger lain diperlukan untuk memprogram MCU melalui port ini. Namun, board ini disediakan juga pin BOOT0 dan BOOT1 sehingga MCU bisa diprogram melalui port serial dengan mengaktifkan bootloader.

Board ini bisa disupply dari port USB, 5V. Sebuah regulator akan menurunkan tegangan tersebut ke 3.3V yang diperlukan oleh STM32. Tegangan supply bisa juga diberikan lewat pin header, bisa langsung 3.3V atau 5V. Perlu diperhatikan agar tidak tertukar. Sebuah LED disediakan sebagai indikasi adanya tegangan supply. Sebuah saklar digunakan untuk mereset STM32, sayang tidak ada saklar yang terhubung ke pin GPIO. Mungkin untuk menjaga agar board tetap berukuran kecil dan berharga murah. Di toko online harga board ini murah sekali. Nanti akan diceritakan konsekuensi dari harga yang sangat murah ini.

Board ini sangat terkenal, terutama di kalangan pecinta Arduino, karena memang bisa diprogram dengan IDE Arduino. Arduino merupakan platform yang sangat memudahkan dalam hal interfacing maupun pemrogrammnya, karena banyaknya support library yang dibuat dan dikembangkan oleh komunitas Arduino. Oleh karena itu, dalam tutorial kali ini, tidak akan digunakan IDE Arduino untuk memprogram board ini. Tetapi akan menggunakan IDE yang memang khusus dibuat untuk STM32, yaitu STM32CubeIDE.

STM32CubeIDE merupakan IDE berbasis Eclipse yang dibuat oleh ST Microelectronics. IDE ini merupakan gabungan antara Atollic TrueStudio dengan STM32CubeMX. Atollic TrueStudio pada awalnya adalah IDE yang bisa digunakan untuk prosesor ARM Cortex-M dari berbagai pabrikan, namun semenjak diakuisisi oleh STakhir tahun 2017 lalu jadi mengkhususkan untuk STM32. ST kemudian menghentikan pengembangan TrueStudio dan mulai membuat IDE baru yang digabungkan dengan STM32CubeMX dan dinamakan dengan STM32CubeIDE. STM32CubeMX adalah sebuah tool yang berguna untuk mengkonfigurasi mikrokontroler STM32 dan menginisialisasi proses pembuatan proyek program dengan berbagai IDE, seperti Keil, IAR, SW4STM32, TrueStudio, dan lain-lain. Selain itu bisa juga untuk mengintegrasikan berbagai middleware seperti TCP/IP Stack (LwIP), USB (Host/Device), RTOS (FreeRTOS), GUI (STemWin dan TouchGX), bahkan AI (Artificial Intelligent) ke dalam proyek yang dibuat.

Cukup sekian mukadimahnya, saatnya membuat program. STM32CubeIDE bisa diunduh di link yang diberikan di atas. Sebelum bisa mengunduh, harus membuat akun/registrasi di webnya ST. Dengan registrasi juga bisa ikut di forum (komunitas) part-part ST. Setelah diunduh tentunya perlu diinstal. Dan diperlukan koneksi internet untuk mengunduh paket library (HAL dan Middleware) dari keluarga mikro yang digunakan apabila belum ada paket library yang terinstal.

PEMBUATAN PROJECT

Pada tutorial kali ini, akan dibuat program untuk membuat LED yang terhubung ke PC13 berkedip (blink). Ketika STM32CubeIDE dijalankan, program akan meminta untuk memilih direktori/folder sebagai workspace. Setelah tampilan utama STM32CubeIDE keluar, apabila lokasi workspace tersebut pertama kali dibuka atau belum ada proyek yang dibuat, di Project Explorer tidak akan terdapat daftar proyek. Untuk itu proyek bisa dibuat baru atau di-impor dari folder lain. Untuk membuat proyek baru bisa menggunakan menu Create a new STM32 project dari Project Explorer atau tombol Start new STM32 project dari jendela Information Center

Pemilihan Workspace

Setelah tampilan utama keluar, buatlah proyek STM32 baru dari menu File/New/STM32 Project. IDE akan menginisialisasi STM32CubeMx yang sudah terintegrasi. Proses inisialisasi mungkin akan berlangsung agak lama, karena IDE akan memperbaharui database yang dimilikinya (daftar tipe STM32) dan mengecek juga kalau ada versi terbaru dari IDE dengan mengunduh dari server yang dimiliki oleh ST. Proses ini bisa dihentikan. Kemudian sebuah jendela baru dengan 3 tab akan muncul.

Pemilihan MCU

Di jendela Target Selection tersebut, ketikan STM32F103C8 di kotak yang disediakan di pencarian part number. Kemudian dari list MCU/MPU pilih tipe STM32 yang sesuai kemudian klik tombol Next. Kemudian akan muncul jendela Project Setup. Masukan nama proyek yang akan dibuat, misal BluePill Blink lalu klik Next atau Finish.

Project Setup

IDE kemudian akan membuat proyek dan menampilkan pin-out dari tipe MCU yang dipakai (STM32CubeMX). Tab Pinout&Configuration.

Pinout Configuration

Langkah selanjutnya adalah mengaktifkan GPIO yang akan mengendalikan LED (PC13) sebagai output. Tinggal klik pada pin PC13, dan dari menu pop up pilih GPIO_Output.

GPIO Output

Untuk memudahkan label GPIO_Output di pin PC13 bisa diganti menjadi LED. Klik kanan di PC13, lalu pilih Enter User Label dari pop menu, dan isikan label yang diinginkan. Penggantian label ini akan menghasilkan deklarasi sebagai berikut

Change Label

Tahap selanjutnya adalah mengatur clock. Seperti telah dijelaskan, board ini dilengkapi dengan kristal 8 MHz, dengan mengatur PLL internal STM32F103 bisa bekerja di frekuensi 72 MHz. Pilih RCC dari System Core. Kemudian di RCC Mode and Configuration pilih High Speed Clock (HSE) dengan Crystal/Ceramic Resonator. Di tutorial kali ini clock LSE tidak digunakan.

Aktifasi Clock HSE

Setelah pin untuk kristal eksternal diaktifkan, saatnya untuk mengkonfigurasi clock. Dari tab Clock Configuration. Masukan Input frequency sesuai dengan kristal yang dipakai (8 MHz). Pilih PLL Source Mux sebagai HSE, artinya sumber clock dari kristal eksternal. Pilih PLLCLK dari System Clock Mux, artinya sumber clock akan diambil dari keluaran PLL. Dan masukan 72 di kotak HCLK(MHz), lalu tekan tombol ENTER. STM32CubeMX akan mengkonfigurasi clock secara otomatis sesuai dengan yang diinginkan.

Konfigurasi Clock

Selanjutnya klik tab Project Manager. Dari menu Project biarkan sesuai yang diberikan oleh STM32CubeMX. Untuk yang lain mungkin diperlukan untuk mengatur ukuran memori Heap dan Stack.

Menu Project

Dari menu Code Generator check Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral agar file sumber dan header untuk inisialisasi setiap periperal dipisahkan per periperal. Misal dalam dalam tutorial ini digunakan GPIO, maka inisialisasi GPIO akan dilakukan di file gpio.c. Kalau digunakan UART, makan dibuatkan file uart.c dan sebagainya. Ini untuk memudahkan pembacaan source code saja.

Seting Code Generator

Sampai di sini pengaturan STM32CubeMX sudah selesai. Simpan pengaturan yang telah dibuat, dari menu File/Save atau klik ikon disket atau CTRL+S.Klik Yes ketika ada pertanyaan. Tunggu beberapa saat. STM32CubeMX akan membuat file dengan nama sesuai dengan nama proyek dengan ekstensi .ioc. Saatnya membuat program.

PEMBUATAN PROGRAM

Buka file main.c. Dalam bahasa C, program akan selalu diawali dengan fungsi main. Tetapi setelah reset, mikrokontroler akan mengerjakan sebuah program startup (file startup_stm32f103c8tx.s) untuk inisialisasi awal, seperti mengatur memori stack dan heap, mengatur vektor reset, dan memanggil fungsi main. Besarnya memori stack dan heap bisa diatur saat pembuatan proyek STM32CubeIDE dari tab Project Setting dan disimpan file sebuah file linker script (STM32F103C8TX_FLASH.ld). Pada saat startup jalan, STM32F108 akan bekerja dengan osilator internal (8 MHz).

Program main selalu diawali dengan memanggil fungsi HAL_Init() yang akan menginisialisasi library HAL, mengatur agar interupsi timer SysTick setiap 1 milidetik dan mengatur prioritas group NVIC dengan nilai 4. Selanjutnya akan memanggil fungsi SystemClock_Config(), yang terutama akan mengatur sistem clock seperti yang ditentukan oleh STM32CubeMx (bekerja dengan kristal 8 MHz dan frekuensi 72MHz dari PLL). Terakhir program akan memanggil fungsi-fungsi untuk menginisialisasi periperal yang digunakan dalam contoh program ini adalah GPIO.

Pada contoh program pertama ini, hanya akan membuat sebuah LED yang terhubung ke PC13 nyala-mati secara bergantian (blink). Program bisa ditempatkan di loop main dengan memanggil fungsi-fungsi GPIO sebagai output. Bisa menggunakan fungsi HAL_GPIO_Write_Pin atau HAL_GPIO_TogglePin.

HAL_GPIO_WritePin, untuk menset atau me-reset pin GPIO. Fungsi ini memerlukan 3 parameter yaitu port GPIO, pin GPIO, dan status pin. Status pin bisa set (GPIO_PIN_SET) atau reset (GPIO_PIN_RESET).

HAL_GPIO_TogglePin, untuk men-toggle pin GPIO, artinya nilai yang akan dikeluarkan di pin tersebut berkebalikan dari nilai pin sebelumnya, kalau pin sebelumnya di-set, maka perintah toggle akan me-reset pin tersebut.

Agar LED on/off, diperlukan jeda (delay) di antara LED on dan LED off. HAL telah menyediakan fungsi delay (HAL_Delay) dalam milidetik. Fungsi ini menggunakan timer SysTick yang diprogram untuk interupsi setiap 1 milidetik.

Perlu diperhatikan ketika menulis program menggunakan STM32CubeIDE, atau IDE lain yang pembuatannya menggunakan STM32CubeMX. Ada aturan ketika memodifikasi program yang dihasilkan oleh STM32CubeMx. Setiap kali proyek STM32CubeMx men-generate ulang code, akan menimpa(overwrite) file-file yang dihasilkannya. Oleh karena itu, STM32CubeMx menyediakan tempat agar program yang sudah diketik tidak hilang saat generate code ulang. STM32CubeMx menyediakan baris yang diawali dengan /* USER CODE BEGIN xxx*/ dan diakhiri dengan /* USER CODE END xxx*/. Xxx bisa angka kalau berada di baris kode, include untuk menambahkan file header di deklarasi include, PV (private variable) untuk deklarasi variable atau bisa jug PFP (private function prototype) untuk deklarasi fungsi. Pastikan juga menu Keep User Code when re-generating di menu Project Manager/Code Generator.

COMPILE, DEBUG, DOWNLOAD

Setelah selesai menuliskan program di atas, program bisa di-compile. Compile dilakukan dengan meng-klik menu Project/Build Project atau icon bergambar palu. Proses compile bisa diamati di jendela console. STM32CubeIDE akan menginformasikan jika terdapat error di program. Baris kode yang error bisa dilihat di jendela Problem. Dengan mengklik ganda di jendela Problem, STM32CubeIDE akan langsung mengarahkan kursor ke baris kode yang error tersebut. Jika tidak ada error, STM32CubeIDE akan membuat file .elf.

Jendela Console

Dari file .elf ini, STM32CubeIDE akan melakukan analisa terhadap pemakaian memori (flash dan RAM) dan akan menampilkannya di jendela Build Analyzer. Tab Memory Region akan memberikan pemakaian memori flash dan RAM sedangkan tab Memory Details akan memberikan pemakaian secara rinci dari memori tersebut seperti yang terdapat dalam file linker script (.ld). Jika jendela ini belum tampil, Build Analyzer bisa ditampilkan melalui menu Window/Show View/Other lalu pilih Build Analyzer. Begitu juga kalau ingin menampilkan jendela-jendela yang lain.

Analisa Memori

STM32CubeIDE juga menyediakan alat yang dinamakan Static Stack Analyzer yang akan menyediakan informasi tentang pemakaian memori stack oleh setiap fungsi dalam program yang dibuat. Pengaturan ukuran memori stack bisa dilakukan pada saat pembuatan proyek melalui STM32CubeMx (Project Setting) atau dengan mengedit file linker script. Analisa stack ini akan menampilkan pemakaian memori stack setiap fungsi (Max Cost) dan apakah fungsi tersebut akan memanggil fungsi lain (Depth) yang tentunya akan mempengaruhi pemakaian stack.

Setelah selesai di-compile, program yang dihasilkan bisa langsung diprogramkan. STM32CubeIDE juga dilengkapi dengan debugger yang bisa terkoneksi dengan ST Link. Dari ikon bergambar serangga (bug) klik tanda panah ke bawah dan pilih Debug Configurations. Dari jendela Debug Configuration klik di STM32 Cortex-M C/C++ Application. Kemudian klik ikon untuk membuat konfigurasi baru. Maka akan terbentuk konfigurasi baru sesuai dengan nama proyek.

Dari tab Debugger pastikan Debug probe dipilih ST Link (ST-LINK GDB Server), Interface pilih SWD (seting default). Kemudian klik tombol Debug. Pastikan juga ST Link terhubung dengan Blue Pill dan terhubung dengan PC melalui kabel USB.

Koneksi ST Link

Setelah di klik tombol Debug, ternyata STM32CubeIDE memberikan pesan error Could not verify ST device! Abort connection. Inilah yang disebut konsekuensi dari harga yang sangat murah. Ternyata debugger mendeteksi bahwa chip STM32F103 yang ada di board Blue Pill tidak original buatan ST. Kemungkinan besar chip tersebut adalah versi bajakan yang dibuat oleh suatu pabrikan yang tidak menghormati hak cipta intelektual. Sebenarnya pihak ST tidak merekomendasikan untuk menggunakan type STM32F103, karena chip type ini banyak digunakan sehingga ada yang memalsukan. Kecuali kalau beli dari distributor resmi yang telah ditunjuk oleh ST. Selain itu karena banyak yang memakai, lead time dari type ini sangat panjang, sehingga bisa berpengaruh ke jadwal produksi.

Tapi tenang, masih ada cara lain untuk memprogram IC ini, yaitu menggunakan software ST Link Utility atau STM32CubeProgrammer. Dalam tutorial ini akan digunakan ST Link Utility. Seperti telah dijelaskan saat compile IDE hanya menghasilkan file *.elf (untuk debugger), sedangkan ST Link Utility membutuhkan file *.bin atau *.hex. Untuk itu perlu dibuat dulu file bin atau hex-nya. Dari Project Explorer klik kanan dari proyek yang sedang dibuat lalu klik Properties. Dari menu C/C++ Build/Settings tab Tool Settings klik MCU Post build outputs pilih file apa saja yang akan dihasilkan, misalkan file *.hex.

Post Build

Compile ulang, maka file *.hex telah dihasilkan. File ini akan berada di folder Workspace dengan sub folder nama proyek dan sub-folder Debug. Nama file akan sama dengan nama proyek dengan ektensi .hex. Buka dengan ST Link Utility, lalu programkan ke board.

ST Link Utility

Jika ada error saat koneksi ke target, setelah cek pengkabelan OK, coba Blue Pill dipindah dulu ke mode bootloader, lalu coba lagi koneksi dengan ST Link Utility. Setelah download program berhasil, kembalikan kembali ke mode normal. Jika program berhasil, LED akan berkedip setiap 500 mili detik.

Mode BOOT0

Pada tutorial ini saya tidak akan share soure code, karena code dari tutorial ini cuma 2 baris, source code yang lain dihasilkan oleh STM32CubeMX.

Semoga bermanfaat.

Visits: 17 Visits: 108195

Leave a Reply

Your email address will not be published. Required fields are marked *

Copyright © All rights reserved. | Newsphere by AF themes.