• STM32CUBEMX--USB读写测试


    硬件平台:正点原子阿波罗F429

    软件工具:STM32CubeMX 5.6.0

    开发IDE: SW4STM32

    参考:STM32CubeMX之FatFS读写U盘 - 天外飞仙cug的个人空间 - OSCHINA - 中文开源技术交流社区

    STM32CubeMX学习笔记(25)——FatFs文件系统使用(操作SPI Flash) - 简书 (jianshu.com)

    测试基于STM32F429--LTDC显示字符与图形 - M&D - 博客园 (cnblogs.com)中的工程

    API使用可参考STM32CUBEMX库文件 STM32CubeRepositorySTM32Cube_FW_F4_V1.25.0MiddlewaresThird_PartyFatFsdocenappnote.html

    系统的组织

     下面显示的依赖关系图是带有FatFs模块的嵌入式系统的典型配置,但不是特定配置

     (a)如果提供了具有FatFs硬盘接口的工作硬盘模块,则不需要其他。(b)为使现有的磁盘驱动具有不同的接口,需要glue功能来转换fatf和驱动之间的接口。

     限制

    文件系统类型:FAT、FAT32(r0.0)和exFAT(r1.0)。

    打开的文件数:无限制。(取决于可用内存)

    卷数:最多10个。

    容量大小:512字节/扇区,最大2 TiB。

    文件大小:在FAT卷上高达4gib - 1,在exFAT卷上几乎没有限制。

    集群大小:FAT卷上最多128个扇区,exFAT卷上最多16个MiB。

    扇区大小:512、1024、2048和4096字节。

    STM32CUBEMX配置:

    1.时钟树

    时钟树需要重新配置,USB OTG FS的时钟为48MHZ  PLLQ,PLLP用于生成系统时钟最大180MHZ,这里配置成120MHZ同时LCD时钟配置成6.5MHZ

     2.USB_OTG_FS模式选择Host_Only

     3.FATFS文件系统模式配置成USB_DISK,

    • CODE_PAGE(Code page on target): Simplified Chinese GBK(DBCS,OEM,Windows) 支持简体中文编码
    • USE_LFN(Use Long Filename): Enabled with dynamic working buffer on the STACK 支持长文件名,并指定使用栈空间为缓冲区

     4.USB_HOST配置大容量存储,打开USB debug功能

     USB调试宏USBH_DEBUG_LEVEL = 2.执行如下,调用printf实现

     1 #if (USBH_DEBUG_LEVEL > 0U)
     2 #define  USBH_UsrLog(...)   do { 
     3                             printf(__VA_ARGS__); 
     4                             printf("
    "); 
     5 } while (0)
     6 #else
     7 #define USBH_UsrLog(...) do {} while (0)
     8 #endif
     9 
    10 #if (USBH_DEBUG_LEVEL > 1U)
    11 
    12 #define  USBH_ErrLog(...) do { 
    13                             printf("ERROR: ") ; 
    14                             printf(__VA_ARGS__); 
    15                             printf("
    "); 
    16 } while (0)

    5.修改堆栈大小

      1 int main(void)
      2 {
      3   /* USER CODE BEGIN 1 */
      4   static int status = 0;
      5   /* USER CODE END 1 */
      6 
      7   /* MCU Configuration--------------------------------------------------------*/
      8 
      9   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
     10   HAL_Init();
     11 
     12   /* USER CODE BEGIN Init */
     13 
     14   /* USER CODE END Init */
     15 
     16   /* Configure the system clock */
     17   SystemClock_Config();
     18 
     19   /* USER CODE BEGIN SysInit */
     20 
     21   /* USER CODE END SysInit */
     22 
     23   /* Initialize all configured peripherals */
     24   MX_GPIO_Init();
     25   MX_USART1_UART_Init();
     26   MX_FMC_Init();
     27   MX_DMA2D_Init();
     28   MX_LTDC_Init();
     29   MX_TIM3_Init();
     30   MX_FATFS_Init();
     31   MX_USB_HOST_Init();
     32 
     33  /* Initialize interrupts */
     34   MX_NVIC_Init();
     35   /* USER CODE BEGIN 2 */
     36   //SDRAM Initialization
     37   //刷新频率计数器(以SDCLK频率计数),计算方法:
     38   //COUNT=SDRAM刷新周期/行数-20=SDRAM刷新周期(us)*SDCLK频率(Mhz)/行数
     39   //我们使用的SDRAM刷新周期为64ms,SDCLK=180/2=90Mhz,行数为8192(2^13).
     40   //所以,COUNT=64*1000*90/8192-20=683 主频:180MHZ
     41   //COUNT=64*1000*60/8192-20=448  主频:120MHZ
     42   BSP_SDRAM_Initialization_sequence(REFRESH_COUNT);
     43 
     44  //LCD Background light
     45   LCD_BL_PWM_Start();
     46   LCD_BL_PWM_SetVal(0);
     47   HAL_Delay(2000);
     48   LCD_BL_PWM_SetVal(100);
     49 
     50   //Clear LCD
     51   BSP_LCD_Clear(LCD_COLOR_BLUE);
     52 
     53   //Set text color
     54   BSP_LCD_SetTextColor(LCD_COLOR_RED);
     55 
     56   //draw Rectangle
     57   BSP_LCD_DrawRect(100,100,50,50);
     58 
     59   //draw line
     60   BSP_LCD_DrawHLine(150,150,100);
     61 
     62   //draw circle
     63   BSP_LCD_SetTextColor(LCD_COLOR_GREEN);
     64   BSP_LCD_DrawCircle(200,200,50);
     65 
     66   //set font type
     67   BSP_LCD_SetFont(&LCD_DEFAULT_FONT);
     68 
     69 
     70   //display string
     71   BSP_LCD_SetTextColor(LCD_COLOR_GREEN);
     72   BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
     73   BSP_LCD_DisplayStringAt(0,0,(uint8_t*)"LCD TEST FONT",LEFT_MODE);
     74   /* USER CODE END 2 */
     75 
     76   /* Infinite loop */
     77   /* USER CODE BEGIN WHILE */
     78 
     79   while (1)
     80   {
     81     /* USER CODE END WHILE */
     82     MX_USB_HOST_Process();
     83 
     84     /* USER CODE BEGIN 3 */
     85     if(Appli_state == APPLICATION_READY)
     86     {
     87         BSP_LCD_DisplayStringAt(0,16,(uint8_t*)"1.U Disk load finish!",LEFT_MODE);
     88 
     89         if(status == 0)
     90         {
     91             status = 1;
     92 
     93             FRESULT retUSBH=f_mount(&USBHFatFS, (TCHAR const*)USBHPath, 1);
     94 
     95             if(retUSBH == FR_OK)
     96             {
     97                 BSP_LCD_DisplayStringAt(0,16*2,(uint8_t*)"2.U Disk mount success!!",LEFT_MODE);
     98                 BSP_LCD_DisplayStringAt(0,16*3,(uint8_t*)"3.Write file test!!",LEFT_MODE);
     99                 retUSBH = f_open(&USBHFile,(const char*)"usb_test.txt",FA_CREATE_ALWAYS|FA_WRITE);
    100                 if(retUSBH == FR_OK)
    101                 {
    102                     BSP_LCD_DisplayStringAt(0,16*4,(uint8_t*)"4.Create/open file Success!!",LEFT_MODE);
    103                 }
    104 
    105                 retUSBH = f_write(&USBHFile,FileBuf,23,&bw);
    106 
    107                 if(retUSBH == FR_OK)
    108                 {
    109                     BSP_LCD_DisplayStringAt(0,16*5,(uint8_t*)"5.Write file Success!!",LEFT_MODE);
    110                 }
    111 
    112                 retUSBH = f_close(&USBHFile);
    113 
    114                 if(retUSBH == FR_OK)
    115                 {
    116                     BSP_LCD_DisplayStringAt(0,16*6,(uint8_t*)"6.Close file  Success!!",LEFT_MODE);
    117                 }
    118 
    119                 BSP_LCD_DisplayStringAt(0,16*7,(uint8_t*)"7.Read file test!!",LEFT_MODE);
    120 
    121                 retUSBH = f_open(&USBHFile,(const char*)"usb_test.txt",FA_READ);
    122 
    123                 retUSBH = f_read(&USBHFile,RdBuf,23,&bw);
    124 
    125                 if(retUSBH == FR_OK)
    126                 {
    127                     BSP_LCD_DisplayStringAt(0,16*8,(uint8_t*)"8.Read file  Success!!",LEFT_MODE);
    128                     BSP_LCD_DisplayStringAt(0,16*9,(uint8_t*)RdBuf,LEFT_MODE);
    129                 }
    130 
    131 
    132                 retUSBH = f_close(&USBHFile);
    133 
    134                 if(retUSBH == FR_OK)
    135                 {
    136                     BSP_LCD_DisplayStringAt(0,16*10,(uint8_t*)"9.Close file  Success!!",LEFT_MODE);
    137                 }
    138             }
    139         }
    140 
    141     }
    142     else if(Appli_state == APPLICATION_START)
    143     {
    144         BSP_LCD_DisplayStringAt(240,16*0,(uint8_t*)"USB Insert!",LEFT_MODE);
    145         status = 0;
    146     }
    147     else if(Appli_state == APPLICATION_DISCONNECT)
    148     {
    149         BSP_LCD_DisplayStringAt(240,16*0,(uint8_t*)"USB disconnect!",LEFT_MODE);
    150         HAL_Delay(1000);
    151         BSP_LCD_Clear(LCD_COLOR_BLUE);
    152     }
    153   }
    154   /* USER CODE END 3 */
    155 }

    U盘读写文件测试效果:

  • 相关阅读:
    游标、锁
    树形背包浅谈
    金字塔
    Codeforces Round #652 (Div. 2) 题解
    NOI1999 棋盘分割
    NEERC2002 Folding
    HDU4283 You Are the One
    Codeforces Round #646 (Div. 2) 题解
    洛谷 P1679 神奇的四次方数
    UVA12563 劲歌金曲
  • 原文地址:https://www.cnblogs.com/mickey-double/p/15386509.html
Copyright © 2020-2023  润新知