首页 > 技术文章 > STM32CUBEMX--USB读写测试

mickey-double 2021-10-12 13:24 原文

硬件平台:正点原子阿波罗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库文件 STM32Cube\Repository\STM32Cube_FW_F4_V1.25.0\Middlewares\Third_Party\FatFs\doc\en\appnote.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("\n"); \
 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("\n"); \
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盘读写文件测试效果:

 

 

推荐阅读