每扇区4096字节的fatfs spi flashh能用FatFS吗

> SPI_FATFS
在电子工程世界为您找到如下关于“SPI_FATFS”的新闻
SPI_FATFS资料下载
FATFS文件系统...
FatFs文件系统;l
DAC:软件、硬件触发数模转换;l
CAN:总线控制器局域网;l
SPI:串行外设总线;l
PDB:可编程延时模块,用于精准延时、触发ADC及DAC操作;l
ENET:以太网控制器,包含MAC层通信驱动;l
USB:CDC类设备驱动;l
RTC:实时时钟驱动;l
FLASH:片内FLASH擦除、写入等驱动。 V2.1版本示例工程包括:
1.LPLD_ADC...
SPI_FATFS相关帖子
:,欢迎加入。& & 小车使用的是FreeRTOS操作系统,并配合FatFs。这里讲解下硬件,代码结构和相关功能的实现。硬件:& & 小车主要是由一块小钢炮开发板、一块PCB板、一块STA350BW语音板、三个舵机、小车支架组成,相关物料帖子最后有下载,舵机粘在了面板上,将语音板粘在舵机上,喇叭粘在语音板上,所有的接线全是用细线焊接出来的,实在是不好看呢...
15.2 触摸屏驱动IC15.3 触摸屏测试项目15.4 触摸屏驱动程序分析15.5 触摸屏校准15.5.1 触摸屏校准算法15.5.2 触摸屏校准的实现第16章 SD卡驱动与FAT文件系统16.1 STM32的SDIO接口16.1.1 常见存储卡种类16.1.2 SD卡结构16.1.3 STM32的SDIO接口16.2 FAT文件系统16.2.1 FAT文件系统概述16.2.2 FatFs介绍16.3...
采样值进行直流追踪,并最终减去直流获得交流值;综合源代码见附件!
底层驱动:
为半导而生:
01:虚拟串口的使用
02.&&GPIO中断的使用
03.&&SPI的使用
04. I2C的使用
义剑仗乾坤:
01:学习使用SDIO
shileleyuqi:
01:移植 FATFS 文件系统
snoweaglemcu:
;&使用SPI接口和IO,建立与血氧探头的控制与通讯;
10.22-11.10.& && &&&设置算法,完成基础任务要求,获取良好的血氧与心率信息;
11.11-11.30.& && &&&熟悉LCD显示器的使用,将血氧心率信息与血氧脉动波形显示在屏幕上;学习使用...
Cortex®-M4 CPU 采用自适应实时加速器ART加速器™可以让程序在Flash中0等待执行。 最大80 MHz CPU 频率 VDD 从 1.71 V to 3.6 V 1 MB Flash 128 KB SRAM Quad SPI (1)常用定时器 (7) 高级定时器(2) 基本定时器(2) 低功耗定时器(2) Systick Watchdog (2) SPI (3...
&&鄙人主要搞些 &应用无关& &硬件无关& 的中间层代码,像RTOS,FATFS,TCP/IP,CPU常用硬件抽象(GPIO,ADC,DAC,SPI,IIC,UART,CAN,TIME)等
&&全部采用面向对象!
&&估计可能得不到芯币,因为只说了一些概念性的东西.呵呵
可以的,可以的,大神...
&&这种无关指的是软件或功能模块不依赖具体某个项目,而是所有项目都可以用的软件模块,暂且管它叫中间件吧!
&&鄙人主要搞些 &应用无关& &硬件无关& 的中间层代码,像RTOS,FATFS,TCP/IP,CPU常用硬件抽象(GPIO,ADC,DAC,SPI,IIC,UART,CAN,TIME)等...
HS,USB OTG FS§&&以太网10/100Mb、MicroSD卡、USART§&&SAI音频DAC立体声音频插孔输入和输出§&&MEMS数字麦克风§&&SDRAM、四通道SPI闪存§&&4.3英寸带电容屏的彩色LCD-TFT§&&SPDIF输入RCA§&&nbsp...
现在做的项目就是STM32F429的,使用FreeRTOS + Lwip +FatFs + STemWin。
经历:竞赛若干。。。省略
两个项目,之前还有一个中石油测井的,做差不多了。
对于常用通信协议/标准较为了解,平时在测试的时候也感觉需要硬件上的多功能串口监测工具辅助。
确实使用示波器一般的逻辑分析仪也很麻烦。
楼主威武求带,楼下小伙伴给力啦。
这个项目应用十分广...
FatFs,SD卡读写有点慢,7K的bootloader烧写带校验快3分钟的样子
我也很好奇,您的引脚是怎么分配的?
SD卡使用SPI接口进行驱动,使用P1.2~P1.5,12864用串行接口驱动,使用P2.0~P2.4,烧录用的C2口用的P1.0和P1.1
大秦正声 发表于
SPI_FATFS视频
SPI_FATFS创意
本周热门资源推荐spi+flash中文资料spi flash芯片,spi flash,spi flash读写,spi nand flash,spi flash烧录软件,spi flash烧录器
杭州厨师培训
采用SPI Flash存储中文字符库_计算机硬件及网络_IT/计算机_专业资料。采用SPI Flash存储中文字符库采用SPI Flash 存储中文字符库 在嵌入式系统中, 有时候需要中文字符...贡献者:weiwei_meiyou
基于spi-flash的fatfs配置_计算机硬件及网络_IT/计算机_专业资料。由于产品需要存储...(支持中文) 用于切换文件名编码,这里选 0 #define _STRF_ENCODE 3 /* 0:...贡献者:stone8761
Spartan 3E用户指南的中文翻译part4_互联网_IT/计算机_专业资料。Chapter 11:Intel...SPI Flash提供了可选的方案来配置FPGA——这是Spartan-3E FPGA 的一个新的...贡献者:wuhaoqian3
Spartan+3E中文用户指南_电子/电路_工程科技_专业资料。中文Word版,便于打印和修改...对板上的16 Mbit ST Microelectronics SPI serial Flash PROM进行编程,然后采用...贡献者:peipeihan1
用SPI Flash IC做字库的方法_计算机硬件及网络_IT/计算机_专业资料。用 SPI ...4. 可以选择生成的设计格式和点阵大小, 可以提取中文或西文字符。 而且可以直接...贡献者:阿飞antter
16Mbit FLASH SST25VF016驱动程序,中文注释_电子/电路_工程科技_专业资料。16Mbit...= cor_byte) { while(1); /*加入显示错误 */ } } void SPI_ISR() ...贡献者:jefter_2008
HOLD -四倍 SPI:CLK、CS、IO0、IO1、IO2、IO3 ●高性能串行 Flash 存储器...W25Q16中文资料 61页 2下载券
W25Q64中文资料 44页 免费
W25X16中文手册 ...贡献者:爱恋之燕
步骤三:查看板子,我们看到 IC9 其实是空着的,但是背面却有 IC10 这个芯片 步骤四:上官方网站: 进行筛选查找资料。 SPI flash 是 NOR...贡献者:baimashao123
SPI FLASH: ChipSelect pin low */ #define Select_Flash() NSSMD0=0 /* ...at45DB161D 中文资料 15页 免费 AT45DB161D 2页 免费 AT45db081的spi读写程...贡献者:bjcjggl_8888
spi_flash (stm32 spi_flash的编程)_计算机软件及应用_IT/计算机_专业资料。stm...SPI协议示例 28页 5下载券 SD卡SPI读写中文资料 17页 1下载券...贡献者:hfzhf123
延伸阅读精彩推荐
厨师培训手册_企业管理_经管营销_专业资料
暂无评价|0人阅读|0次下载|举报文档厨师培训手册_企业管理_经管营销_专业资料。文档贡献者 我 贡献于2013-12...
厨师培训协议_合同协议_表格/模板_实用文档。厨师培训协议甲方: 地址: 电话: 乙方: 地址: 电话: 因甲方公司业务需要,为提高乙方的专业技术水平,甲乙双方 就甲方...
西餐培训教程_学习总结_总结/汇报_实用文档。西餐历史发展,西餐厅培训心内阁西餐培训第一阶段培训内容:对西餐的认识和西餐在我国的发展,世界流行的几大菜式 的特点...
西餐培训知识_专业资料。西餐制作西餐知识一,西餐历史的起源 就「西餐」起源而言,能够称的上「西餐之母」的,袄算是承自罗马文化的意大利 菜,若说欧洲每一国家的...
精彩看点猜你喜欢
川菜为什么受欢迎_军事/政治_人文社科_专业资料。川菜为什么受欢迎川菜的影响力到底有多大?虽然没有能说得清、 道得明, 但是透过人们的饮食习惯与餐 饮企业营业方...
家常川菜做法大全_经管营销_专业资料。川菜乃是我国的八大菜系之一,它是色、香、味俱全,有了它,就能丰富你的餐桌。家常川菜做法大全豉汁蒸排骨 菜系: 时间: ...
鲁菜_自然科学_专业资料。 起源: 鲁菜是由济南和胶东地方菜所组成,宋以后鲁菜就成为“北食”的代表。明、清两代,鲁菜已成宫廷御膳主体,对京、津东北各地的影响...
2001 年 5 月,台湾三立电视台专程来烟台拍摄传统鲁菜,程伟华也主 持烹制了“烤花揽鲑鱼”和“诗礼银杏”这两道经典孔府传统菜。 “孔府菜的推广要分不同层次,...
经典粤菜大集锦粤菜,即广东地方风味菜,有着悠久的历史,以特有 的菜式和韵味,独树一帜,中国汉族八大菜系之一,发源 于岭南,在国内外享有盛誉。粤菜是一种文化,...
中国的粤菜饮食文化_文化/宗教_人文社科_专业资料。中国的粤菜饮食文化中国的饮食文化源远流长,广州人能吃、爱吃、会吃更是举世闻 名, 以至于有了“食在广州”的...
苏菜擅长炖、焖、蒸、炒,重视调汤,保持原汁,风味清鲜,浓而不腻,淡而不薄, 酥松脱骨而不失其形,滑嫩爽脆而不失其味。 苏菜由杨州菜、南京 菜、苏州菜、...
舌尖上的苏菜文化江苏菜,中国四大名菜之一,简称苏菜。由于苏菜和浙菜相近,因此和浙菜统称江 浙菜系。主要以南京、扬州、苏州、淮安、徐州、海州六种地方菜组成。早...spi_flash (stm32
spi_flash的编程)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
spi_flash (stm32
spi_flash的编程)
上传于||文档简介
&&s​t​m2​ ​ ​s​p​i​ ​的​应​用​代​码
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
下载文档到电脑,查找使用更方便
还剩7页未读,继续阅读
你可能喜欢RT-Thread 学习笔记(8)-开启基于SPI Flash的elmfat文件系统(下) - Flash当前位置:& &&&RT-Thread 学习笔记(8)-开启基于SPI Flash的elmfaRT-Thread 学习笔记(8)-开启基于SPI Flash的elmfat文件系统(下)&&网友分享于:&&浏览:0次RT-Thread 学习笔记(八)---开启基于SPI Flash的elmfat文件系统(下)
软件环境:Win7,Keil MDK 4.72a, IAR EWARM 7.2, GCC 4.2,Python 2.7 ,SCons 2.3.2
硬件环境:Armfly STM32F103ZE-EK v3.0开发板
参考文章:RT-Thread编程指南
[RTthread]新版本RTT中的SPI驱动框架
Github托管的Realtouch分支中examples目录中spi flash的例程
上篇文章中介绍了通过添加SPI Flash驱动,能够成功识别出SPI Flash芯片型号,但还是不能挂载文件系统,无法对文件系统进行相关操作,因此在这篇文章中要研究这问题。
【1】熟悉RT-Thread的内置命令(系统默认是C-Express Style)
RT-Thread 在默认情况下是开启了Shell终端功能的,而且使用的是USART1串口,这一切是我们所需要的而且在当前的这款开发板上不用改动,按默认即可。开发板上已经烧录进了上次编译的程序,这次只需该开发板上电或者复位即可。在串口的Shell终端,我们熟悉下RT-Thread的内置命令,然后我可以按照相同的方法添加我们自定义的命令。
(1)list():显示当前系统中存在的命令及变量
在Finsh提示符下输入list(),结果显示如下:
finsh&&list() & & & & & & &&
--Function List:
led & & & & & & &-- set led[0 - 1] on[1] or off[0].
list_mem & & & & -- list memory usage information
mkfs & & & & & & -- make a file system
df & & & & & & & -- get disk free
ls & & & & & & & -- list directory contents
rm & & & & & & & -- remove files or directories
cat & & & & & & &-- print file
copy & & & & & & -- copy file or dir
mkdir & & & & & &-- create a directory
hello & & & & & &-- say hello world
version & & & & &-- show RT-Thread version information
list_thread & & &-- list thread
list_sem & & & & -- list semaphone in system
list_event & & & -- list event in system
list_mutex & & & -- list mutex in system
list_mailbox & & -- list mail box in system
list_msgqueue & &-- list message queue in system
list_mempool & & -- list memory pool in system
list_timer & & & -- list timer in system
list_device & & &-- list device in system
list & & & & & & -- list all symbol in system
--Variable List:
dummy & & & & & &-- dummy variable for finsh
& & & & 0, 0x
这些命令以list开头的在RT-Thread编程指南的finsh shell部分有说明,这里不再赘述。
下面看下led.c中有关led命令的代码:
#ifdef RT_USING_FINSH
#include &finsh.h&
static rt_uint8_t led_inited = 0;
void led(rt_uint32_t led, rt_uint32_t value)
& & /* init led configuration if it's not inited. */
& & if (!led_inited)
& & & & rt_hw_led_init();
& & & & led_inited = 1;
& & if ( led == 0 )
& & & & /* set led status */
& & & & switch (value)
& & & & case 0:
& & & & & & rt_hw_led_off(0);
& & & & & &
& & & & case 1:
& & & & & & rt_hw_led_on(0);
& & & & & &
& & & & default:
& & & & & &
& & if ( led == 1 )
& & & & /* set led status */
& & & & switch (value)
& & & & case 0:
& & & & & & rt_hw_led_off(1);
& & & & & &
& & & & case 1:
& & & & & & rt_hw_led_on(1);
& & & & & &
& & & & default:
& & & & & &
FINSH_FUNCTION_EXPORT(led, set led[0 - 1] on[1] or off[0].)
上面开关led的代码很简单,尽管实际操作中写入的值和命令描述的刚好相反,那是因为硬件驱动逻辑问题,不是我想研究问题的关键,关键是上面蓝色粗体部分,是一个宏定义,在finsh.h文件的324行给出的定义如下:
#define FINSH_FUNCTION_EXPORT(name, desc) & \
& & FINSH_FUNCTION_EXPORT_CMD(name, name, desc)
一看又是一个宏定义,继续往下看,定位到finsh.h文件的231行,代码如下:
#define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) & & &\
& & & & & & & & const char __fsym_##cmd##_name[] = # & & & & & &\
& & & & & & & & const char __fsym_##cmd##_desc[] = #& & & & & \
& & & & & & & & const struct finsh_syscall __fsym_##cmdSECTION(&FSymTab&)= \
& & & & & & & & { & & & & & & & & & & & & & \
& & & & & & & & & & __fsym_##cmd##_name, & &\
& & & & & & & & & & __fsym_##cmd##_desc, & &\
& & & & & & & & & & (syscall_func)&name & & \
& & & & & & & & };
在finsh.h文件的116行,我们可以看到上面有关finsh_syscall和syscall_func的定义:
typedef long (*syscall_func)();
/* system call table */
struct finsh_syscall
const char*
/* the name of system call */
#if defined(FINSH_USING_DESCRIPTION) && defined(FINSH_USING_SYMTAB)
const char*
/* description of system call */
syscall_func/* the function address of system call */
syscall_func是一个函数指针,返回值是long型,是finsh_syscall类中的一个成员,这样一来有关finsh的命令实现就很清楚了,当FINSH_FUNCTION_EXPOR宏被调用时,led函数的入口地址被传给finsh_syscall类的实例化对象__fsym_##cmd,并且被传进来的参数初始化。
具体点讲,led()被传递给了finsh_syscall类对象的一个成员syscall类型的func,并以&(syscall_func)&name的身份来初始化,显然name要被强制转换成syscall_func类型,也就是说led传递给func,返回值类型为long型。finsh_syscall类对象__fsym_##cmd通过SECTION宏指定在一个特定代码段FSymTab,当线程执行着个代码时,这个命令的功能函数也就被调用了。至于cmd,desc参数通过##连词符重新装配和替换则显得相对简单。
【2】用FINSH_FUNCTION_EXPOR宏导入的命令(Finsh终端的命令操作函数)在finsh_thread线程中调用的实现
参考文章:RT-Thread下finsh原理浅析(出处:
amoBBS 阿莫电子论坛)
我们全局搜索下finsh_thread,可以定位到shell.c文件的291行void finsh_thread_entry(void* parameter),这个线程shell的命令接口线程,对终端命令的响应就是从这里发出的,如下
#ifdef RT_USING_CONSOLE
& & & & shell-&device = rt_console_get_device();
& & & & RT_ASSERT(shell-&device);
& & & & rt_device_open(shell-&device, RT_DEVICE_OFLAG_RDWR);
& & & & rt_device_set_rx_indicate(shell-&device,finsh_rx_ind);
& & & & RT_ASSERT(shell-&device);
& & while (1)
/* wait receive */
& & & & if (rt_sem_take(&shell-&rx_sem, RT_WAITING_FOREVER) != RT_EOK)
& & & & /* read one character from device */
& & & & while (rt_device_read(shell-&device, 0, &ch, 1) == 1)
如果串口上没有收到任何数据,并且串口缓冲区中也无数据,即shell-&rx_sem信号量的值为0,那么rt_sem_take这个信号量函数会使finsh_thread线程休眠,RTT内核会执行其他线程。当串口收到数据,系统调度程序会调用finsh_thread线程在rt_device_set_rx_indicate函数中设置的回调函数finsh_rx_ind,该函数调用rt_sem_release(&shell-&rx_sem)来释放信号量,这会唤醒finsh_thread线程,该线程主动调用rt_device_read进行接收数据。在用户命令输入并回车确认后,会执行下面代码中finsh_run_line()函数进行语法解析。
#ifndef FINSH_USING_MSH_ONLY & & & & & & & &
& & & & & & & & & & /* add ';' and run the command line */
& & & & & & & & & & shell-&line[shell-&line_position] = ';';
& & & & & & & & & & if (shell-&line_position != 0) finsh_run_line(&shell-&parser, shell-&line);
& & & & & & & & & & else rt_kprintf(&\n&);
& & & & & & & & #endif &&
然后finsh_run_line()调用&finsh_parser_run(),代码如下:
#ifndef FINSH_USING_MSH_ONLY
void finsh_run_line(struct finsh_parser* parser, const char *line)
& & const char* err_
& & rt_kprintf(&\n&);
& & finsh_parser_run(parser, (unsigned char*)line);
上面代码是对输入的命令进行语法解析,先对传入的字符串进行初步语法判断:
expr_postfix -& expr_primary
| expr_postfix INC
| expr_postfix DEC
| expr_postfix '(' param_list ')'
static struct finsh_node* proc_postfix_expr(struct finsh_parser* self)
enum finsh_token_
struct finsh_node*
postfix =proc_primary_expr(self);
如上面代码所示,然后proc_primary_expr(self)调用finsh_node_new_id(id),finsh_node_new_id()代码如下:
/* then lookup system variable */
symbol = (void*)finsh_sysvar_lookup(id);
if (symbol == NULL)
/* then lookup system call */
symbol = (void*)finsh_syscall_lookup(id);
if (symbol != NULL) type = FINSH_IDTYPE_SYSCALL;
finsh_syscall_lookup()用来查找系统调用,代码如下:
struct finsh_syscall* finsh_syscall_lookup(const char* name)
struct finsh_syscall*
struct finsh_syscall_item*
for (index =_syscall_table_begin; index &_syscall_table_end;
FINSH_NEXT_SYSCALL(index))
if (strcmp(index-&name, name) == 0)
我们再看下_syscall_table_begin&和_syscall_table_end
的定义,代码如下:
#ifdef FINSH_USING_SYMTAB
struct finsh_syscall *_syscall_table_begin
struct finsh_syscall *_syscall_table_end
struct finsh_sysvar *_sysvar_table_begin
struct finsh_sysvar *_sysvar_table_end
struct finsh_syscall _syscall_table[] =
{&hello&, hello},
{&version&, version},
{&list&, list},
{&list_thread&, list_thread},
#ifdef RT_USING_SEMAPHORE
{&list_sem&, list_sem},
#ifdef RT_USING_MUTEX
{&list_mutex&, list_mutex},
#ifdef RT_USING_FEVENT
{&list_fevent&, list_fevent},
#ifdef RT_USING_EVENT
{&list_event&, list_event},
#ifdef RT_USING_MAILBOX
{&list_mb&, list_mailbox},
#ifdef RT_USING_MESSAGEQUEUE
{&list_mq&, list_msgqueue},
#ifdef RT_USING_MEMPOOL
{&list_memp&, list_mempool},
{&list_timer&, list_timer},
struct finsh_syscall *_syscall_table_begin = &_syscall_table[0];
struct finsh_syscall *_syscall_table_end
= &_syscall_table[sizeof(_syscall_table) / sizeof(struct finsh_syscall)];
_syscall_table_begin&和_syscall_table_end
的类型为finsh_syscall,这个类型前面有介绍过,就是FINSH_FUNCTION_EXPOR宏中用到的那个类型。也就是用户定义的功能函数,如系统自带的led()函数调用FINSH_FUNCTION_EXPOR宏导入。在这里当finsh_thread线程被唤醒后又通过前面对setction(x)汇编指令指定的代码段去查询,如果用户定义的功能函数定义其中自然是能够解析通过,比如finsh_node_new_id(id)中的id就是功能函数led。如果再解析输入的命令语法再没有问题,下面运行编译函数讲语法树上的节点全部编译,之后再虚拟机finsh_vm_run()调用该命令。
& & /* compile node root */
& & if (finsh_errno() == 0)
& & & & finsh_compiler_run(parser-&root);
& & & & err_str = finsh_error_string(finsh_errno());
& & & & rt_kprintf(&%s\n&, err_str);
& & /* run virtual machine */
& & if (finsh_errno() == 0)
& & & & finsh_vm_run();
有了上面的对led命令的认识,下面我们可以看下我们关心的对spi flash文件系统操作的命令mkfs等相关命令了。
【3】文件系统操作命令
(1) mkdfs 命令,在系统里全局搜索下,就可以在dfs_fs.c文件的492行找到可led命令一样的宏:
#ifdef RT_USING_FINSH
#include &finsh.h&
void mkfs(const char *fs_name, const char *device_name)
& & dfs_mkfs(fs_name, device_name);
FINSH_FUNCTION_EXPORT(mkfs, make a file system);
同样地,mkdir,copy,rm等命令都是相同的方法导入finsh_thread线程中的。在终端中输入list_device()命令,显示如下:
finsh /&list_device()
device & &type & & &
-------- ----------&
flash0 & Block Device&
spi12 & &SPI Device&
spi11 & &SPI Device&
spi1 & & SPI Bus &
uart3 & &Character Device&
uart2 & &Character Device&
uart1 & &Character Device&
& & & & 0, 0x
finsh /&mkfs(&elm&,&flash0&) &&
& & & & 0, 0x
显然格式化成功,但为什么挂载不成功能呢?当调试追踪到ff.c文件的1986行时,return 2的条件成立,导致系统无法挂载,于是参考网友关于SPI flash的elm文件系统的帖子后突然想到可能是芯片不支持的问题,于是将开发板上的SST25VF016B跟换成25Q64FV,然后将底层驱动代码改为:
/* JEDEC Manufacturer¡¯s ID */
#define MF_ID
/*else if(memory_type_capacity == MTC_SST25VF016B)
FLASH_TRACE(&SST25VF016B detection\r\n&);
spi_flash_device.geometry.sector_count = 512;
FLASH_TRACE(&Memory Capacity error!\r\n&);
return -RT_ENOSYS;
然后重新编译下载,第一启动时仍然挂载失败,在终端执行mkfs(&elm&,&flash0&) 显示格式化成功,复位后显示挂载成功,显示如下:
- RT - & & Thread Operating System
&/ | \ & & 1.2.2 build Mar 31 2015
&2006 - 2013 Copyright by rt-thread team
W25Q64BV or W25Q64CV detection
finsh /&flash0 mount to /.
再次跟踪到ff.c文件的1986行时,return 2的条件时,不成立了。
查看下flash空间
disk free: 8168 KB [ 2042 block, 4096 bytes per block ]
& & & & 0, 0x
【4】文件系统测试
在rt-thread-1.2.2/examples/test目录下可以找到文件fs_test.c,复制到当前分支的drivers目录下,然后加入到MDK 工程的Drivers组中,修改drivers目录下的Sconscript脚本,结果如下:
# add DFS drvers.
if GetDepend('RT_USING_DFS'):
src += ['rt_spi_device.c','rt_stm32f10x_spi.c','spi_flash_w25qxx.c','fs_test.c']
修改后保存。
打开fs_test.c文件,分别将文件中的64行,66行,79行,96行,122行的8000替换成10,读写次数太多,耗费时间。然后在线程while(1)末尾close(fd)下面添加如下代码:
/* close file */
close(fd);
if(round &10)
}分别将文件中的173行,175行,188行,205行,231行的5000替换成10,也同样在while(1)末尾close(fd)下面添加上面代码。目的是让这两个线程运行10round后退出。然后保存编译下载,重新复位后在终端中用list()命令查看下:
finsh /&list()
--Function List:
led -- set led[0 - 1] on[1] or off[0].
fs_test -- file system R/W test. e.g: fs_test(3)
list_mem -- list memory usage information
mkfs -- make a file system
df -- get disk free
ls -- list directory contents
可以看到fs_test命令出现在列表中,现在可以调用这个命令来测试下:
finsh /&fs_test(3)
arg is : 0x03 & 0, 0x
finsh /&thread fsrw1 round 1 rd:40000byte/s,wr:5217byte/s
thread fsrw2 round 1 rd:60000byte/s,wr:180000byte/s
thread fsrw1 round 2 rd:40000byte/s,wr:3428byte/s
thread fsrw2 round 2 rd:60000byte/s,wr:5806byte/s
thread fsrw1 round 3 rd:5454byte/s,wr:3333byte/s
thread fsrw2 round 3 rd:7200byte/s,wr:6000byte/s
thread fsrw1 round 4 rd:4615byte/s,wr:60000byte/s
thread fsrw2 round 4 rd:45000byte/s,wr:45000byte/s
thread fsrw1 round 5 rd:5000byte/s,wr:30000byte/s
thread fsrw2 round 5 rd:6923byte/s,wr:45000byte/s
thread fsrw1 round 6 rd:40000byte/s,wr:40000byte/s
thread fsrw2 round 6 rd:7200byte/s,wr:60000byte/s
thread fsrw1 round 7 rd:40000byte/s,wr:40000byte/s
thread fsrw2 round 7 rd:7200byte/s,wr:60000byte/s
thread fsrw1 round 8 rd:40000byte/s,wr:40000byte/s
thread fsrw2 round 8 rd:7200byte/s,wr:60000byte/s
thread fsrw1 round 9 rd:4800byte/s,wr:30000byte/s
thread fsrw2 round 9 rd:7500byte/s,wr:45000byte/s
thread fsrw1 round 10 rd:4800byte/s,wr:30000byte/s
thread fsrw2 round 10 rd:90000byte/s,wr:60000byte/s
可以看到文件读写成功。看下根目录下这两个测试文件:
finsh /&ls(&/&)
Directory /:
TEST1.DAT 1200
TEST2.DAT 1800
到此,我们已经在开发板上成功开启了基于SPI Flash的ELM FATFS文件系统。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 1234567891011 Copyright & &&版权所有}

我要回帖

更多关于 8扇区 4096字节 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信