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

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

[复制链接]
1201yuge 发布时间:2016-3-22 09:51
      最近老师需要做一个低功耗的各种环境参数采集仪,要求不多,就是采集各种参数并储存起来,但是要求低功耗。所以我第一时间就想到了STM8L系列单片机,发出去做的板子还没回来,就先使用现有的一块板子先调试文件系统和RTC这些啦。今晚还有点时间就写个移植过程吧,给后来人种一颗小树苗吧。。。4 j. \- I) K/ C4 y9 m' ?
* M1 o" V. n: R; r
硬件介绍:( h9 L' u$ W, E8 q, ^6 L
    单片机:STM8l152c6t6, 2K RAM,32K FLASH
) a+ o  t$ }9 Y1 ^5 |0 B: Y) S    SD卡:4G和8G  " B! S& y6 w8 @) D9 F$ g! j
    接口连接://SD_DT3--SD_CS----------------PB4
2 }7 ]. Q$ y4 w+ k( f                   //SD_CMD--SPI1_MOSI--------PB61 q! ], j2 O! b/ s
                   //SD_SCK--SPI1_SCK-----------PB5
3 H9 g6 j  ]; M/ _                   //SD_DT0--SPI1_MISO--------PB76 o1 [0 c- q# F  W& y! K3 Q
; L. f& S. g/ F- V/ V8 G) q, o
软件介绍:1 P. w$ ~4 R- X: H# f. [% T
    编译器:IAR for STM8' ?0 f8 y* U6 Y  \% h2 ~
    FATFs版本:R0.11a ,直接到FAT官网上面下载即可,下面附件也有。
/ q, Z$ x/ b  }    通信协议:硬件SPI   (附件也有一份软件SPI的源码)' l, `; |* l2 h; ~  Q+ w$ a
    RTC:使用STM8L内置的RTC
4 y: p% _% ^9 e2 m
4 I' B: z6 ]" Z8 A* q1 l. `移植意义:可能大家觉得在STM8这种这么low的单片机上面运行FAT文件系统没什么意义,但是我觉得STM8l在用在低功耗采集或者信息节点的场合很多时候都需要存储数据,那么说到存储数据最适合的存储介质我觉得就是SD卡了,低成本大内存。那么自然想到FAT,存储的文件可以直接在电脑打开,每天新建一个文件来存储等。所以我觉得这东西上面使用FAT还是很有意义的。Tiny-FATFS需要单片机的1K的RAM用做工作区,具体需要多大的FLASH看你的要求了,可以适当的裁剪FATFS,我编译出来是20多K。' v+ P- e; e- B% P( |6 B& j

# k7 |$ X1 S/ C& `& c移植步骤:
0 c8 r! U7 z% U& e/ Y   1.下载FATFS源码包,解压之后把src文件夹直接复制到工程目录中,并把带的字库和说明删掉,如下图;9 r( r6 Q! Y0 p# c* Y  A" P3 o
   
( o  W: S, K! \   2.打开STM8工程,把FATFS中的xx.c文件(diskio.c和ff.c)添加至工程目中,并在option中包含路径7 _. Q# g  Y5 Z0 e, u" [5 J: j, X
  
6 y" H( W' T* M9 K   3.配置ffconf.h(简要说下,具体可参考原子哥的手册);
- [0 t% F2 P) W0 |0 ]8 S   #define _FS_READONLY        0    //可读可写
2 k, V: U( w# o1 D9 J1 A   ##define _FS_MINIMIZE        3    //_FS_MINIMIZE、 _FS_READONLY、 _USE_STRFUNC、 _USE_MKFS、_USE_FORWARD 这些宏是用来对文件系统进行裁剪的,具体见下表2 J: ?; X# g5 x8 `( @. k
   #define _CODE_PAGE        1    //就支持ASCII码,小内存伤不起
: v4 _/ M& `7 s2 [, S    。。。。。。。! ?0 h! f  s# O2 R5 P% ]/ s! k
   #define _VOLUMES        1        //注意:Tiny-FATFS仅支持一个逻辑设备,设为14 n) [; i1 J$ K1 N) d  L( G
   #define        _FS_TINY        1        //就是这个地方,设为1之后就是Tiny-FATFS了,编译之后你会发现比设为0的时候用的RAM少不少,只需1K,当然牺牲就是变慢了, L: O6 v, I- B% ?- L& y* l; o7 H  c
     e) f* j5 \- G$ e
4.编写diskio.c里面的5个接口函数。. I) |! {6 C2 e
   前面5个接口函数我是参照原子哥的代码改的,我把除了SD_CARD的其他选项全删了,只留下SD_CARD的部分,因为其他的设备都用不上。(具体代码见附件)
9 x/ W6 |' E0 a. h9 ]  get_fattime函数:# `" z9 X* `, c" v- h* K6 @
DWORD get_fattime (void)
9 s7 W' z# o/ ]0 w: u{                                 7 Y, O8 K  R) K. R/ b; R) q) P
        return (((u32)(RTC_DateStr.RTC_Year-(RTC_DateStr.RTC_Year>>4)*6)+20) << 25) /* Year */% q* B2 @, J% o
              | ((u32)(RTC_DateStr.RTC_Month-(RTC_DateStr.RTC_Month>>4)*6) << 21)      /* Month*/! ^' y2 C" C# A9 d# ?
              | ((u32)(RTC_DateStr.RTC_Date-(RTC_DateStr.RTC_Date>>4)*6) << 16)       /* Day*/4 D1 t/ }/ O8 x4 p# s; E9 P
              | ((u32)(RTC_TimeStr.RTC_Hours-(RTC_TimeStr.RTC_Hours>>4)*6) << 11)      /* Hour*/
0 c7 t! i: `  R, b; D: k1 L              | ((u32)(RTC_TimeStr.RTC_Minutes-(RTC_TimeStr.RTC_Minutes>>4)*6) << 5)     /* Min*/5 E; F: b& W4 b+ u
              | ((u32)(RTC_TimeStr.RTC_Seconds-(RTC_TimeStr.RTC_Seconds>>4)*6) >> 1)     /* Sec*/$ f. [+ ^. w2 o  d2 C; k
;, g) M- y, [% }& ~
}
) i& D" Q  r/ s, z
* D9 o5 M2 V% d2 C; b  这里使用的是内部的RTC,每1S时间产生一个唤醒中断,然后在中断函数中更新日期时间,注意这里的日期时间都是BCD吗,例如0x16表示的是16年,所以上面做了转换。
8 s. l0 ]2 I- y9 u2 n5 P# G) I+ S3 v9 N
& h) j/ I5 m5 b. _& _# t/ A5.RTC初始化配置见附件源码了。下面是初始化过程中一个需要注意的地方- a: v1 |4 N( W: N
  if ((RTC->ISR1 & RTC_ISR1_INITS) == RESET)  //Check calendar has been initialized or not?
5 U, H) U( x. |- y  {
9 J. t' V: @6 V& G, ~' Q    RTC_DateStructInit(&RTC_DateStr);
9 w7 c$ S- k" @3 u    RTC_DateStr.RTC_WeekDay = RTC_Weekday_Friday;
7 u4 n9 r- O9 D+ r    RTC_DateStr.RTC_Date = 6;7 `+ `9 x/ ~0 V4 n) v$ S7 U
    RTC_DateStr.RTC_Month = RTC_Month_March;  j% I( X) [% [
    RTC_DateStr.RTC_Year = 16;
& U# {( f4 Z) h  n+ z3 W    RTC_SetDate(RTC_Format_BIN, &RTC_DateStr);
9 }- B* F, H& y* Z+ x: X9 U* h5 o; j/ z
" z9 Y7 V  p& q' u    RTC_TimeStructInit(&RTC_TimeStr);1 c* L$ }4 ^' z$ O# l8 s. H
    RTC_TimeStr.RTC_Hours   = 20;6 f- T+ x+ [+ U$ p
    RTC_TimeStr.RTC_Minutes = 02;
+ |1 T* h0 C; G9 `1 I    RTC_TimeStr.RTC_Seconds = 00;6 }& `  G& Z2 w) H
    RTC_SetTime(RTC_Format_BIN, &RTC_TimeStr);    " O2 k3 n9 P' A; P7 l) S/ {
  }' ?# f/ c" y) X* s

) @' V) H8 X8 _就是设置日期时间之前检查是RTC是否已经被设置过了,设置过了就不需要设置了。类似于STM32的备份寄存器,这样子只要不断电RTC的时间就不会复位。顺便提一句,STM8l的RTC还是很稳定、很准的,当时测了两三天跟电脑的时间差不了2秒,美中不足的是没有留出电池供电引脚,单片机断电就完了。9 i! S6 X0 L& R/ `( h6 }+ D' ~
6.硬件SPI配置,这步非常简单,看图8 A1 z0 `% n" T! ?( C* m1 ~

2 E) q- a) |( y5 U1 g2 n' u/ j. X1 }6 W6 v' B2 |& s
简简单单几句就把它给配置了,做好这个借口,直接就跟原子哥的MMC_SD.c和MMC_SD.H对接上了,修改很少。  Z# |# r3 o1 K5 x5 R1 M- ^) p
7 A1 Y8 v% M- Y  z
7.最后主函数:不适用内存分配函数,直接全局变量作为静态工作区。% Z  T  c+ _& g  w" r  f
  " }' q+ K! Q7 s% E' f2 U% |8 h
测试代码:挂载并新建文件$ Y+ T* z# ^* ]5 ~
  ) @  n4 v0 z7 R" N+ `

0 }; S3 c* A3 m$ ]! @; x: x& V/ y编译运行结果(RAM包含了自己测试用的一个长度为514字节的buff数组):! k4 k  o5 Y+ ?0 Q' y: v3 V. X

3 H- b0 S# J! e+ T0 T" F! y$ `+ X+ ~8 Y+ ^, W( g( ^/ Z! X0 x- I' b

. ^8 M" e2 v: T$ ?' N/ I! P在工程Backup文件夹里面还有一段测试读文件的代码:
  p) F' H0 S9 m2 M: t+ p/ s- m% V   res = f_open(&fl,"news/news.txt",FA_READ);   
4 J0 ]6 y# y) h/ N6 m7 D   if(res == FR_OK)
$ f1 Y$ f6 p3 v4 p# \5 L7 S0 ^2 l   {
. q: \# z# B) V8 W, w2 w1 N     Usart1_Str("Open file ok!\r\n");' ]# b9 y* z; d: [4 w
     Usart1_Str("The news is:\r\n");# E3 F7 S6 K+ M
     do
& r, }5 ^: T5 h3 H7 L7 b+ P     {
* P8 P  k6 ]: v8 ?; l: Y3 _       //for(i=0;i<50;i++) buff = 0;
9 J9 V' p) P  L8 z# u) ]7 [. [       res = f_read(&fl,buff,512,&r);5 {0 L1 |) c1 L7 @& W6 E( P
       //Usart1_Str(buff);  C" o% w7 H8 a) K6 q* R
       if(res || r<512)
4 m6 d4 F. [( y6 A3 M& m+ `' l       {
4 p  ?: L/ T8 |( P, r$ e" K( J" P3 J          Usart1_Str("Read over!\r\n");
7 A& |- f. Z4 t: g! y% c6 Y         break;   //error or eof   
# }5 p7 V7 a* w- n% t- s       }
0 J3 }! y1 T+ M7 v8 p3 q     }/ H: C0 v4 B! j7 d" d2 D
     while(1);7 T/ y. R2 `) r; W
   }
5 m9 M6 G1 C1 \3 |4 y# R' @   else. W! I5 o4 l9 g
     Usart1_Str("Open file failed!\r\n");
, U& Q) R: y- m+ z+ R   f_close(&fl);
# I: u! ~9 T) e% j0 J6 S" i' ]" u% W/ Q; V; y

5 h' {+ @) M/ [) ^事先在SD卡里新建一个news/news.txt文件,大小为1026KB,最后测试读出时间是14秒,平均速度是60多Kbyte/s的读出速度,对于一般应用相当够用;* A8 n. `3 g- {! y( E9 s9 ]
跟另一个用模拟SPI写的工程比较,读取同样的这个文件,耗时一分49秒,平均速度只有10Kbyte/s左右。写入速度没测试,应该会慢一些。。。' h1 L# w- ~, U0 j4 _
) ~0 A6 I0 ^+ [; b  s
建议:使用FATFS时选用内存稍大的点STM单片机,本实验使用的是Medium容量的,上面还有Medium density plus,跟High density的,内存和存储空间都大很多,建议选用后面两种。
& \0 r8 |( `( z" L, TSTM8L的低功耗貌似很感人,等板子来了在测试了。。。5 ?; V, E) N" k  T

7 `, O: ]2 ?; v% p5 c8 D. G
% ?+ j8 W% M* U4 q' ~) @. ^/ \6 W7 g! N% [
) m/ {$ ?$ D6 l* C. O7 C

Tiny_Fats(模拟SPI).zip

下载

3.66 MB, 下载次数: 205

速度慢,好移植

Tiny_Fats(硬件SPI).zip

下载

3.59 MB, 下载次数: 7658

速度快

评分

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

查看全部评分

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

举报

22个回答
tongyongbq 回答时间:2017-2-2 14:23:54
搞定了,是卡的问题,,,原先用的是一张32M的SD卡,估计是很古老的了,,,老是不成功,后来换了一张2G的卡,初始化成功了。。。感谢楼主分享。。。
; S: k: K# k4 w- C. \; y
& ~8 n! Q: ^! T! ?另外有个问题,希望楼主或者其他大侠看到了能够顺便指点一下,提前谢谢:  }0 ?! d" ?, t2 ]3 X/ m8 T
用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
谢谢楼主。
% g8 }* H& }; g& T, @/ C! o
1 G  B: Y6 p: S! F4 n! H这款最新的L073也不错0 L; v: T* @1 _5 Q
. R4 U; P" G. J+ J+ [+ D; @, L
拼实力、看创意,超低功耗STM32L0方案秀+ @* q0 S2 F- k
https://www.stmcu.org.cn/module/ ... &fromuid=366506
1 Y8 V4 k) X% o2 m$ X- G(出处: 意法半导体STM32/STM8技术社区)
# n0 w7 \7 X* f. ?8 M$ n
黑夜之狼 回答时间: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
+ a2 i; o& [; T: z4 N4 k好像么有贴出图片来?

$ k0 I8 g& C, _% J1 q贴了,只是显示不出来,不知道为什么呢。而且老感觉这个网站卡卡的感觉
huaiqiao 回答时间:2016-4-2 23:43:54
1201yuge 发表于 2016-4-1 20:150 j7 i: n7 r1 m+ }- B
贴了,只是显示不出来,不知道为什么呢。而且老感觉这个网站卡卡的感觉 ...

- Y' z" N, k0 ^3 ^. @, |, H可以重新编辑一下,这样好看一些。也方便学习下你的东西哈。
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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版