# FUNGSIONALITAS BOARD STM32 MB1841D DAN MB1829 SEBAGAI USB HOST ## Board MB1841D dengan NUCLEO-STM32U545RE-Q <center><img src="https://hackmd.io/_uploads/HybaXBDcA.jpg" width="370" height="350" alt="image"></center> <center><small>Gambar 1. Board MB1841D Tampak Atas https://www.digikey.com/en/products/detail/stmicroelectronics/NUCLEO-U545RE-Q/22106570</small></center> <div style="text-align: justify"> <p>Board ini adalah board pengembangan yang dipasangkan dengan STM32U545RE-Q yang merupakan mikrokontroler dari keluarga STM32U5 dari seri STM32 dengan prosesor ARM Cortex-M33. Mikrokontroler ini dirancang untuk aplikasi yang memerlukan performa tinggi serta efisiensi daya. Sesuai dengan [datasheet](https://www.st.com/en/evaluation-tools/nucleo-u545re-q.html), ARM Cortex-M33 adalah prosesor 32-bit dengan arsitektur RISC yang memberikan keseimbangan antara performa dan efisiensi daya, dan mendukung fitur keamanan dengan TrustZone. Sebagai tambahan, MCU ini juga mendukung fitur USB Host. </div> ## Board MB1829 dengan MCU STM32U5A9NJH6Q <center><img src="https://hackmd.io/_uploads/BkWSUSD9A.jpg" width="370" height="350" alt="image"></center> <center><small>Gambar 2. Board MB1829 Tampak Atas https://www.digikey.com/en/products/detail/stmicroelectronics/STM32U5A9J-DK/18110500 </small></center> <center><img src="https://hackmd.io/_uploads/HyltQBuqC.png" width="300" height="350" alt="image"></center> <center><small>Gambar 3. Modul LCD Board MB1829 https://www.st.com/en/evaluation-tools/stm32u5a9j-dk.html </small></center> <div style="text-align: justify"> <p>Meskipun masih dalam satu keluarga dengan board MB1841D (STM32U5xx), board Discovery Kit yang satu ini memiliki peningkatan yang cukup signifikan dari segi fungsional karena memiliki modul LCD yang tentu saja di dalamnya dipasangkan dengan GPU. Berbeda dengan board MB1841D yang memang mendukung fitur USB Host built-in STM32Cube, board yang satu ini mendukung fitur USB Host namun melalui Middleware khusus kembangan Microsoft yang bernama USBX. Board ini juga masih tidak stabil dalam hal USB Host, sehingga untuk board ini diperlukan modifikasi lebih lanjut yang cukup menantang. Datasheet dari board MB1829 dapat dilihat pada link [berikut](https://www.st.com/en/evaluation-tools/stm32u5a9j-dk.html). </div> ## USB Host <div style ="text-align: justify;"> <p>USB atau <em>Universal Serial Bus</em> merupakan sebuah arsitektur yang menghubungkan dua perangkat atau lebih dan mengatur komunikasi serta interaksinya satu sama lain. Terdapat dua peran utama dalam komunikasi ini, yaitu USB Host dan USB Device. USB Host merupakan komponen yang perannya sebagai pengendali utama pada arsitektur USB. Tugas utama USB Host adalah menginisialisasi komunikasi, mengontrol aliran data, serta menyediakan daya kepada perangkat yang terhubung padanya. Pada STM32, terdapat beberapa board yang dapat berperan sebagai USB Host. Fitur ini dapat dicari tau berdasarkan *datasheet* di setiap boardnya. Pada STM32Cube, USB Host ini merupakan *middleware* yang telah disediakan, sehingga tidak diperlukan aplikasi atau *software* tambahan untuk melakukan konfigurasi sebuah board menjadi USB Host. USB Host pada STM32Cube ini lebih terbatas pada peran *host* saja, dan tidak dirancang untuk menjadi *device*. Dengan begitu, board dengan pengaturan USB Host biasanya digunakan untuk aplikasi sederhana, seperti menghubungkan USB *flash drive*, *mouse*, atau *keyboard* ke STM32. </div> ## USBX <div style ="text-align: justify;"> <p>USBX adalah <em>middleware</em> yang dikembangkan oleh Express Logic dan sekarang menjadi bagian dari Azure RTOS (<em>Real-Time Operating System</em>) setelah diakuisisi oleh Microsoft. Pengaturan pada USBX ini pun sama seperti USB Host pada STM32Cube, yaitu menjadikan sebuah board untuk berperan sebagai host. Karena merupakan *middleware* yang lebih canggih, maka USBX ini dirancang untuk aplikasi *embedded* yang memerlukan fitur USB yang lebih kompleks dan dukungan RTOS. Selain itu, USBX ini juga tidak disediakan secara lengkap oleh STM32Cube. Dengan begitu, pengaturannya pada STM32Cube jauh lebih rumit dibandingkan USB Host yang sudah *build-in* di STM32Cube. </div> ## Table Of Contents [toc] ## Testing USB Host pada Board MB1841D <center><img src="https://hackmd.io/_uploads/r1J0jrwcR.png" width="500" height="650" alt="image"></center> <center><small>Gambar 4. Board MB1829 Tampak Atas</small></center> <div style ="text-align: justify;"> <br>Pengaturan konfigurasi board ini dilakukan pada mikrokontrolernya, yaitu ARM STM32F723IEK6. Hal ini dilakukan karena datasheet mikrokontroler tersebut menuliskan secara jelas fitur USB Hostnya. Selain itu, mikrokontroler ini mendukung fitur USB Host pada STM32Cube, tidak seperti boardnya yang tidak terdapat fitur tersebut. <br> <center><img src="https://hackmd.io/_uploads/rkc9gUPqR.png" width="420" height="100" alt="image"></center> <center><small>Gambar 5. Konfigurasi USB Host pada Board MB1841D</small></center> <br>Pengaturan dilakukan terhadap mode RCC, mode USB, USB Host, dan clock mikrokontroler tersebut. Kemudian kode digenerasi berdasarkan konfigurasi serta ditambahkan bagian kode yang membaca serta menulis file dari *Flash Drive*. **Kode Membaca Isi File** ``` cpp // Inisialisasi USB Host dan mount file system FATFS FatFs; // File system object FIL file; // File object FRESULT res; // FatFs function common result code char buffer[256]; // Buffer untuk data UINT bytesRead; // Mount file system res = f_mount(&FatFs, "", 1); if (res == FR_OK) { // Baca file dari root directory res = f_open(&file, "data.txt", FA_READ); if (res == FR_OK) { // Baca data dari file res = f_read(&file, buffer, sizeof(buffer) - 1, &bytesRead); if (res == FR_OK) { if (bytesRead > 0) { buffer[bytesRead] = '\n'; // Null-terminate string // Kirim data melalui USART HAL_UART_Transmit(&huart2, (uint8_t *)buffer, bytesRead, HAL_MAX_DELAY); } else { // Jika bytesRead adalah 0, file mungkin kosong const char* msg = "File is empty\r\n"; HAL_UART_Transmit(&huart2, (uint8_t *)msg, strlen(msg), HAL_MAX_DELAY); } } else { // Jika pembacaan file error const char* errorMsg = "Failed to read file\r\n"; HAL_UART_Transmit(&huart2, (uint8_t *)errorMsg, strlen(errorMsg), HAL_MAX_DELAY); } f_close(&file); // Tutup file setelah selesai } else { // Jika file tidak ditemukan const char* errorMsg = "Failed to open file\r\n"; HAL_UART_Transmit(&huart2, (uint8_t *)errorMsg, strlen(errorMsg), HAL_MAX_DELAY); } } else { // Jika mount gagal const char* errorMsg = "Failed to mount file system\r\n"; HAL_UART_Transmit(&huart2, (uint8_t *)errorMsg, strlen(errorMsg), HAL_MAX_DELAY); } f_close(&file); ``` Kode tersebut ditambahkan di file main.c **Kode Menulis File** ``` cpp static void USBH_UserProcess (USBH_HandleTypeDef *phost, uint8_t id) { /* USER CODE BEGIN CALL_BACK_1 */ switch(id) { case HOST_USER_SELECT_CONFIGURATION: break; case HOST_USER_DISCONNECTION: Appli_state = APPLICATION_DISCONNECT; Unmount_USB(); break; case HOST_USER_CLASS_ACTIVE: Appli_state = APPLICATION_READY; Mount_USB(); Check_USB_Details(); // check space details Scan_USB("/"); // scan for files and directories Create_File("/ROOTFILE.txt"); Write_File("/ROOTFILE.txt", "This data should be in root file\n"); Create_Dir("/DIR1"); Create_File("/DIR1/DIR1FILE.txt"); Write_File("/DIR1/DIR1FILE.txt", "This data should be in DIR1 file\n"); Create_Dir("/DIR2"); Create_Dir("/DIR2/SUBDIR1"); Create_File("/DIR2/SUBDIR1/DIR2FILE.txt"); Write_File("/DIR2/SUBDIR1/DIR2FILE.txt", "This data should be in DIR2/SUBDIR1 file\n as i have nothing better to write/n so i just wrote this\n"); Update_File("/ROOTFILE.txt", "This updated data must be in second line of Root File\n"); break; case HOST_USER_CONNECTION: Appli_state = APPLICATION_START; break; default: break; } /* USER CODE END CALL_BACK_1 */ } ``` Kode tersebut ditambahkan pada file usb_host.c dengan tambahan file library sesuai tutorial pada link [berikut](https://controllerstech.com/stm32-usb-host-msc/). Setelah kode selesai dimodifikasi, project tersebut di-*upload* ke board dan didapatkan hasil berikut. <center><img src="https://hackmd.io/_uploads/rkRV4Bu5C.png" width="450" height="220" alt="image"></center> <center><small>Gambar 6. Konfigurasi USB Host pada Board MB1841D</small></center> <br>Sesuai kode, variabel res adalah variabel bertipe FRESULT yang merupakan enumerasi yang digunakan dalam library FatFs (FAT File System) untuk menunjukkan hasil dari operasi yang dilakukan oleh fungsi-fungsi FatFs. Variabel res tersebut digunakan untuk menyimpan hasil dari setiap pemanggilan fungsi FatFs, seperti f_mount, f_open, dan f_read. Nilai yang tersimpan memiliki berbagai arti. Pada hasil percobaan, nilai yang didapatkan adalah FR_OK. Nilai ini menunjukkan bahwa operasi berhasil tanpa adanya kesalahan, dengan begitu pembacaan *flash drive* dapat dilakukan. Namun variabel buffer yang digunakan untuk menyimpan isi file tidak menunjukkan hasil yang sesuai, bahkan isinya hanyalah terminator "\0". Penyebab tidak terdapatnya bacaan isi file ini adalah board yang tidak mendukung fitur USB Host. Sebenarnya dari datasheet board MB1841D pun terlihat bahwa tidak disebutkannya fitur USB Host maupun USB OTG. Fitur tersebut <strong>==hanya disebutkan di datasheet mikrokontroler STM32F723IEK6==</strong>. Nilai FR_OK yang didapatkan pada variabel res hanya menunjukkan terdeteksi atau tidaknya USB *flash drive* pada board. Nilai tersebut pun didapatkan akibat mikrokontrolernya yang mendukung. Namun, karena board MB1841D (hardware yang terpasang di board) tidak mendukung fitur USB Host, maka tidak dapat dilakukan pembacaan maupun penulisan file pada USB *flash drive*. </div> ## Testing USB Host pada Board MB1829 <div style ="text-align: justify;"> Testing dilakukan juga pada board MB1829. Pada datasheet, baik board maupun mikrokontrolernya terdapat fitur USB OTG. Namun pada konfigurasi pinout di STM32Cube, tidak terdapat USB Host, melainkan yang ada adalah USBX. Hal ini menunjukkan bahwa board MB1829 dapat dikonfigurasikan sebagai USB Host dengan menggunakan <em>middleware</em> USBX. <center><img src="https://hackmd.io/_uploads/BkBv2HOqC.png" width="300" height="410" alt="image"></center> <center><small>Gambar 7. Konfigurasi Parameter USB Host Melalui Middleware USBX</small></center> <br>Seperti yang telah dijelaskan sebelumnya bahwa pengaturan USBX ini jauh lebih rumit, karena memerlukan pengaturan RTOS. Selain itu, register-register yang digunakan pun perlu diatur agar board dapat berperan sebagai USB Host. Percobaan hingga akhir belum dilakukan karena diperlukan waktu belajar dan riset yang lebih lama, sedangkan waktu Kerja Praktik hanya tersisa beberapa hari saja. Namun dengan penjelasan dari *datasheet* dan konfigurasi *middleware* yang terdapat pada pengaturan board, maka board dapat digunakan sebagai USB Host. </div> ## Kesimpulan dan Saran ### Kesimpulan <div style ="text-align: justify;"> Ada dua buah kesimpulan yang didapat dari percobaan ini: 1. Untuk board MB1841D, hanya MCU-nya saja (STM32F7IEK6) yang mendukung fitur USB Host. 2. Untuk board MB1829, baik MCU maupun board mendukung fitur USB Host melalui Middleware USBX. </div> ### Saran <div style ="text-align: justify;"> Jika ada pembaca yang ingin melanjutkan proyek ini, ada beberapa saran dari penulis yang sekiranya berguna untuk ke depannya: 1. Jika ingin menggunakan board pengembangan MB1841D dalam melakukan pembacaan flash drive eksternal, integrasikan MCU STM32F723IEK6 dengan board lain yang mendukung fitur USB Host. Jika memang ingin proses yang lebih sederhana dan memiliki dana berkecukupan, gunakan saja board lain yang mendukung USB Host. 2. Jika ingin menggunakan board pengembangan MB1829, ada baiknya pelajari terlebih dahulu mengenai Azure RTOS dikarenakan kode generasi bawaan STM32CubeIDE dan/atau STM32CubeMX tidak benar dan perlu modifikasi lebih lanjut ([referensi](https://community.st.com/t5/stm32-mcus-products/why-otg-hs-usb-usbx-host-on-stm32u5a9x-just-does-not-work/td-p/592702)). 3. Lebih teliti lagi dalam mengatur bagian konfigurasi Clock dalam STM32CubeIDE dan/atau STM32CubeMX karena perhitungan MUX pada <em>software</em> seringkali tidak akurat. </div>