December 5, 2021

Blogna Kang U-2 Man

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

Blue Pill + STM32CubeIDE: UART Printf

3 min read

بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيم

Pada tutorial sebelumya telah ditunjukan bagaimana mengirim dan menerima data melalui port serial, walaupun dalam program hanya menerima 1 karakter dari sebuah program terminal kemudian mengirimkan kembali karakter yang diterima tersebut.

Dalam banyak aplikasi, pengiriman data melalui port serial menggunakan format ASCII sehingga data bisa langsung terbaca melalui program terminal. Namun ketika program memerlukan pengiriman data sebuah variabel ke dalam bentuk ASCII, fungsi pengiriman data yang disediakan oleh HAL tidak bisa langsung melakukannya. Diperlukan fungsi tambahan untuk mengkonversi data tersebut ke dalam format ASCII.

Bahasa C, telah menyediakan sebuah fungsi untuk melakukan hal itu, yaitu fungsi printf. Dalam pemrograman PC (desktop) fungsi printf akan langsung diarahkan ke monitor. Dalam sistem embedded, fungsi printf bisa diarahkan ke UART, I2C, LCD, atau pun ke sebuah port GPIO. Program perlu menyediakan sebuah fungsi yang nantinya akan dipanggil oleh fungsi printf untuk mengirimkan byte demi byte data ke port atau IO yang dimaksud.

Dalam tutorial kali ini akan ditunjukan bagaimana menggunakan fungsi printf di STM32. Port serial yang digunakan masih sama dengan port serial yang digunakan dalam contoh program sebelumnya, yaitu USART1 dengan pengaturan yang sama (baud rate di 115200).

Fungsi printf membutuhkan sebuah fungsi (_write) yang digunakan untuk mengarahkan ke mana data akan dikirim. Fungsi _write ini berada di file syscall.c, yang dihasilkan setiap kali membuat proyek dengan STM32CubeIDE.

Dari baris kode di atas, terlihat bahwa fungsi _write mempunyai atribut weak, sehingga fungsi ini bisa di-override dengan fungsi yang baru agar sesuai dengan kebutuhan kita, dalam hal ini untuk mengarahkan printf ke serial.

Setelah mendeklarasikan fungsi write, maka fungsi printf siap untuk digunakan. Jangan lupa untuk meng-include file stdio.h ke source program. Berikut cuplikan dari progam tutorial kali ini.

Contoh program ini akan printf digunakan untuk mengirim 4 variabel dengan berbagai format, variabel a (unsigned 16 bit), variabel b (signed 16 bit), variabel c (double/float), dan seterusnya seperti dideklarasikan dalam program. Dan berikut hasilnya di serial terminal.

Format Float tidak tertampil

Dari gambar serial terminal di atas, terlihat bahwa variabel float tidak tertampilkan. Hal ini karena secara default compiler di STM32CubeIDE mematikan fungsi float untuk printf, mungkin karena float cukup banyak memakan RAM. Nanti kita akan lihat perbandingan pemakaian RAMnya. Dan secara default juga STM32CubeIDE menggunakan runtime library Reduced C (newlib-nano).

Default Runtime Library

Saat di-compile juga, walaupun program bisa di-compile, namun IDE memberikan tanda error di baris program yang menunjukan float ke fungsi printf.

Error IDE

Ada dua cara untuk mengaktifkan float ke fungsi printf:
1. Menggunakan runtime library Standard C
2. Tetap menggunakan nano-lib dengan fungsi float diaktifkan.

Standard C Library
Nano lib float enable

Dan ini tampilan di serial terminal, nilai float sudah bisa ditampilkan.

Nilai float sudah bisa ditampilkan

Dan berikut penggunaan RAM dan flash dari masing-masing library yang dipakai.

Pemakaian Memori saat float disable
Pemakaian Memori menggunakan Standar C
Pemakaian Memori Menggunakan Nano-lib dengan float enable

Terlihat bahwa penggunaan RAM dan Flash meningkat secara signifikan ketika fungsi float diaktifkan. Oleh karena itu ketika program tidak perlu untuk menampilkan nilai float melalui fungsi printf, maka cukup menggunakan runtime default dari IDE. Kalaupun harus menampilkan nilai float, sebaiknya dipilih runtime nano-lib dengan fungsi float diaktifkan atau membuat fungsi sendiri sehingga bisa lebih menghemat memori.

Selain fungsi printf, bahasa C juga mempunyai fungsi sprintf, yang berfungsi menyimpan data format ke sebuah buffer (array).

Semoga bermanfaat.

Visits: 6 Visits: 97936

Leave a Reply

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

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