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

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

[复制链接]
1201yuge 发布时间:2016-3-22 09:51
      最近老师需要做一个低功耗的各种环境参数采集仪,要求不多,就是采集各种参数并储存起来,但是要求低功耗。所以我第一时间就想到了STM8L系列单片机,发出去做的板子还没回来,就先使用现有的一块板子先调试文件系统和RTC这些啦。今晚还有点时间就写个移植过程吧,给后来人种一颗小树苗吧。。。
1 }3 w; c% a5 |1 s# n+ z: F1 f1 Y" T5 }( M( O
硬件介绍:. l* R7 ?. }5 C- v  }( v. d( j( _
    单片机:STM8l152c6t6, 2K RAM,32K FLASH
7 [* D3 i* b6 P+ B    SD卡:4G和8G  
. a  n3 @+ w* m; e3 A3 A) k    接口连接://SD_DT3--SD_CS----------------PB4
  e% u4 K9 K' p' o                   //SD_CMD--SPI1_MOSI--------PB6# n  F) P( l7 u7 ^) g' ]
                   //SD_SCK--SPI1_SCK-----------PB5
5 V, y: C7 {0 O0 X2 O                   //SD_DT0--SPI1_MISO--------PB7. {/ J: ]' ~" K1 c% H9 }

9 Q) i( y. z& b: b9 y软件介绍:
  r+ ]% h- C5 D& y2 W8 l  G    编译器:IAR for STM8
5 u, _5 Y, Z1 R! V+ J- ?    FATFs版本:R0.11a ,直接到FAT官网上面下载即可,下面附件也有。
! C6 @. x' A- r8 H2 [    通信协议:硬件SPI   (附件也有一份软件SPI的源码)
7 K5 Z$ b3 G& y# Z3 p& X( x; q    RTC:使用STM8L内置的RTC
7 R& `* C6 K4 N4 k4 C8 I6 J0 ^7 D/ ~" _' V
移植意义:可能大家觉得在STM8这种这么low的单片机上面运行FAT文件系统没什么意义,但是我觉得STM8l在用在低功耗采集或者信息节点的场合很多时候都需要存储数据,那么说到存储数据最适合的存储介质我觉得就是SD卡了,低成本大内存。那么自然想到FAT,存储的文件可以直接在电脑打开,每天新建一个文件来存储等。所以我觉得这东西上面使用FAT还是很有意义的。Tiny-FATFS需要单片机的1K的RAM用做工作区,具体需要多大的FLASH看你的要求了,可以适当的裁剪FATFS,我编译出来是20多K。
" P1 i! \+ c2 s: ]. J
! L2 g. a4 \. r* y8 a9 d移植步骤:
1 I) ]5 @* V: _& J) x1 @) G% v- k0 I   1.下载FATFS源码包,解压之后把src文件夹直接复制到工程目录中,并把带的字库和说明删掉,如下图;
% U$ J- J3 W; v( l) O( q0 M   
- U9 l3 X  T* G8 |- ?: a   2.打开STM8工程,把FATFS中的xx.c文件(diskio.c和ff.c)添加至工程目中,并在option中包含路径
) ~, z6 y! R: W  
) r8 j$ I- G0 x, e   3.配置ffconf.h(简要说下,具体可参考原子哥的手册);
+ f8 Y  R- q- s1 m   #define _FS_READONLY        0    //可读可写7 b( ?+ p# r7 \
   ##define _FS_MINIMIZE        3    //_FS_MINIMIZE、 _FS_READONLY、 _USE_STRFUNC、 _USE_MKFS、_USE_FORWARD 这些宏是用来对文件系统进行裁剪的,具体见下表1 L( p# e9 d8 z0 x4 N4 L; K
   #define _CODE_PAGE        1    //就支持ASCII码,小内存伤不起
: L4 Q& H" G: r' x( w    。。。。。。。9 ]) \5 k# Z2 H  B8 X; |# y7 C' }
   #define _VOLUMES        1        //注意:Tiny-FATFS仅支持一个逻辑设备,设为1
5 O6 a- t- P* }7 g4 O! G   #define        _FS_TINY        1        //就是这个地方,设为1之后就是Tiny-FATFS了,编译之后你会发现比设为0的时候用的RAM少不少,只需1K,当然牺牲就是变慢了1 c$ r  B$ D3 B7 x. |$ S
   * H! e( H# Q4 x4 f. v. s- ?
4.编写diskio.c里面的5个接口函数。" ], ^4 \# N7 M& x
   前面5个接口函数我是参照原子哥的代码改的,我把除了SD_CARD的其他选项全删了,只留下SD_CARD的部分,因为其他的设备都用不上。(具体代码见附件)
- P/ [8 q4 o/ A$ O% U! J* Y  get_fattime函数:4 x- Y* c* \& [, |
DWORD get_fattime (void)
5 ]6 l) K6 [5 n  ?  O% S1 b{                                 ! p% w& \/ @  u7 a2 T8 h( O
        return (((u32)(RTC_DateStr.RTC_Year-(RTC_DateStr.RTC_Year>>4)*6)+20) << 25) /* Year */) v& T7 o& W7 d* ]( ?
              | ((u32)(RTC_DateStr.RTC_Month-(RTC_DateStr.RTC_Month>>4)*6) << 21)      /* Month*/
5 u" C, F4 a, R9 M; T              | ((u32)(RTC_DateStr.RTC_Date-(RTC_DateStr.RTC_Date>>4)*6) << 16)       /* Day*/2 l' e7 B  d( a9 I* k. p( S
              | ((u32)(RTC_TimeStr.RTC_Hours-(RTC_TimeStr.RTC_Hours>>4)*6) << 11)      /* Hour*/) L/ Q. X8 Q; k" `' E- C, \
              | ((u32)(RTC_TimeStr.RTC_Minutes-(RTC_TimeStr.RTC_Minutes>>4)*6) << 5)     /* Min*/: w- p) b! r# y4 [  e
              | ((u32)(RTC_TimeStr.RTC_Seconds-(RTC_TimeStr.RTC_Seconds>>4)*6) >> 1)     /* Sec*/
$ m9 W$ l! M" `/ L$ z;4 h( j8 o. v# n% S$ y5 w' W. s
}
+ L6 I8 n8 M& N7 p  o/ D4 F8 X: [! f( b0 e' n  P' ^' a
  这里使用的是内部的RTC,每1S时间产生一个唤醒中断,然后在中断函数中更新日期时间,注意这里的日期时间都是BCD吗,例如0x16表示的是16年,所以上面做了转换。
5 d9 F' v( n9 s$ J. q5 w$ k% u. G; {' Y
5.RTC初始化配置见附件源码了。下面是初始化过程中一个需要注意的地方
) j* L- x( |. a1 r( y  if ((RTC->ISR1 & RTC_ISR1_INITS) == RESET)  //Check calendar has been initialized or not?
5 N4 B8 S* s% q- F" `  {
# q7 G0 S  j& k% |' \" N    RTC_DateStructInit(&RTC_DateStr);7 R+ [% t0 p/ ?! {! P# Y0 v
    RTC_DateStr.RTC_WeekDay = RTC_Weekday_Friday;
3 J; J# n, n3 ~$ K    RTC_DateStr.RTC_Date = 6;
+ R  Z( I) s6 Z9 m6 B( U7 j: G    RTC_DateStr.RTC_Month = RTC_Month_March;
* q' b& h: B: s7 x# Q    RTC_DateStr.RTC_Year = 16;8 t# W" I7 {0 d4 ?
    RTC_SetDate(RTC_Format_BIN, &RTC_DateStr);
- H, M+ y0 i8 S, q0 g, B: F3 X. Z: W* \1 Y3 z
    RTC_TimeStructInit(&RTC_TimeStr);, `$ _1 C2 w1 X% Z$ C3 E
    RTC_TimeStr.RTC_Hours   = 20;; e# I# R0 B6 n5 G8 d
    RTC_TimeStr.RTC_Minutes = 02;6 u( S4 d+ F1 F3 H8 [  F$ Z) ~. W
    RTC_TimeStr.RTC_Seconds = 00;9 O& q% M( W4 ]3 u& @
    RTC_SetTime(RTC_Format_BIN, &RTC_TimeStr);   
' D- C+ i# B8 U& [! n  }
8 s2 f) y) Z8 T5 N/ d! ~( x
8 u5 m  @7 ]7 n; R4 Q* ^就是设置日期时间之前检查是RTC是否已经被设置过了,设置过了就不需要设置了。类似于STM32的备份寄存器,这样子只要不断电RTC的时间就不会复位。顺便提一句,STM8l的RTC还是很稳定、很准的,当时测了两三天跟电脑的时间差不了2秒,美中不足的是没有留出电池供电引脚,单片机断电就完了。% T# y5 Z9 R5 [* t5 `3 f% f4 v. b: [
6.硬件SPI配置,这步非常简单,看图* |. c; y# ~# F( A( p2 N1 c. z
9 D+ I6 D: i# K( D

0 r; {( M/ Y- j3 F4 k9 O) w7 e3 R简简单单几句就把它给配置了,做好这个借口,直接就跟原子哥的MMC_SD.c和MMC_SD.H对接上了,修改很少。
" H; o4 z5 h/ G) r
; d0 S" Q# Y5 _& A, R7 H4 }& b7.最后主函数:不适用内存分配函数,直接全局变量作为静态工作区。; C  z, b' |+ c7 ~9 T, }6 ?5 k
  
; X/ q5 f. K- X测试代码:挂载并新建文件7 T/ e4 c! Z9 E) f6 }  h0 r% D
  # A* S6 z2 R" ]8 C
4 k8 w9 u% h4 a, a; b3 b! j5 V& h
编译运行结果(RAM包含了自己测试用的一个长度为514字节的buff数组):
% C' e" A8 P/ y6 |" j
( }" R: S) ]1 r! b& f9 C& @: S% ]7 V7 ^

- E- Z/ \6 A: e, u; _- S4 V! e在工程Backup文件夹里面还有一段测试读文件的代码:
5 H4 r" H8 E* J: V0 v9 ?   res = f_open(&fl,"news/news.txt",FA_READ);   
: F$ @0 k* w2 S- u5 n1 i   if(res == FR_OK)6 G  @6 K9 D' K' }. Y/ s- T0 B5 }/ t
   {9 f2 a/ R) }3 x0 C6 y) a% L
     Usart1_Str("Open file ok!\r\n");$ L- U! |$ t4 ^: K
     Usart1_Str("The news is:\r\n");2 j& t6 J+ F( _
     do
$ `6 I9 C5 _, z) ~! l  i4 ]     {
; g, S: a" i2 C- B       //for(i=0;i<50;i++) buff = 0;
+ N5 A4 P- R% |  W7 p7 c$ B7 {       res = f_read(&fl,buff,512,&r);- O& H( u) B& k6 ]6 H/ y/ j$ O
       //Usart1_Str(buff);
/ }1 P1 a- U4 F3 x       if(res || r<512)
8 L7 H' X+ X: r! w$ j$ N; ?       {
2 W. O( c- t5 R% N, v2 S0 k5 I          Usart1_Str("Read over!\r\n");5 @. ^! s/ y, i. r0 s9 Y
         break;   //error or eof   
3 D5 O+ H& I8 Z       }
7 `% A$ ~+ H+ s1 ~% A% _! ~     }
' U% |0 Q+ w) Y     while(1);' M$ j! t1 \0 J7 }
   }  s; Y: m1 ]: Y
   else5 N% G: b/ U3 I# P. l, V
     Usart1_Str("Open file failed!\r\n");, ?) H* h$ ~4 J# A) z0 f
   f_close(&fl);
  c  b' n9 A5 o+ c2 q- c9 B6 @) V. t# P

8 C- W1 G3 L5 s1 ?1 {" h) U事先在SD卡里新建一个news/news.txt文件,大小为1026KB,最后测试读出时间是14秒,平均速度是60多Kbyte/s的读出速度,对于一般应用相当够用;5 w; O; A. ~  H6 H
跟另一个用模拟SPI写的工程比较,读取同样的这个文件,耗时一分49秒,平均速度只有10Kbyte/s左右。写入速度没测试,应该会慢一些。。。$ E' ~! h4 X( X  {5 ?8 s
& M+ ~  }. A; ]" {/ _- U
建议:使用FATFS时选用内存稍大的点STM单片机,本实验使用的是Medium容量的,上面还有Medium density plus,跟High density的,内存和存储空间都大很多,建议选用后面两种。  i4 Z, m: V) l6 N, h* r' ~
STM8L的低功耗貌似很感人,等板子来了在测试了。。。+ p( b6 ~; {2 K
" b8 J& z: b! {4 ^6 x

& i9 o5 Y2 j; ~4 ~$ ^% b5 U' w( h' a& R  s6 G) h- [8 o
$ r4 @- F0 l6 A  T

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的卡,初始化成功了。。。感谢楼主分享。。。/ R: _. J% C6 Y2 ?
+ p( K$ Z! D- N- K9 ^: r% E4 W; u
另外有个问题,希望楼主或者其他大侠看到了能够顺便指点一下,提前谢谢:
6 ~0 A( ?) H5 |用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
谢谢楼主。
. H- F# V8 M0 X/ G' n' u( w  P8 @
这款最新的L073也不错" e! c- b0 o5 D# W' y1 @# Y

0 [  }+ C" V& B# T8 `- _1 h拼实力、看创意,超低功耗STM32L0方案秀
9 ~* X3 F" j4 o- Z- }% Y9 w0 r6 qhttps://www.stmcu.org.cn/module/ ... &fromuid=3665063 i7 I; [2 I( \% l2 H$ G9 F  h
(出处: 意法半导体STM32/STM8技术社区)
5 l* l* u6 I* W& G+ C: ?, _* p
黑夜之狼 回答时间: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$ f3 V7 o3 V7 C+ p
好像么有贴出图片来?
$ ]' L3 P( {! p, s4 l4 ~( ^4 n
贴了,只是显示不出来,不知道为什么呢。而且老感觉这个网站卡卡的感觉
huaiqiao 回答时间:2016-4-2 23:43:54
1201yuge 发表于 2016-4-1 20:15# |( n7 ]1 r' {7 d& U! m
贴了,只是显示不出来,不知道为什么呢。而且老感觉这个网站卡卡的感觉 ...

3 W( @5 a' w, u可以重新编辑一下,这样好看一些。也方便学习下你的东西哈。
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 手机版