
1. 移植前期准备 上一部分我们已经成功移植搭建完成LVGL的关于visual studio2022的PC模拟器,所有的LVGL的驱动源码啥的都在Simulator文件内,这个文件是我们移植到stm32F103所必须的。 我们需要准备一个KEIL的工程,里面需要包含屏幕的驱动,SD卡的驱动以及其他的底层驱动,这个根据自己的需要去添加,其他的关于Stm32的教程有很多,这里不在过多啰嗦。 FATSF文件系统的移植主要是在未来创建项目时将界面所需的图片字库等大文件存放到内存卡中,减小Stm32的内存占用率,所以我们在移植LVGL文件之前把FATFS文件系统移植到项目中。 注意:以后的keil工程的配置以及像源码移植的头文件包含到keil工程中的操作,如果没有特别需要注意的,后续不再提及,大家自己配置一下就好了。 2. keil配置 下面是关于KEIL工程的建立的几个文件。 Libraries--Stm32的固件库 Project----KEIL工程项目 Simulator--上一期建立的Visual studio2022的模拟器文件 User--------外设驱动文件 ![]() USER文件夹内创建几个外设驱动 APP---后期可以添加界面文件 BSP---LCD屏幕驱动、SD卡驱动、RTC配置 LVGL-LVGL的屏幕驱动,输入驱动(触摸屏),SD卡驱动 FATFS--FATFS的文件系统源码用来管理SD卡文件 ![]() 3.FAFS移植 FatFs是用于小型嵌入式系统的通用FAT/exFAT文件系统模块。FatFs模块按照ANSIC(C89)编写,并与磁盘输入/输出层完全分离。因此,它独立于平台。它可以整合到资源有限的小型微控制器中,如8051、PIC、AVR、ARM、Z80、RX等。此外,这里还提供了用于微型微控制器的Petit FatFs模块。 FATFS有两个版本,一个大版本,一个小版本。小版本主要用于8位机(内存小)使用。我们这里使用大版本。 点击FatFs R0.14b进行下载。 ![]() 下载下来的FATFS源码的只有三个文件,这里我们只需要source文件夹下面的文件。 ![]() 我们需要将source文件夹内的所有.c和.h文件全部复制到KEIL工程的USER/FATFS文件下面。 ![]() ff.c FATFS模块,应用层源文件 ffconf.h FatFs模块的配置文件,需要修改。 ff.h FATF和应用程序模块的通用包含文件。 diskio.h 常见包括FATF和磁盘输入/输出模块的文件。 diskio.c 将现有磁盘输入/输出模块连接到FATF的粘合功能示例,底层接口,需要修改。 ffunicode.c 可选Unicode实用程序函数。 ffsystem.c 可选O/S相关函数的示例。 此存档中不包括低级磁盘输入/输出模块,因为FATF模块只是一个通用文件系统层,它不依赖于任何特定的储设备。我们需要提供SD卡的写入的低级别磁盘输入/输出模块控制连接到SD卡设备。 4.FATFS配置 将Fatfs文件夹内的文件添加到KEIL工程中。 ![]() 我们只需要配置diskio.c, ffconf.h两个文件 4.1 diskio.c文件修改 1) 添加SD卡驱动头文件 2)注释掉不需要的RAM,MMC,USB宏定义,添加新的SD卡宏定义 ![]() 3)}修改 disk_status函数,这个函数主要是获取SD卡状态,不使用是直接返回RES_OK ![]() 4)修改disk_initialize 函数初始化SD卡驱动 返回值: 0:成功。1:失败 ![]() 5)修改 disk_read 函数 SD卡读任意扇区的函数 ![]() 6)修改 disk_write 函数 SD卡写任意扇区的函数 ![]() 7)修改 disk_ioctl 函数 填充ioctl命令功能。这些功能是标准的命令,在diskio.h有定义 ![]() 4.2 ffconf.h 文件修改 1)修改编码格式 FATFS支持多种文件编码格式,支持中文和英文 我们只需要修改#define FF_CODEPAGE 936宏就可以,源码里面有编码格式对应的定义 将这个宏定义为936编译后发现代码占用空间特别大,比较移植之前RO Size 多了一百K ![]() 而使用437后发现空间占用就比较小了,所以我们只需要将编码格式宏定义为437,SD卡内的文件夹和所有文件都命名为英文就可以了。 ![]() 2) 修改支持长文件名 这一步需要实现动态内存分配函数在ffsystem.c文件增加 #include <stdlib.h>头文件 #define FF_USE_LFN 3 // 3:使用堆上的动态工作缓冲区启用LFN #define FF_MAX_LFN 255 3)ff.h中添加时间获取函数 DWORD为32位的变量 31-25位:年 24-21位:月 20-16位:日 15-11位:时 10-5位:分钟 4-0位:秒 DWORD get_fattime(void) { DWORD time = 0; RTC_Get(); time = ( ( (calendar.w_year+20) << 25) | (calendar.w_month << 21 ) | (calendar.w_date << 16 ) | (calendar.hour << 11 ) | (calendar.min << 5 ) | (calendar.sec )); return time; } 4)修改堆栈空间 ![]() 到此FATFS文件系统全部移植完成 作者:鹰头猫咪喵喵鱼 |
STM32 GUI LTDC 最大像素时钟评估方法
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
STM32功能安全设计包,助力产品功能安全认证
基于STM32启动过程startup_xxxx.s文件经验分享
HRTIM 指南