目录

银杏科技有限公司旗下技术文档发布平台
技术支持电话0379-69926675-801
技术支持邮件Gingko@vip.163.com
版本 日期 作者 修改内容
V1.0 2020-04-17 gingko 初次建立






STM32CubeMX教程二十——读/写U盘(大容量存储器)

1. 新建工程:在主界面选择File–>New Project 或者直接点击ACCEE TO MCU SELECTOR  2. 出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置 在搜索栏的下面,提供的各种查找方式,可以选择芯片内核、型号等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32F407IGTx。  3. 配置RCC,使用外部时钟源  4. 配置调试引脚  5. 将LED对应的3个引脚(PI5,PI6,PI7)设置为GPIO_Output  6. 引脚模式配置  7. 配置UART4  8. 配置USB_OTG_HS  9. 配置USB_HOST  10. 配置文件系统  11. 时钟源设置,选择外部高速时钟源,配置为最大主频  12. 工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 IDE我们使用的是 MDK5  13. 点击Code Generator,进行进一步配置

自行选择方式即可

14. 然后点击GENERATE CODE 创建工程  创建成功,打开工程。





实验二十:USBH_MSC实验——读/写U盘(大容量存储器)

一、 实验目的与意义

  1. 了解STM32 USB HOST结构。
  2. 了解STM32 USB HOST特征。
  3. 掌握STM32 HAL库中USBH_MSC的配置方法。
  4. 掌握USBH_MSC 使用方法。
  5. 掌握Keil MDK集成开发环境使用方法。

二、 实验设备及平台

  1. iCore3 双核心板。点击购买
  2. JLINK(或相同功能)仿真器。点击购买
  3. Micro USB线缆。
  4. Keil MDK 开发平台。
  5. STM32CubeMX开发平台。
  6. 装有WIN XP(及更高版本)系统的计算机。

三、 实验原理

1、USBH_MSC及USB大容量存储设备

2、USB_MSC HOST

3、USB MSC Device

4、USB MSC相关的协议

5、USBH_MSC实验介绍

四、 实验程序

1. 主函数

int main(void)  
{  
  HAL_Init();  
  SystemClock_Config();  
  MX_GPIO_Init();  
  MX_UART4_Init();  
  MX_FATFS_Init();  
  MX_USB_HOST_Init();  
  uart4.printf("\x0c");
  uart4.printf("\033[1;32;40m");   
  uart4.printf("\r\nHello, I am iCore3.\r\n");      
  while (1)  
  {  
    MX_USB_HOST_Process();  
    LED_RED_ON;  
  }  
} 

2. 用户处理函数

static void USBH_UserProcess  (USBH_HandleTypeDef *phost, uint8_t id)  
{  
    int i,j;  
    static FRESULT res;  
    unsigned char write_buffer[512];  
    unsigned char read_buffer[512];  
    unsigned int counter;  
  switch(id)  
  {  
  case HOST_USER_SELECT_CONFIGURATION:  
  break; 
  case HOST_USER_DISCONNECTION:  
  Appli_state = APPLICATION_DISCONNECT;  
  break;  
  case HOST_USER_CLASS_ACTIVE: 
//f_mount  
    res = f_mount(&fatfs,"0:",1);  
    if(res != RES_OK){  
        USBH_UsrLog("\r\nf_mount error!");  
        return;  
    }else{  
        USBH_UsrLog("\r\nf_mount successful!");  
    }     
    //f_open  
    for(i = 0; i < 512 ; i ++)write_buffer[i] = i % 256;  
    res = f_open(&file,"0:/test.txt",FA_READ | FA_WRITE | FA_OPEN_ALWAYS);  
    if(res != RES_OK){  
        USBH_UsrLog("f_open error!");  
        return;  
    }else{  
        USBH_UsrLog("f_open successful!");  
    }  
    //f_lseek  
    res = f_lseek(&file,0);  
    if(res != RES_OK){  
        USBH_UsrLog("f_lseek error!");    
        return;       
    }else{  
        USBH_UsrLog("f_lseek successful!");  
    }  
    //f_write  
    res = f_write(&file,write_buffer,512,&counter);  
    if(res != RES_OK || counter != 512){  
        USBH_UsrLog("f_write error!");  
        return;       
    }else{  
        USBH_UsrLog("f_write successful!");  
    } //f_lseek  
    res = f_lseek(&file,0);  
    if(res != RES_OK){  
        USBH_UsrLog("f_lseek error!");  
        return;  
    }else{  
        USBH_UsrLog("f_lseek successful!");  
    } 
//f_read  
    res = f_read(&file,read_buffer,512,&counter);   
    if(res != RES_OK || counter != 512){  
return;    
  }else{  
        USBH_UsrLog("f_read successful!");  
    }  
    f_close(&file);  
    USBH_UsrLog("read data:");  
    for(i = 0;i < 32;i++){  
        for(j = 0; j < 16; j ++)  
            USBH_UsrLog("%02X ",read_buffer[i*16+j]);  
    }  
    memset(read_buffer,0,sizeof(read_buffer));  
  break;  
  case HOST_USER_CONNECTION:  
  Appli_state = APPLICATION_START;  
  break;  
  default:  
  break;  
  }  
}

3. 打印函数

  #define USBH_DEBUG_LEVEL      1U 
#if (USBH_DEBUG_LEVEL > 0U)  
#define  USBH_UsrLog(...)   uart4.printf(__VA_ARGS__);\  
                            uart4.printf("\r\n");  
#else  
#define USBH_UsrLog(...) do {} while (0)  
#endif  
 
#if (USBH_DEBUG_LEVEL > 1U)  
 
#define  USBH_ErrLog(...) do { \  
                            uart4.printf("ERROR: ") ; \  
                            uart4.printf(__VA_ARGS__); \  
#define USBH_ErrLog(...) do {} while (0)  
#endif    
#if (USBH_DEBUG_LEVEL > 2U)  
#define  USBH_DbgLog(...)   do { \  
                            uart4.printf("DEBUG : ") ; \  
                            uart4.printf(__VA_ARGS__); \  
                            uart4.printf("\r\n"); \  
} while (0)  
#else

五、 实验步骤

  1. 把仿真器与iCore3的SWD调试口相连(直接相连或者通过转接器相连);
  2. 将跳线帽插在USB_UART;
  3. 把iCore3(USB_UART)通过Micro USB线与计算机相连,为iCore3供电;
  4. 把USB_OTG通过Micor USB线与U盘或者读卡器相连,向此存储设备写入文件;
  5. 打开Keil MDK 开发环境,并打开本实验工程;
  6. 打开PuTTY串口中断(注:PuTTY使用方法见附录);
  7. 烧写程序到iCore3上;
  8. 也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。

六、 实验现象

附录: PuTTY使用方法: