Wednesday, February 17, 2016

Pengalaman menggunakan usart dengan HAL Library untuk menjalankan fungsi printf

Sampai lah pada satu ketika, saya harus mulai belajar lagi. ini semua karena tergiur dengan HAL library yang baru yang ada pada STM32 yang dapat diperoleh dengan cara generate otomatis menggunakan STM32Cube. Selama menggunakan STM32 saya menggunakan std_library, yang berjalan di atas IDE Cocox (CoIDE). IDE ini sangat membantu dalam pembuatan new project, karena kita hanya harus memilih type ic, peripheral apa yang akan digunakan, manambahkan fungsi yang kita tulis sendiri dengan cara drag and drop... dan tring... jadilah sebuah project yang langsung bisa diekseskusi. dan berjalan dengan lancar.

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