fatfs移植和使用(在SPI_FLASH上建立文件系统)

2023-11-07

文件系统对于嵌入式系统的重要性是不言而喻的,有了文件系统管理数据和外设变得方便许多,同时简化了应用的开发。今天我们来以在SPI_FLASH上建立文件系统为例,看看FATFS文件系统怎么移植和使用。

需要准备的材料有:

(1)FATFS文件系统源码(点此下载最新FATFS源码)。

(2)单片机平台一个(内存越大越好)。

(3)SPI_FLASH芯片一个(如:W25Q32)。

FATFS是一个通用的嵌入式文件系统,对不同的平台支持很好,大到硬盘、U盘、存储卡,小到spi_flash芯片甚至单片机内部FLASH都可以使用FATFS。今天我们就在一个4M大小的SPI_FLASH( W25Q32 )上建立一个文件系统,主控制器是飞思卡尔K60单片机。在做文件系统移植前,你需要把操作SPI_FLASH的驱动调通,能读写SPI_FLASH就可以了。

step 0.1:下载最新的FATFS源码,当前版本:R0.13。

step 0.2 解压缩新下载的FATFS源码,看看里面都是些什么文件。如下图所示,红色框是移植FATFS所必须的文件,蓝色框内的文件是可选的移植文件。

diskio.c个diskio.h是和存储器读写控制相关的驱动接口,比如SPI_FLASH的读写函数接口,都要映射到这里面。必须的文件 

ff.h和ff.h是FATFS的核心文件,必须的文件

ffconf.h是FATFS的配置文件,用来裁剪FATFS,必须的文件

integer.h是FATFS所用到的数据类型定义,用以兼容不同字长CPU,必须的文件

ffsystem.c是一些关于在带操作系统平台中,使用的示例,可选文件

ffunicode.c是万国码编码文件,文件里主要是大数组定义,假如你需要让文件名支持中文就需要这个文件,这个文件会使代码空间急剧变大,可选文件

step 0.3 本次FATFS移植未使用操作系统,文件系统支持中文路径和名称,所以需要ff.c、ff.h、ffconf.h、diskio.c、diskio.h、ffunicode.c和integer.h这六个文件添加到工程中即可。如下图:

 

step 1.0 修改ffconf.h文件,来裁剪我们的FATFS,通过宏开关来去掉不用的功能,来精简文件系统。想知道每个宏的功能?(点击这里

需要注意的是:由于我们此次移植支持了中文路径和名称,所以这个要设置这个宏    #define FF_CODE_PAGE936 /*936代表 简体中文*/

step 1.1 修改diskio.c 来映射我们的存储器读写控制接口,如下:

/*-----------------------------------------------------------------------*/
/* Low level disk I/O module skeleton for FatFs     (C)ChaN, 2016        */
/*-----------------------------------------------------------------------*/
/* If a working storage control module is available, it should be        */
/* attached to the FatFs via a glue function rather than modifying it.   */
/* This is an example of glue functions to attach various exsisting      */
/* storage control modules to the FatFs module with a defined API.       */
/*-----------------------------------------------------------------------*/
 
#include "diskio.h"		/* FatFs lower layer API */
#include "w25qxx.h"
#include "debug.h"
 
#define DISKIO_DEBUG 1
#if defined DISKIO_DEBUG&&(DISKIO_DEBUG)
#define diskio_printf  uart_printf
#else
#define diskio_printf(a,...)
#endif
 
/* Definitions of physical drive number for each drive */
#define SPI_FLASH		0	/* Example: Map Ramdisk to physical drive 0 */
 
/*-----------------------------------------------------------------------*/
/* Get Drive Status                                                      */
/*-----------------------------------------------------------------------*/
 
DSTATUS disk_status (
	BYTE pdrv		/* Physical drive nmuber to identify the drive */
)
{
	if(pdrv == SPI_FLASH) 
	{
		return RES_OK; //直接返回OK即可
	}
	else
	{
		diskio_printf("!!!disk_status ERR\r\n");
		return RES_PARERR;
	}
}
 
 
 
/*-----------------------------------------------------------------------*/
/* Inidialize a Drive                                                    */
/*-----------------------------------------------------------------------*/
 
DSTATUS disk_initialize (
	BYTE pdrv				/* Physical drive nmuber to identify the drive */
)
{
	if(pdrv == SPI_FLASH) 
	{
		w25qxx_init();//初始化 spi flash
		return RES_OK;
	}
	else
	{
		diskio_printf("!!!disk_initialize ERR\r\n");
		return RES_PARERR;
	}
}
 
 
 
/*-----------------------------------------------------------------------*/
/* Read Sector(s)                                                        */
/*-----------------------------------------------------------------------*/
 
DRESULT disk_read (
	BYTE pdrv,		/* Physical drive nmuber to identify the drive */
	BYTE *buff,		/* Data buffer to store read data */
	DWORD sector,	/* Start sector in LBA */
	UINT count		/* Number of sectors to read */
)
{
	DRESULT res;
	//uart_printf("disk_read---sector:%d,count:%d\r\n",sector,count);
	if(pdrv == SPI_FLASH) 
	{
		res = FS_SpiFlash_Read(buff,sector,count);//spi flash的读接口,注意函数参数类型一致性
 
		return res;
	}
	else
	{
		diskio_printf("!!!disk_read ERR\r\n");
		return RES_PARERR;
	}
}
 
 
 
/*-----------------------------------------------------------------------*/
/* Write Sector(s)                                                       */
/*-----------------------------------------------------------------------*/
 
DRESULT disk_write (
	BYTE pdrv,			/* Physical drive nmuber to identify the drive */
	const BYTE *buff,	/* Data to be written */
	DWORD sector,		/* Start sector in LBA */
	UINT count			/* Number of sectors to write */
)
{
	DRESULT res;
 
	if(pdrv == SPI_FLASH) 
	{
		res = FS_SpiFlash_Write((uint8_t *)buff,sector,count);//spi flash的写接口,注意函数参数类型一致性
		return res;
	}
	else
	{
		diskio_printf("!!!disk_write ERR\r\n");
		return RES_PARERR;
	}
}
 
 
 
/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions                                               */
/*-----------------------------------------------------------------------*/
 
DRESULT disk_ioctl (
	BYTE pdrv,		/* Physical drive nmuber (0..) */
	BYTE cmd,		/* Control code */
	void *buff		/* Buffer to send/receive control data */
)
{
	if (pdrv == SPI_FLASH)
	{
		switch (cmd) 
		{
		 case CTRL_SYNC:
			 return RES_OK;
 
		 /* 扇区数量 1024*1024*1024 =4 (MB) */
 
		 case GET_SECTOR_COUNT:
 
			 *(DWORD * )buff = 1024;//W25Q32 有1024个大小为4k bytes 的扇区
			 return RES_OK;
 
		 /* 扇区大小 */
 
		 case GET_SECTOR_SIZE :
 
			 *(WORD * )buff = 4096;//spi flash的扇区大小是 4K Bytes
			 return RES_OK;
 
		 /*块大小 */
 
		 case GET_BLOCK_SIZE :
		 	 *(DWORD * )buff = 1;
			 return RES_OK;
			 
		 default:
		 	 return RES_PARERR;
		 }
	}
	else
	{
		diskio_printf("!!!disk_ioctl ERR\r\n");
		return RES_PARERR;
	}
}
//spi flash的读接口,注意函数参数类型一致性

		return res;
	}
	else
	{
		diskio_printf("!!!disk_read ERR\r\n");
		return RES_PARERR;
	}
}



/*-----------------------------------------------------------------------*/
/* Write Sector(s)                                                       */
/*-----------------------------------------------------------------------*/

DRESULT disk_write (
	BYTE pdrv,			/* Physical drive nmuber to identify the drive */
	const BYTE *buff,	/* Data to be written */
	DWORD sector,		/* Start sector in LBA */
	UINT count			/* Number of sectors to write */
)
{
	DRESULT res;

	if(pdrv == SPI_FLASH) 
	{
		res = FS_SpiFlash_Write((uint8_t *)buff,sector,count);//spi flash的写接口,注意函数参数类型一致性
		return res;
	}
	else
	{
		diskio_printf("!!!disk_write ERR\r\n");
		return RES_PARERR;
	}
}



/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions                                               */
/*-----------------------------------------------------------------------*/

DRESULT disk_ioctl (
	BYTE pdrv,		/* Physical drive nmuber (0..) */
	BYTE cmd,		/* Control code */
	void *buff		/* Buffer to send/receive control data */
)
{
	if (pdrv == SPI_FLASH)
	{
		switch (cmd) 
		{
		 case CTRL_SYNC:
			 return RES_OK;

		 /* 扇区数量 1024*1024*1024 =4 (MB) */

		 case GET_SECTOR_COUNT:

			 *(DWORD * )buff = 1024;//W25Q32 有1024个大小为4k bytes 的扇区
			 return RES_OK;

		 /* 扇区大小 */

		 case GET_SECTOR_SIZE :

			 *(WORD * )buff = 4096;//spi flash的扇区大小是 4K Bytes
			 return RES_OK;

		 /*块大小 */

		 case GET_BLOCK_SIZE :
		 	 *(DWORD * )buff = 1;
			 return RES_OK;
			 
		 default:
		 	 return RES_PARERR;
		 }
	}
	else
	{
		diskio_printf("!!!disk_ioctl ERR\r\n");
		return RES_PARERR;
	}
}

 

DWORD get_fattime(void) 
{
   DWORD time; /* 返回当前时间戳 */ //暂不添加时间获取,需要的话就把RTC数据传入这里
//暂不添加时间获取,需要的话就把RTC数据传入这里
	return 0;
}

要修改的文件就这么多了,其他文件直接使用,不用改动。

step2.0  下面写个测试函数,来测测我们移植成功 了没有。

void fs_test(void)
{
	FATFS fs;           /* Filesystem object */
    FIL fil;            /* File object */
    FRESULT res;  /* API result code */
    UINT bw;            /* Bytes written */
    BYTE work[FF_MAX_SS]; /* Work area (larger is better for processing time) */
	BYTE mm[50];
	UINT i;
	
	uart_printf("文件系统测试开始:\r\n");
	/* 格式化文件系统 */
	res = f_mkfs("0:", FM_ANY, 0, work, sizeof work);//"0:"是卷标,来自于 #define SPI_FLASH		0
	if (res)
	{
		uart_printf("文件系统格式化失败.\r\n");
		return ;
	}
	else
	{
		uart_printf("文件系统格式化成功.\r\n");
	}
	/* 挂载文件系统 */
	res = f_mount(&fs, "0:", 0);
	if (res)
	{
		uart_printf("文件系统挂载失败.\r\n");
	}
	else
	{
		uart_printf("文件系统挂载成功.\r\n");
	}
	/* Create a file as new */
	res = f_open(&fil, "0:/测试文件.txt", FA_CREATE_NEW|FA_WRITE|FA_READ);
	if (res)
	{
		uart_printf("打开文件失败.\r\n");
	}
	else
	{
		uart_printf("打开文件成功.\r\n");
	}
	/* Write a message */
	res = f_write(&fil, "Hello,World!", 12, &bw);
	//uart_printf("res write:%d\r\n",res);
	if (bw == 12)
	{
		uart_printf("写文件成功!\r\n");
	}
	else
	{
		uart_printf("写文件失败!\r\n");
	}
	res = f_size(&fil);
	uart_printf("文件大小:%d Bytes.\r\n",res);
	memset(mm,0x0,50);
	f_lseek(&fil,0);
	res = f_read(&fil,mm,12,&i);
	if (res == FR_OK)
	{
		uart_printf("读文件成功!\r\n");
		uart_printf("读到数据长度:%d Bytes.\r\n",i);
	}
	else
	{
		uart_printf("读文件失败!\r\n");
	}
	uart_printf("读到如下数据:\r\n");
	buff_print((char *)mm,12);
	/* Close the file */
	f_close(&fil);
	/*卸载文件系统*/
	f_mount(0, "0:", 0);
	uart_printf("文件系统测试完毕.\r\n");

step2.1  Congratulations!!!瞧, 我们成功了,尽情享用文件系统带来的便利吧。

说的比较浅显,大家有问题或建议欢迎留言。over

https://blog.csdn.net/qq_21475601/article/details/78032854

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

fatfs移植和使用(在SPI_FLASH上建立文件系统) 的相关文章

  • 芯片的SD/MMC控制器以及SD卡介绍

    1 MMC SD卡 eMMC介绍 1 1 三者关联 1 最早出现的是MMC卡 卡片式结构 按照MMC协议设计 相较于NandFlash芯片来说 MMC卡有2个优势 第一是卡片化 便于拆装 第二是统一了协议接口 兼容性好 2 后来出现SD卡
  • SPI协议读写SD卡介绍

    前言 在前面的文章中 我们主要介绍了如何利用SDIO协议对SD卡进行读写操作的流程及注意事项 虽然SDIO协议读写SD卡的效率很高 但是 操作却比较麻烦 另外 还需要使用的芯片具有SDIO外设 这对于不具备SDIO外设的芯片而言 绝对是一个
  • 基于SD卡的FatFs文件系统(FatFs移植到STM32)

    平台 STM32ZET6 核心板 ST LINK V2 SD卡 USB串口线 一 移植 工程介绍 主要文件在USER组中 bsp sdio sdcard c bsp sdio sdcard h和main c 另外FatFs是用来后面移植文件
  • FATFS文件系统详解

    FATFS文件系统详解 文章目录 FATFS文件系统详解 1 简介 2 基础概念 3 FAT文件系统组成介绍 4 FAT文件系统分析 4 1 采用FAT格式格式化SD nand sd卡 4 2 引导扇区分析 4 3 分区偏移及大小计算 4
  • FATFS 0.13 f_mount(&fs,““,1)挂载失败的原因

    这两天学着用了一下FATS文件系统 虽然工作中没用到 但是对个人的经验积累还是有用的 看了一下 代码并不多 但是精简啊 指针跳来跳去的一不小心就晕了 所以也遇到了不少问题啊 这里就讲一下我遇到的第一步就懵逼的问题 那就是 FRESULT f
  • STM32的简单的SD卡读写

    导读 SD卡一般支持两种读写模式 SPI和SDIO模式 SD卡的引脚排序如下图所示 SPI模式下有几个重要的操作命令 分别是 SD卡R1回应的格式如下SPI模式下的典型初始化过程如下 1 初始化硬件配置 SPI配置 IO配置等 SD卡一般支
  • S3C2440读写sd卡的一些总结

    整理硬盘的时候发现这个文档 以前写2440操作sd卡程序的时候总结的 1 我的2440 sdi对sd卡发送ACMD41时总是反馈crc fail 但是可以得到正确的response sd卡可以正常使用 2 sd卡可以没有mbr 在物理的 0
  • SD卡SPI模式 读写block

    声明 第一次写教程 如若有错误 请指出更正 看了很多网上的教程 还是觉得很多教程中 写多个块的时候有些问题 因此经过3天的奋斗 写出自己的教程 本教程中 没有挂载文件系统 单纯读写Block 会破坏分区和数据 下节再 装上文件系统Fatfs
  • SD卡/TF卡简记

    文章目录 MicroSD卡与SD卡关系与区别 对比NM卡 XQD卡 CFexpress卡 SD规格标识 FAQ 拍摄1080p或2k视频需要什么速度的sd卡 拍摄4k视频需要什么速度的sd卡 拍摄8k视频需要什么速度的sd卡 MicroSD
  • STM32 SPI方式读写SD卡

    前段时间在51上模拟SPI实现了对SD卡的读取 效果还算不错 最近将其移植到STM32上 不过使用硬件SPI和使用软件SPI还是有差别的 代码如下 void User SPIInit void GPIO InitTypeDef GPIO I
  • fatfs移植和使用(在SPI_FLASH上建立文件系统)

    文件系统对于嵌入式系统的重要性是不言而喻的 有了文件系统管理数据和外设变得方便许多 同时简化了应用的开发 今天我们来以在SPI FLASH上建立文件系统为例 看看FATFS文件系统怎么移植和使用 需要准备的材料有 1 FATFS文件系统源码
  • MMC、SD、TF、SDIO、SDMMC简介

    MMC 概念 MMC的全称是 MultiMediaCard 所以也通常被叫做 多媒体卡 是一种小巧大容量的快闪存储卡 特别应用于移动电话和数字影像及其他移动终端中 外形及接口定义 如上图所示 MMC存贮卡只有7pin 可以支持MMC和SPI
  • 发布一个在读写sd卡时,此时sd卡拔出造成死机的处理方法

    发布一个在读写sd卡时 此时sd卡拔出造成死机的处理方法 同时也在此记录一下 以备后用及有需要人们参考 stm32f4xx hal sd c 红色的代码是增加上去的 函数名称 static HAL SD ErrorTypedef SD Cm
  • STM32F407移植FATFS文件系统(版本 R0.09b)支持长文件名和中文名称

    FatFs文件系统 默认是不支持长文件名和中文名称的 要想支持长文件名和中文名称 需要打开ffconf h文件进行配置 一 支持长文件名 FatFs文件系统 默认是不支持长文件名的 要想支持长文件名 需要打开ffconf h文件进行配置 找
  • SD卡、TF卡读写速率测试

    请注意 可以在未经过博主同意下转载 但必须注明出处 谢谢 1 运行HDBENCH软件 点击确定 2 弹出如下图所示界面 配置选项并测试 选择待测TF卡 Removable可移动存储设备 图示所插入的TF卡是 I 盘 请根据实际情况选择 选择
  • SD卡 FATFS CSV 文件中的 逗号和换行

    RFC 4180 Common Format and MIME Type for Comma Separated Values CSV Files 要点有 1 CSV的换行符号要使用CRLF 即 回车符 换行符 的形式 2 文字可以使用双引
  • FATFS实现数据追加功能(原文不覆盖)

    在对FATFS的应用中我们经常需要把采集的数据存入的文件中 用作保存 也许我们的系统是一个长期的运行过程 但是我们的数据可能不是持续采集的 所以我们这样写代码 注册一个工作区域 f mount 0 fs 打开创建一个新文件 res f op
  • SD卡初始化以及命令详解

    SD卡是嵌入式设备中很常用的一种存储设备 体积小 容量大 通讯简单 电路简单所以受到很多设备厂商的欢迎 主要用来记录设备运行过程中的各种信息 以及程序的各种配置信息 很是方便 有这样几点是需要知道的 SD 卡是基于 flash 的存储卡 S
  • 关于如何修复烧写镜像文件失败的SD卡

    前言 使用某些软件 比如 win32 Disk Imager 向SD卡烧写镜像文件时 很有可能出现烧写失败的情况 通常如果烧写失败 系统会弹出请求格式化SD卡的提示框 此时不要点格式化 点了可能会造成不可挽救的结果 也可能不会 而是进行以下
  • 【正点原子探索者STM32F407开发板例程连载+教学】第30章 SPI通信实验

    第三十章 SPI 实验 mw shl code c true 1 硬件平台 正点原子探索者STM32F407开发板 2 软件平台 MDK5 1 3 固件库版本 V1 4 0 mw shl code 本章我们将向大家介绍STM32F4的SPI

随机推荐

  • 基于java的Mock利器-Mockito

    1 认识Mockito Mockito是java单元测试中使用率最高的Mock框架之一 特点 简明的语法和完整的文档 Mockito支持永Maven和Gradle来进行依赖引入和管理 2 Mockito Maven引入
  • 记一次Redis配置database不生效的问题

    1 先贴代码 乍一看 这个配置没问题 redis也在spring下 springboot 的 Configuration 也会默认加载redis的配置 但是一开始怎么调试都不能默认数据库为1的情况 后来我在Redis配置中发现了另一个好东东
  • Linux下重要文件不小心被删除?别着急,看这里!

    针对日常维护操作 难免会出现文件误删除的操作 大家熟知linux文件系统不同win有回收站 删除后的文件可以到垃圾箱寻回 要知道linux文件修复比较费劲 网络上面的文档也是五花八门 所以本次研究一种比较靠谱的文件和目录恢复方法 也给维护人
  • leedcode 1254. 统计封闭岛屿的数目

    题目 二维矩阵 grid 由 0 土地 和 1 水 组成 岛是由最大的4个方向连通的 0 组成的群 封闭岛是一个 完全 由1包围 左 上 右 下 的岛 思路 封闭岛屿是由1完全包围的岛 也就是说 该岛屿不能在二维矩阵的边界处 这种情况排出后
  • C语言编程中遇到Warning提示的解决方法:warning:implicit declaration of function ‘XXX‘,conflicting types for ‘XXX’

    目录 原因 解决办法 总结 在用codeblocks编写C语言代码时遇到了一个错误 implicit declaration of function XXX conflicting types for XXX 这里的 XXX 代表的是我自己
  • 案例实践:Shell定时上传文件至HDFS

    目录 一 项目需求 二 实现思路 三 具体实现流程 1 规划文件目录 2 开发shell脚本 3 给shell脚本授权 4 定时执行Shell脚本 5 查看HDFS历史访问日志 一 项目需求 公司在线服务器每天都会产生网站运行日志 为了避免
  • 机器学习_深度学习毕设题目汇总——目标检测B

    下面是该类的一些题目 题目 典型恶劣天气条件下高铁周界入侵目标检测 图模型融合时空特征的视觉显著性目标检测算法研究 基于SAR图像的舰船目标检测方法研究 基于三维点云分析的智能汽车目标检测方法研究 基于传播模型的显著目标检测方法研究 基于全
  • 如何在Ubuntu服务器上安装 QEMU/KVM 以创建虚拟机

    KVM是 Kernel based Virtual Machine 的缩写 是集成到 Linux 内核中的开源类型 1 虚拟机管理程序 裸机虚拟机管理程序 它允许您创建和管理运行 Windows Linux 或 UNIX 变体 如 Free
  • 微信小程序云开发操作全解

    云开发三大基础能力 云函数 运行在微信服务器上的函数 处理微信相关操作有天然优势 如获得用户信息异常方便 以前服务端解析很麻烦 数据库 一个小程序可以直接操作的JSON数据库 可以直接操作数据库 不在需要服务端了 存储 用来存储文件和图片
  • Vue中获取接口的方法

    在vue小黑框中输入 cnpm install axios 下载安装 可以设置成全局 引入import axios from axios 把axios放进Vue对象的原型中 Vue prototype axios axios 设置默认的地址
  • 思科模拟器基础实验完整流程-初级

    文章目录 实验拓扑 第一部分 企业总部内网 第一层 接入层 第二层 汇聚层 解决 VLAN 间通信 第三层 网络层 第二部分 企业分部内网 第三部分 外部网络路由 第四部分 NAT 地址转换 第五步 VPN 实验拓扑 由图我们可以看到这张拓
  • 【SpringCloud】用【Idea】构建Maven父子工程图文(1)

    1 概述 之前老是出现idea建springCloud的maven父子工程失败 特此写下经验和教训 springboot版本 2 2 1 2 不多逼逼 图文教程直接来 新建maven空工程 事先准备好一个空文件夹 选择刚才建好的空文件夹 不
  • C# 企业微信:开启消息接受&接收消息&推送消息

    前言 微信吧 接触的人都会100 各种踩坑 就算同样东西去年做过 今年来一样踩坑 因为太多你稍微不记得一点点的细节就能让你研究N久 为此 我要把这个过程详细的记录下来 一 开启消息接受 1 拿到企业corpId 应用的Token Encod
  • proteus中如何加载C语言程序,Proteus运行Keil编写的51单片机C语言步骤

    1 在Keil 编写好程序以后 在左侧项目栏中单击鼠标右键 如下图 2 点击上图中Options for Target Target1 选项 弹出下列窗口 3 在Target标签中将Xtal MHz 中的晶振频率改为12 0 再在Outpu
  • 【周末闲谈】关于“数据库”你又知道多少?

    个人主页 个人主页 系列专栏 周末闲谈 系列目录 第一周 二进制VS三进制 第二周 文心一言 模仿还是超越 第二周 畅想AR 文章目录 系列目录 前言 数据库 数据库的五大特点 数据库介绍 数据库管理系统 DBMS 数据库的结构 数据库的操
  • 给定一个十进制正整数 n(0 < n < 1000000000),每个数位上数字均不为 0。n 的位数为 m。现在从 m位中删除 k位 (0<k < m),求生成的新整数最小为多少?例如: n = 9

    题目描述 给定一个十进制正整数 n 0 lt n lt 1000000000 每个数位上数字均不为 0 n 的位数为 m 现在从 m位中删除 k位 0
  • 如何搭建Tesla Occupancy Network的一个基线?

    作者 我叫斯蒂芬 编辑 汽车人 原文链接 https zhuanlan zhihu com p 575058907 点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 BEV感知 技术交流群 原文链
  • 前端音波绘制

    好久不曾写博客了 忙忙碌碌大半年 毕业就工作果然还是有点意思 本人贼懒 但是只要是研究了点东西的话 还是分享一下供其他感兴趣的小伙伴前车之鉴吧 回归正题 用过手机百度音乐的朋友们 这里算打个广告吧 估计会注意音乐播放后左下角那个音波绘制的看
  • 基于yolov3源码的训练过程

    基于yolov3源码的训练过程 在yolo官网上使用一下指令可以对模型的数据集进行训练 darknet detector train cfg voc data cfg yolov3 voc cfg darknet53 conv 74 但是训
  • fatfs移植和使用(在SPI_FLASH上建立文件系统)

    文件系统对于嵌入式系统的重要性是不言而喻的 有了文件系统管理数据和外设变得方便许多 同时简化了应用的开发 今天我们来以在SPI FLASH上建立文件系统为例 看看FATFS文件系统怎么移植和使用 需要准备的材料有 1 FATFS文件系统源码