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库文件 STM32Cube\Repository\STM32Cube_FW_F4_V1.25.0\Middlewares\Third_Party\FatFs\doc\en\appnote.html
系统的组织
(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盘读写文件测试效果: