Biasanya, dalam dunia pemrograman, program yang pertama kali dieksekusi adalah "Hello World", jika dalam dunia pemrograman embedded system program "Hello World" sama dengan LED Blink. Namun, jika hanya sampai pada led blink menurut saya akan kesulitan untuk mendebug program yang lebih kompleks hanya dengan indikator led. Sehingga kebiasaan saya setelah berhasil menyalakan LED saya lanjutkan dengan setup USART/UART. Tujuannya agar perangkat embedded dapat mengirimkan karakter ke hyperterminal komputer dan lainnya dengan menggunakan antarmuka serial.
Dalam perangkat embedded, dalam hal ini mikrokontroler (uC), ada register yang perlu di konfigurasi dalam rangka setup peripheral USART. cara konfigurasi ini sudah banyak referensinya di internet.
yang membuat memunculkan karakter ke hyperterminal ini seru. adalah untuk menggunakan fungsi printf ternyata perlu perlakuan atau seting yang berberda beda pada setiap IDE yang sudah perna saya gunakan (Keil, CoIDE, TrueStudio). Untuk alasan mengapa saya sempat mencoba beberapa IDE. mungkin akan saya tulis pada postingan yang lain (kalau ada semangatnya).
Jika pada Keil kita hanya perlu menambahkan kode ini setelah fungsi main
/** * @brief Retargets the C library printf function to the USART. * @param None * @retval None */ PUTCHAR_PROTOTYPE { /* Place your implementation of fputc here */ /* e.g. write a character to the USART */ USART_SendData(USART1, (uint8_t) ch); /* Loop until the end of transmission */ while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} return ch; }
Cara setup printf pada CoIDE juga sangat berbeda. jika pada keil bisa dikatakan hanya menggunakan dua langkah seperti diatas. Jika pada CoIDE masi ada kode yang perlu diedit pada file prinf.c dalam grup stdio. dan mengedit linker pada saat compile program... mungkin secara singkat bisa dituliskan seperti itu. Tapi proses tidak sesingkat itu.
Masuk dalam pembahasan utama, bagaimana jika menggunakan HAL library. Dan tanggapan saya adalah waw... cukup mendatangkan ngantuk karena suntuk mengapa tidak pernah bisa... bailah cukup basa basinya.
Proses setup printf. dimulai dari konfigurasi usart, tentu dengan menggunakan fungsi HAL library. selanjutnya saya mengikuti atau mencopas dari contoh yang ada, dalam rangka membuat project baru secara custom alias tidak melanjutkan dari project example yang sudah ada. Kelebihannya adalah kita tidak terikan dengan ic yang digunakan pada contoh tersebut (jika arsitektur ic yang digunakan berbeda). dan masi banyak lagi. Lanjut.....
Dalam file main menambahkan kode ini sebelum fungsi main
/* Private function prototypes -----------------------------------------------*/ #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */Dan kode ini setelah fungsi main
/** * @brief Retargets the C library printf function to the USART. * @param None * @retval None */ PUTCHAR_PROTOTYPE { /* Place your implementation of fputc here */ /* e.g. write a character to the USART1 and Loop until the end of transmission */ HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF); return ch; }
Tidak cukup dengan penambahan tersebut, dalam truestudio (karena project atau library HAL dapat di generate ke IDE ini). Kita masi perlu membuat file syscalls.c. Kurang lebih isi dari file ini adalah fungsi fungsi standar yang dapat kita jumpai pada pemrogram bahasa C. Nah dalam file ini terdapat fungsi _write yang masi perlu kita edit lagi.
jika sebelumnya fungsi _write hanya berupa:
int _write(int32_t file, uint8_t *ptr, int32_t len) { /* Implement your write code here, this is used by puts and printf for example */ return len; }
Maka perlu kita tambahkan beberapa barid kode, sehingga menjadi
int _write(int32_t file, uint8_t *ptr, int32_t len) { /* Implement your write code here, this is used by puts and printf for example */ int DataIdx; for (DataIdx = 0; DataIdx < len; DataIdx++) { __io_putchar( *ptr++ ); } return len; }
Kode di atas juga saya copas dari contoh kode yang sudah ada alias bukan hasil dari pemikiran diri sendiri.
Nah untuk dapat menggerate file syscalls.c, dapat mengukuti cara seperti yang ditunjukkan dalam video ini... dalam kurung bukan buatan saya... n_nV
No comments:
Post a Comment