文件系统对于一个专业的嵌入式系统而言必不可少,博主这两天利用STM32F429成功移植了FATFS,特来分享一下学习心得,避免新人采坑。
我是在SD卡上实现的,因此你需要利用SDIO接口扩展一个SD卡,具体实现如下:
进入Configuration界面,基本参数的不用配置,但是需要开启中断和DMA,配置如下:
点击OK,关闭Configuration窗口。
在MiddleWares下拉列表中打开FATFS,选中SD卡。
进入FATFS的Configuration界面,配置如下:
解释一下改动的两个参数,一个选择读取中文类型的文件,另一个是使能长字节名称命名(如果不选择,只有8字节,超过8字节会出现Hardware Fault),文件系统的磁盘选择3个(方便挂载其他内存)
最后,再设置选择中,把stack的空间大小设置为0X1000大小。
以上,便完成可在CUBEMX中配置FATFS文件系统,点击生成工程文件。
可以看到,在工程目录下,生成了这样一些文件:
具体什么内容先不管,我们需要在main中添加一些代码测试我们的文件管理系统。
首先添加如下所示的全局变量:
/* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ uint32_t byteswritten; /* File write counts */ uint32_t bytesread; /* File read counts */ uint8_t wtext[] = "This is STM32 working with FatFs"; /* File write buffer */ uint8_t rtext[100]; /* File read buffers */ char filename[] = "STM32cube.txt"; /* USER CODE END PV */
在初始化之后,while(1)之前添加如下代码
int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_TIM6_Init(); MX_FMC_Init(); MX_USART1_UART_Init(); MX_TIM7_Init(); MX_USART3_UART_Init(); MX_DMA2D_Init(); MX_LTDC_Init(); MX_SPI5_Init(); MX_SDIO_SD_Init(); MX_FATFS_Init(); /* Initialize interrupts */ MX_NVIC_Init(); /* USER CODE BEGIN 2 */ delay_init(180); LED_Init(); KEY_Init(); SDRAM_Init(); LCD_Init(); ESP8266_Init(); //WIFI ͨѶģ¿é W25QXX_Init(); //Íⲿ SPI FLASH --- 32MB FTL_Init(); //Íⲿ NAND FLASH --- 512MB my_mem_init(SRAMIN); //½«SRAMÖÐ60KBÄÚ´æÓÃÓÚÄÚ´æ¹ÜÀíϵͳ my_mem_init(SRAMEX); //½«SDRAMÖÐ15MBÄÚ´æÓÃÓÚÄÚ´æ¹ÜÀíϵͳ ITEnable(); PeriphInit(); GUI_Init(); Show_SDcard_Info(); LCD_ShowString(400,400,400,24,24,"****** FatFs Example ******"); retSD = f_mount(&SDFatFS, "0:", 0); if(retSD){ LCD_ShowString(400,440,400,24,24,"****** mount error ******"); LCD_ShowNum(800,440,retSD,2,24); Error_Handler(); } else LCD_ShowString(400,440,400,24,24,"****** mount success!!! ******"); retSD = f_open(&SDFile, filename, FA_CREATE_ALWAYS | FA_WRITE); if(retSD){ LCD_ShowString(400,480,400,24,24,"****** open file error ******"); LCD_ShowNum(800,480,retSD,2,24); Error_Handler(); } else LCD_ShowString(400,480,400,24,24,"****** open file success!!! ******"); retSD = f_write(&SDFile, wtext, sizeof(wtext), (void *)&byteswritten); if(retSD){ LCD_ShowString(400,520,400,24,24,"****** write file error ******"); LCD_ShowNum(800,520,retSD,2,24); Error_Handler(); } else LCD_ShowString(400,520,400,24,24,"****** write file success!!! ******"); retSD = f_close(&SDFile); if(retSD){ LCD_ShowString(400,560,400,24,24,"****** close file error ******"); LCD_ShowNum(800,560,retSD,2,24); Error_Handler(); } else LCD_ShowString(400,560,400,24,24,"****** close file success!!! ******"); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
OK,编译通过,下载程序,运行结果如下所示:
之后你便可以在SD卡中找到你创建的文件STM32cube.txt。至此,在STM32F429上建立SD卡的文件管理系统已经全部完成,博主也是各种踩坑,最后也是在网友不断帮助下实现了移植该系统,希望可以给其他人一些帮助,同时也是对整个过程的一个总结。