
In this case the USB peripheral behaves as USB HOST. You can also use it to read contents of a flash drive (thumb drive) connected to USB interface of the STM32F401RE. The storage media is a SD (or microSD) card connected with SDIO peripheral. With this demo, you can use your Nucleo board as a Mass Storage Device that shows on your PC as a removable flash drive. You will find the complete demo in my GitHub repository: This demo is a Cocoox COIDE 1.7.7 project using ARM GCC. Without this modification the USB host lib never enumerate the connected flash drive.
NUCLEO F401RE USBDEVICE DRIVER
NUCLEO F401RE USBDEVICE CODE
Nevertheless, in order to make it work the way I wanted to, I merged several pieces of code from several places. The USB library from ST is the "core" of this demo. Beneath the Nucleo board is the SD card socket. Overview of the breakout board with USB connector. You can also use the FATFS to access the SD card.

That is, if you connect a USB flash drive, you can access its contents using the FATFS library. The code also works as a HOST for Mass Storage Devices. That is, in DEVICE mode, your Nucleo will become a generic USB storage device when connected to the USB port of your computer. So, this post is about of programming a Nucleo-F401RE board to use the STM32F401RE USB peripheral as a DEVICE Mass Storage Class with SDCARD (connected with 4bit SDIO interface) as the media. Most of the codes you will find spread in other examples and libraries. I believe that (at least these days) you will not find another internet site with all the stuff I'm posting here in one place.

This post is a result of several hours of hard work, thinking, planning, trial-and-error, debugging, and searching the internet for working code in order to make the USB peripheral of a STM32 act as an USB device (mass storage) and HOST (mass storage too).
