你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

分享!!!移植Tiny-FATFS文件系统到STM8L152C6T6,使用硬件SPI+RT...  

[复制链接]
1201yuge 发布时间:2016-3-22 09:51
      最近老师需要做一个低功耗的各种环境参数采集仪,要求不多,就是采集各种参数并储存起来,但是要求低功耗。所以我第一时间就想到了STM8L系列单片机,发出去做的板子还没回来,就先使用现有的一块板子先调试文件系统和RTC这些啦。今晚还有点时间就写个移植过程吧,给后来人种一颗小树苗吧。。。
0 t, s( Y# E; |/ v; l0 X6 E& n; D6 @0 i! R9 x2 h) t
硬件介绍:
1 G( x% C) h8 q; }+ _* ~    单片机:STM8l152c6t6, 2K RAM,32K FLASH3 W9 _9 T  j  v: V$ d: Z  P: d& W3 L: J
    SD卡:4G和8G  + C% a9 T6 a% {; a' [7 |7 W
    接口连接://SD_DT3--SD_CS----------------PB48 ^# ~2 b2 i, P
                   //SD_CMD--SPI1_MOSI--------PB6
( }+ z/ U. R, m2 _9 e                   //SD_SCK--SPI1_SCK-----------PB5
5 M9 U* q% Z$ m0 W                   //SD_DT0--SPI1_MISO--------PB7$ |9 L9 V6 i" E$ b+ f7 p# B4 S

+ y2 {5 v- A# n/ ~' e软件介绍:
6 q0 V) G; j! ~6 m( v% r) N& F; c+ m5 v    编译器:IAR for STM8
4 ~; |# N3 X1 o+ ?( T    FATFs版本:R0.11a ,直接到FAT官网上面下载即可,下面附件也有。3 o* y; h1 x" \8 h
    通信协议:硬件SPI   (附件也有一份软件SPI的源码)% @; B/ g; ^5 o& a
    RTC:使用STM8L内置的RTC0 {: P! U4 ^( a+ ?

) c; n$ `$ C- k+ n# h1 G移植意义:可能大家觉得在STM8这种这么low的单片机上面运行FAT文件系统没什么意义,但是我觉得STM8l在用在低功耗采集或者信息节点的场合很多时候都需要存储数据,那么说到存储数据最适合的存储介质我觉得就是SD卡了,低成本大内存。那么自然想到FAT,存储的文件可以直接在电脑打开,每天新建一个文件来存储等。所以我觉得这东西上面使用FAT还是很有意义的。Tiny-FATFS需要单片机的1K的RAM用做工作区,具体需要多大的FLASH看你的要求了,可以适当的裁剪FATFS,我编译出来是20多K。0 X: t2 G- _5 w( [. J
$ U# I4 ^* _% ~' n8 b- O9 Z6 c! V& C
移植步骤:
" n  h( B: i) f% f& t3 ?& p   1.下载FATFS源码包,解压之后把src文件夹直接复制到工程目录中,并把带的字库和说明删掉,如下图;2 X. c6 n4 {! m5 Z; ?" s9 S2 q7 K
   * h1 S+ V# w" d/ b( x# v
   2.打开STM8工程,把FATFS中的xx.c文件(diskio.c和ff.c)添加至工程目中,并在option中包含路径
2 s& v- `, M0 M# h: K  
' Q! e5 p9 H; A- O6 ?/ ~   3.配置ffconf.h(简要说下,具体可参考原子哥的手册);
/ N9 M: _$ v% w" I$ x* b) R0 {& _   #define _FS_READONLY        0    //可读可写
# C; G7 g# C' P& A7 B9 E( T5 x   ##define _FS_MINIMIZE        3    //_FS_MINIMIZE、 _FS_READONLY、 _USE_STRFUNC、 _USE_MKFS、_USE_FORWARD 这些宏是用来对文件系统进行裁剪的,具体见下表8 G  }  e* Y; I8 l+ f$ M
   #define _CODE_PAGE        1    //就支持ASCII码,小内存伤不起
! B; _. Q' ^. {1 |) Z    。。。。。。。. @% h; M* G8 |" P, S5 U# l1 b+ D
   #define _VOLUMES        1        //注意:Tiny-FATFS仅支持一个逻辑设备,设为1
% o3 M6 ^4 M% o, Q   #define        _FS_TINY        1        //就是这个地方,设为1之后就是Tiny-FATFS了,编译之后你会发现比设为0的时候用的RAM少不少,只需1K,当然牺牲就是变慢了
$ k! W$ ^; _. a# Q! I& U& p   
  S; y; f! r  S( J4 r8 P: ^4.编写diskio.c里面的5个接口函数。
4 ~- z4 A1 d' [; E$ Q3 |   前面5个接口函数我是参照原子哥的代码改的,我把除了SD_CARD的其他选项全删了,只留下SD_CARD的部分,因为其他的设备都用不上。(具体代码见附件)( O* g7 c0 |  [! U5 V2 ?
  get_fattime函数:
( g- O! M' o7 L) u" nDWORD get_fattime (void)! @" W* G; `  c
{                                 * {; r( P% C- W
        return (((u32)(RTC_DateStr.RTC_Year-(RTC_DateStr.RTC_Year>>4)*6)+20) << 25) /* Year *// ?2 g# A8 g: `: q2 S
              | ((u32)(RTC_DateStr.RTC_Month-(RTC_DateStr.RTC_Month>>4)*6) << 21)      /* Month*/4 C" k4 }$ _. e+ Y( l% ]
              | ((u32)(RTC_DateStr.RTC_Date-(RTC_DateStr.RTC_Date>>4)*6) << 16)       /* Day*/3 f0 b/ o1 c" ]; [" I8 Z9 L
              | ((u32)(RTC_TimeStr.RTC_Hours-(RTC_TimeStr.RTC_Hours>>4)*6) << 11)      /* Hour*/
$ R: H% D7 V, r              | ((u32)(RTC_TimeStr.RTC_Minutes-(RTC_TimeStr.RTC_Minutes>>4)*6) << 5)     /* Min*/: x. O3 \+ t( p# j& s
              | ((u32)(RTC_TimeStr.RTC_Seconds-(RTC_TimeStr.RTC_Seconds>>4)*6) >> 1)     /* Sec*/8 X( L( ^; f5 L. y8 P3 B1 z
;
! Z) J7 W; {' l" s8 k}" A3 M9 F; }: f) u7 ?. x# I; |4 {
6 q* t; n( a5 @( }. J7 z
  这里使用的是内部的RTC,每1S时间产生一个唤醒中断,然后在中断函数中更新日期时间,注意这里的日期时间都是BCD吗,例如0x16表示的是16年,所以上面做了转换。
/ l# P: q: W* P' a' Z. j) s8 K$ H% `7 @. T: k( i& m# l% `& ~) K
5.RTC初始化配置见附件源码了。下面是初始化过程中一个需要注意的地方! A$ k0 b% `% }
  if ((RTC->ISR1 & RTC_ISR1_INITS) == RESET)  //Check calendar has been initialized or not?" T; x( O7 m. p5 ~
  {
9 k3 v4 M1 F$ V9 }+ ^    RTC_DateStructInit(&RTC_DateStr);; T3 W! O/ E; I9 v/ j
    RTC_DateStr.RTC_WeekDay = RTC_Weekday_Friday;0 L8 x6 s' M; A9 j3 N' M
    RTC_DateStr.RTC_Date = 6;
0 z  Z! U4 `! R; W; k9 |    RTC_DateStr.RTC_Month = RTC_Month_March;+ u  m7 ], T. G! R
    RTC_DateStr.RTC_Year = 16;7 y: g: @! H( r  {- F
    RTC_SetDate(RTC_Format_BIN, &RTC_DateStr);
0 [8 ^5 k! _9 p- C* _+ h0 ^5 r9 B2 l# J9 u( u% s
    RTC_TimeStructInit(&RTC_TimeStr);* P5 R9 v0 y* d* _3 w
    RTC_TimeStr.RTC_Hours   = 20;
4 G5 b/ Y+ ?' M0 Z( G7 ]    RTC_TimeStr.RTC_Minutes = 02;
1 A* O4 z5 r$ |2 J# b8 Q# k9 A& w    RTC_TimeStr.RTC_Seconds = 00;2 g$ i9 C# _0 i6 i6 s! ~- y
    RTC_SetTime(RTC_Format_BIN, &RTC_TimeStr);   
. y1 q- R" ^$ `' V  }* C4 a  k* ?6 a6 _/ G5 S

8 }* M8 [1 c# H$ E' f5 Z. R* c就是设置日期时间之前检查是RTC是否已经被设置过了,设置过了就不需要设置了。类似于STM32的备份寄存器,这样子只要不断电RTC的时间就不会复位。顺便提一句,STM8l的RTC还是很稳定、很准的,当时测了两三天跟电脑的时间差不了2秒,美中不足的是没有留出电池供电引脚,单片机断电就完了。& ^  s+ D; n0 h5 Y: Z2 m- ^
6.硬件SPI配置,这步非常简单,看图; n) g) I* `2 y0 z  {, r
& A8 a- N% l+ N/ A2 K4 F# U
; X" O, k3 X7 p% I' |
简简单单几句就把它给配置了,做好这个借口,直接就跟原子哥的MMC_SD.c和MMC_SD.H对接上了,修改很少。
! Z, i9 x( n' }6 c. f' i3 y3 {; w" r3 {. q$ O
7.最后主函数:不适用内存分配函数,直接全局变量作为静态工作区。
/ V6 c5 f8 s, b+ X. k) ]6 q( I/ T  
+ X) I+ d0 u9 Y4 }8 k% W测试代码:挂载并新建文件* r0 j: Y: E' |' E, }# Q
  3 J! o8 l# d; n; P; J7 u

1 F! F! a  m  i( Z- D+ C; a) ^$ v编译运行结果(RAM包含了自己测试用的一个长度为514字节的buff数组):' _7 `) W6 i) C' y- T3 g
2 A' g& W8 U! [& ^

& Y# D6 s% U" k& J6 |- e8 ]. w) r! l
( R, o& U# U+ _  I8 D在工程Backup文件夹里面还有一段测试读文件的代码:' K# R9 C! j8 o. m
   res = f_open(&fl,"news/news.txt",FA_READ);   : w9 }% J6 s3 T* R; I5 B
   if(res == FR_OK)5 U7 l* g( p. r" l! N
   {
3 N# x4 v. m$ \: K- o7 c* }     Usart1_Str("Open file ok!\r\n");
- K0 }# \2 O* J& k     Usart1_Str("The news is:\r\n");
2 }8 z2 \) S. l4 `# L4 g     do. _% y; [" D4 ?" \  K4 B4 w
     {
- K; U8 G7 v" E& G% Q; R       //for(i=0;i<50;i++) buff = 0;# R5 Z6 T6 F; r; x
       res = f_read(&fl,buff,512,&r);
/ t" p( J. P1 l# ]  i6 T       //Usart1_Str(buff);! @8 a! _  U6 o2 t* a8 Q7 y
       if(res || r<512)8 I$ x  m/ }7 F% c' @- [, L
       {! D- R6 z/ K! R; I5 a
          Usart1_Str("Read over!\r\n");
# g7 `* H5 K4 A# t0 \+ W: r- M         break;   //error or eof   
+ x; K; Y( C* v$ a- ]2 G       }
0 ~! J" B4 P$ T( V  z& ?2 w" X3 o     }. K' Q; w0 T8 _6 O. M. o2 ~; [
     while(1);. p7 `( r) e% K; @
   }- T" n$ @0 ~: K5 R1 y, N9 ^+ d, h
   else
# a" y' |7 X# F3 D8 q     Usart1_Str("Open file failed!\r\n");1 X2 Z2 a; i' {! o8 p2 Z% S
   f_close(&fl);
; J# U- M+ N; S: S+ t9 H2 T' C* D2 ^0 H9 d3 s8 U
$ T! o& j& Q  p$ \/ ?8 L
事先在SD卡里新建一个news/news.txt文件,大小为1026KB,最后测试读出时间是14秒,平均速度是60多Kbyte/s的读出速度,对于一般应用相当够用;
: w  r+ M3 ?* _6 u' o9 G跟另一个用模拟SPI写的工程比较,读取同样的这个文件,耗时一分49秒,平均速度只有10Kbyte/s左右。写入速度没测试,应该会慢一些。。。
! r4 u, ?. L% k4 ]6 Q  F& r# n7 \2 B: O
建议:使用FATFS时选用内存稍大的点STM单片机,本实验使用的是Medium容量的,上面还有Medium density plus,跟High density的,内存和存储空间都大很多,建议选用后面两种。* U6 h! w5 l% P, f, c9 k+ Z8 W
STM8L的低功耗貌似很感人,等板子来了在测试了。。。
: d. q/ s2 V$ U) f3 D1 h2 _0 V' {7 j. k2 w% H! `$ b- J
* ^: l, u" x7 L* j1 c% l

% W; v/ c; ]  q0 f; ^" h5 @9 ?
! a% R2 P& P6 H/ a

Tiny_Fats(模拟SPI).zip

下载

3.66 MB, 下载次数: 204

速度慢,好移植

Tiny_Fats(硬件SPI).zip

下载

3.59 MB, 下载次数: 7657

速度快

评分

参与人数 1 ST金币 +20 收起 理由
沐紫 + 20 赞一个!

查看全部评分

收藏 14 评论22 发布时间:2016-3-22 09:51

举报

22个回答
tongyongbq 回答时间:2017-2-2 14:23:54
搞定了,是卡的问题,,,原先用的是一张32M的SD卡,估计是很古老的了,,,老是不成功,后来换了一张2G的卡,初始化成功了。。。感谢楼主分享。。。0 V8 g/ _  ]5 `! f: E/ }8 ~, k
" a9 a  d) a2 o* ?$ F
另外有个问题,希望楼主或者其他大侠看到了能够顺便指点一下,提前谢谢:
' o) h; Q4 w- |用32M的SD卡初始化到“r1=SD_SendCmd(CMD0,0,0x95);”这条语句的时候,返回值是0X07,而2G的卡返回值是0x01,请问这是为什么呢?
tongyongbq 回答时间:2017-2-2 13:33:07
楼主您好,我直接用STM8L152C6T6的板子,按照您的方法做,怎么就是卡在PE7的LED闪烁阶段呢,就是SD卡初始化过不了。麻烦指点一下,用的是您提供的代码(硬件SPI),没做修改,,,请问是哪里出了问题呢?PB4567引脚均有上拉。还望赐教。谢谢!
沐紫 回答时间:2016-3-22 10:11:50
谢谢楼主。+ v2 L/ i1 @" I( w6 a# p2 P
1 C' y$ d; W. K8 Q% S# m3 a: S9 p9 X
这款最新的L073也不错
! @; S( g3 }, h% C" A) I( w7 W6 I7 O6 h9 V3 b
拼实力、看创意,超低功耗STM32L0方案秀
7 y9 _8 U# B6 F2 \https://www.stmcu.org.cn/module/ ... &fromuid=366506
' m3 s3 m. [8 ]" F# X5 ?(出处: 意法半导体STM32/STM8技术社区)
* E7 i2 S1 |+ C' G! y8 W; Y5 U
黑夜之狼 回答时间:2016-3-22 12:54:42
这颗料我玩过,性价比很高,看来有空也要玩玩SD卡
power568 回答时间:2016-3-22 13:21:44
楼主无私,不过L系列的都没玩过...
huaiqiao 回答时间:2016-3-22 20:43:49
好像么有贴出图片来?
zcl201207 回答时间:2016-3-22 22:25:36
1201yuge 回答时间:2016-4-1 20:15:19
huaiqiao 发表于 2016-3-22 20:43' F# h; P2 I3 ?6 C% s* n0 D( S
好像么有贴出图片来?
% `. J, a- W& r: a- j6 X
贴了,只是显示不出来,不知道为什么呢。而且老感觉这个网站卡卡的感觉
huaiqiao 回答时间:2016-4-2 23:43:54
1201yuge 发表于 2016-4-1 20:15' a; x3 t2 S/ B: L
贴了,只是显示不出来,不知道为什么呢。而且老感觉这个网站卡卡的感觉 ...
7 `$ \$ \6 u0 z: N0 L
可以重新编辑一下,这样好看一些。也方便学习下你的东西哈。
WO-389024 回答时间:2016-7-23 10:25:38
顶啊,找这个很久了,一直想学。感谢
alin_800 回答时间:2016-9-29 16:25:31
,学习了!!
zbber 回答时间:2016-9-29 21:43:10
这颗料我玩过,性价比很高,看来有空也要玩玩SD卡
nongxiaoming 回答时间:2016-9-29 21:51:59
这个不错~~~~
JayVIN 回答时间:2016-9-30 00:04:43
这么牛逼,正好再用STM8L152R8T6,有机会可以试试看
zhuoyemp4 回答时间:2016-9-30 08:29:31
感谢分享,谢谢楼主
zcl201207 回答时间:2016-10-2 17:57:46
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版