【前言】
【STM32F469I-DISCO】移植SD卡驱动-电子产品世界论坛
在上篇,我介绍了如何移植SD,在移植好这个驱动后,就可以移植FATFS了,因为音乐播放器,fatfs是必须的。
【移植的例程】
在官方提供的示例中,有STM32Cube\Repository\STM32Cube_FW_F4_V1.26.2\Projects\STM32469I-Discovery\Applications\Display\LCD_AnimatedPictureFromSDCard这个例程是使用FATFS来实现使用SD卡的图片来显示到LCD上,因此可以拿到这个例程来实现对FATFS的移植。
【移植步骤】
1、打开这个示例,这个示例只有MDK的工程,但是文件是一样的,所以我先打开例程,分析他的结构,从而实现将示例移植过来。我先看下的工程结构:
从工程结构上来看,FatFs/Core下面的3个文件diskio.c、ff.c、ff_gen_drv.c,是FatFs的库文件,跟STM32是没有底层驱动相关的。而sd_diskio.c是FatFs对接stm32f469的驱动接口文件。而fatfs_storge.c是具体的文件读写用户实现。因此做如下移植。
2、理清楚上面的工程结构,那我们参照FatFs移植,我们先把SDK中的STM32Cube\Repository\STM32Cube_FW_F4_V1.26.2\Middlewares\Third_Party下的fatfs文件夹复制到工程中的stm32f469_stm32ide\Middlewares\Third_Party目录下:
3、在工程的Middlewares目录下面新建一个工程文件夹FatFs,并将diskio.c、ff.c、ff_gen_drv.c导入到该项目目录下面。
4、将示例STM32Cube\Repository\STM32Cube_FW_F4_V1.26.2\Projects\STM32469I-Discovery\Applications\Display\LCD_AnimatedPictureFromSDCard工程下的sd_diskio.c、fatfs_storage.c添加到Usrea项目目录下面:
5、将上面的几个文件夹路径添加进c、c++工程中:
6、因为,fatfs是需要通过sdio的dma传输的,需要在stm32f4xx_it.c中添加dma的中断回调函数:
void SDIO_IRQHandler(void) { BSP_SD_IRQHandler(); } void BSP_SD_DMA_Rx_IRQHandler(void) { HAL_DMA_IRQHandler(uSdHandle.hdmarx); }
同时也需要把stm32f469i_discovery_sd.h头文件加进,也需要exter sd的结构体。添加代码如下:
#include "stm32469i_discovery_sd.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN TD */ extern SD_HandleTypeDef uSdHandle; /* USER CODE END TD */
同时因上dma的中断与后面音频的的dma驱动中断有冲突,因此需要把中断修改为dma2_stream4与dma2_stream6:
到此fatfs就移植成功了,如果需要验证,那么我们只需要执行一下storge_Init,如果能返回正确,说明驱动是正常的,详细的验证,将在后面的播放中来验证:
uint32_t Storage_Init(void) { BSP_SD_Init(); /****************** FatFs Volume Access ******************************/ if(f_mount(&fs, (TCHAR const*)"",0)) { return 1; } return 0; }
【总结】
根据官方的示例工程,来实现fatfs的移植,不需要重复造轮子还是比较方便的。
【感谢】
这次移植是学习西安交大严学文老师的TouchGFX课程来实现的。