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

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

[复制链接]
1201yuge 发布时间:2016-3-22 09:51
      最近老师需要做一个低功耗的各种环境参数采集仪,要求不多,就是采集各种参数并储存起来,但是要求低功耗。所以我第一时间就想到了STM8L系列单片机,发出去做的板子还没回来,就先使用现有的一块板子先调试文件系统和RTC这些啦。今晚还有点时间就写个移植过程吧,给后来人种一颗小树苗吧。。。' c, p: q5 F7 }7 X3 t3 \( [3 a2 y' |

" o2 P) I' v8 q* _! E, A3 h" }硬件介绍:
3 u6 Z& ]3 |3 c# X; G' j    单片机:STM8l152c6t6, 2K RAM,32K FLASH
5 o! I9 x' F) y+ N! b( y, D    SD卡:4G和8G  $ F' g* b- ~; I; [
    接口连接://SD_DT3--SD_CS----------------PB4
3 x# w" ?0 l+ q2 }  l2 @                   //SD_CMD--SPI1_MOSI--------PB6
% d2 f& u( I( F$ U                   //SD_SCK--SPI1_SCK-----------PB5
. _- U, x: d2 p" p                   //SD_DT0--SPI1_MISO--------PB7% \, S( ?, o2 F, P% s; K! p* \% n

: U! H, q# A: K  x' f: W5 A5 \. W软件介绍:
9 F0 A$ O+ E, H; J. r    编译器:IAR for STM8; D2 ^: I+ Q. o4 g7 b& p
    FATFs版本:R0.11a ,直接到FAT官网上面下载即可,下面附件也有。
- t& l- w& m& p' a    通信协议:硬件SPI   (附件也有一份软件SPI的源码)- P4 m# s$ u7 F/ z3 ?9 h  n% B" H
    RTC:使用STM8L内置的RTC8 l1 R* z6 X2 ~9 S' p' E, M

! H% D8 s+ f7 ?9 }0 X0 F移植意义:可能大家觉得在STM8这种这么low的单片机上面运行FAT文件系统没什么意义,但是我觉得STM8l在用在低功耗采集或者信息节点的场合很多时候都需要存储数据,那么说到存储数据最适合的存储介质我觉得就是SD卡了,低成本大内存。那么自然想到FAT,存储的文件可以直接在电脑打开,每天新建一个文件来存储等。所以我觉得这东西上面使用FAT还是很有意义的。Tiny-FATFS需要单片机的1K的RAM用做工作区,具体需要多大的FLASH看你的要求了,可以适当的裁剪FATFS,我编译出来是20多K。
) m6 [) s& u# }+ S/ w% |
4 O2 c7 t+ c3 b% b3 M移植步骤:
* n5 B0 O6 T! ~   1.下载FATFS源码包,解压之后把src文件夹直接复制到工程目录中,并把带的字库和说明删掉,如下图;
* j3 {. O1 K+ j6 {   ; {. T5 d3 M- T+ Q! C
   2.打开STM8工程,把FATFS中的xx.c文件(diskio.c和ff.c)添加至工程目中,并在option中包含路径
& U' M5 M. k( B- P: ]  
5 @5 I) O5 f: R8 O# w   3.配置ffconf.h(简要说下,具体可参考原子哥的手册);0 d8 @$ c( v3 t/ o
   #define _FS_READONLY        0    //可读可写
. u9 Z4 G5 ^) K5 f4 X$ g) d. K   ##define _FS_MINIMIZE        3    //_FS_MINIMIZE、 _FS_READONLY、 _USE_STRFUNC、 _USE_MKFS、_USE_FORWARD 这些宏是用来对文件系统进行裁剪的,具体见下表8 P0 n  v$ N) Y. w  F( M5 N- z
   #define _CODE_PAGE        1    //就支持ASCII码,小内存伤不起
  B* M; c, Y8 ?$ m0 l1 [    。。。。。。。: S2 d7 G5 T* O" b
   #define _VOLUMES        1        //注意:Tiny-FATFS仅支持一个逻辑设备,设为17 }# V; m- o* q( j( B
   #define        _FS_TINY        1        //就是这个地方,设为1之后就是Tiny-FATFS了,编译之后你会发现比设为0的时候用的RAM少不少,只需1K,当然牺牲就是变慢了# w- I$ ]& y$ q3 l4 s% {
   
" A6 L1 I: V. @. {3 {% J/ y4.编写diskio.c里面的5个接口函数。" Y& g: T0 U7 d; \
   前面5个接口函数我是参照原子哥的代码改的,我把除了SD_CARD的其他选项全删了,只留下SD_CARD的部分,因为其他的设备都用不上。(具体代码见附件)7 s6 l# p: {2 Q% [! f) w% h# i
  get_fattime函数:$ O- Z% a9 s# d6 F
DWORD get_fattime (void)
, U8 g' I/ C3 }# J{                                 
$ |1 p( V3 L( L/ m        return (((u32)(RTC_DateStr.RTC_Year-(RTC_DateStr.RTC_Year>>4)*6)+20) << 25) /* Year */. {; F' l( i# s! L  K, ^7 q
              | ((u32)(RTC_DateStr.RTC_Month-(RTC_DateStr.RTC_Month>>4)*6) << 21)      /* Month*/
4 `) N1 s0 A$ ~' p0 n) S7 [5 F: h              | ((u32)(RTC_DateStr.RTC_Date-(RTC_DateStr.RTC_Date>>4)*6) << 16)       /* Day*/
/ R2 @" V" y/ V4 X/ q; }              | ((u32)(RTC_TimeStr.RTC_Hours-(RTC_TimeStr.RTC_Hours>>4)*6) << 11)      /* Hour*/% u8 E' t+ [& ~( E0 N! {  t
              | ((u32)(RTC_TimeStr.RTC_Minutes-(RTC_TimeStr.RTC_Minutes>>4)*6) << 5)     /* Min*/( @) g8 f- V1 \+ i2 R
              | ((u32)(RTC_TimeStr.RTC_Seconds-(RTC_TimeStr.RTC_Seconds>>4)*6) >> 1)     /* Sec*/
, |  _/ _/ C) K2 G6 i* w;+ x; d5 f; y2 X8 Z4 I5 K
}" y. j/ D" Y& ~( f! A* N

0 O, ~! d9 a) l3 e$ [  这里使用的是内部的RTC,每1S时间产生一个唤醒中断,然后在中断函数中更新日期时间,注意这里的日期时间都是BCD吗,例如0x16表示的是16年,所以上面做了转换。4 G' O9 n6 r( {: C8 z
4 K4 s" q4 e4 V9 m0 H& f/ ]3 ]
5.RTC初始化配置见附件源码了。下面是初始化过程中一个需要注意的地方
9 ]. v1 E: x6 ]/ B, K3 B) k  if ((RTC->ISR1 & RTC_ISR1_INITS) == RESET)  //Check calendar has been initialized or not?
$ B7 _- a: R8 p) h/ S; `) ^) @  {
$ k" ^0 k0 D. g8 m- Z    RTC_DateStructInit(&RTC_DateStr);
3 V( b8 [: T0 X, J    RTC_DateStr.RTC_WeekDay = RTC_Weekday_Friday;* \* z3 e% P( A
    RTC_DateStr.RTC_Date = 6;
- W) P/ R' y% }    RTC_DateStr.RTC_Month = RTC_Month_March;
# `# U7 W5 D# N2 x    RTC_DateStr.RTC_Year = 16;
: M% K0 ~& F; i$ v0 A0 x  a( f    RTC_SetDate(RTC_Format_BIN, &RTC_DateStr);& S& t1 \: ^: p: q* f6 X
+ o4 s; A' k& b! X) g
    RTC_TimeStructInit(&RTC_TimeStr);
0 K/ d. V5 H- r1 j* \- C8 K" n9 n% w7 H    RTC_TimeStr.RTC_Hours   = 20;
3 L* Q* {+ Y% a5 h% c/ B    RTC_TimeStr.RTC_Minutes = 02;
3 M: G4 `3 v& S' z) t/ R    RTC_TimeStr.RTC_Seconds = 00;
9 ]# J4 z) e, a& G    RTC_SetTime(RTC_Format_BIN, &RTC_TimeStr);    0 e, g# v* S. v: ]: r9 l
  }; ^& C9 [  y: b
& P; s8 J  _, i; K! @
就是设置日期时间之前检查是RTC是否已经被设置过了,设置过了就不需要设置了。类似于STM32的备份寄存器,这样子只要不断电RTC的时间就不会复位。顺便提一句,STM8l的RTC还是很稳定、很准的,当时测了两三天跟电脑的时间差不了2秒,美中不足的是没有留出电池供电引脚,单片机断电就完了。6 e% r2 c# |! F- `& V' Y; z
6.硬件SPI配置,这步非常简单,看图
: D0 U0 R* L2 v: w2 g
# P" Q9 H2 N( K6 D% K  n6 Y# v9 o1 w  |' d4 L* Y8 u& B6 ]
简简单单几句就把它给配置了,做好这个借口,直接就跟原子哥的MMC_SD.c和MMC_SD.H对接上了,修改很少。
& v* V$ M5 V$ J# Y+ \: l: j
, \6 Q5 g+ y+ T# H7.最后主函数:不适用内存分配函数,直接全局变量作为静态工作区。
' l0 [% a8 F2 g/ S* i  : H4 m% ^4 c; X( h- i
测试代码:挂载并新建文件
, u# Z' V- L1 o0 e( j4 h$ Y  & w1 ?) e' V: ?9 _' s4 s# b
' w& ]+ S: M& X% |. v
编译运行结果(RAM包含了自己测试用的一个长度为514字节的buff数组):
" O% w8 x( M6 o8 U+ {* s
0 }# {5 a; r0 q* U( j4 R
) p' Z# r! Y! _% S+ i9 q0 R  G3 r& P" F3 ^- T4 m2 f6 d
在工程Backup文件夹里面还有一段测试读文件的代码:
/ l6 t5 V8 {8 }. u   res = f_open(&fl,"news/news.txt",FA_READ);   ) u7 |  `. X8 v! I" U2 V5 N  ^4 v3 H$ w
   if(res == FR_OK)" z% k+ b4 R  C& L$ s0 {
   {
' k0 U+ [3 P" ^- o/ `; B     Usart1_Str("Open file ok!\r\n");  p2 H' \/ }4 L5 m
     Usart1_Str("The news is:\r\n");
/ R% x4 t3 n' g3 W( s. O     do0 |/ I7 ]" U. K5 l8 b, ?
     {
0 G/ Y& w* c* \  Q       //for(i=0;i<50;i++) buff = 0;
. M1 U% d; a7 X6 o4 m6 v       res = f_read(&fl,buff,512,&r);4 r3 ^, l  a( ^  c
       //Usart1_Str(buff);  f1 t% M8 s. d9 s, L# t
       if(res || r<512)
7 ~$ T  M! Y! L5 \" h0 s& j       {
: m0 J9 Y0 T3 ]7 r0 e          Usart1_Str("Read over!\r\n");, x& }; d* P# J! W/ V0 M: k- b3 T
         break;   //error or eof    ( R( ^: V: H3 C* a& [5 [* p
       }
1 S' j! y6 Y1 D5 w     }0 S  `; ?$ |  E( \1 F0 s
     while(1);9 L  a+ `( N1 ]: x1 a/ l1 K
   }' k) B6 i  R' j2 k: ]2 F% q1 r/ j
   else- e! O& i, [: @' F1 Q$ o
     Usart1_Str("Open file failed!\r\n");
+ C: A: p% }& s! `" J* c   f_close(&fl);7 m9 K- Z' U0 w- S

1 S2 n9 |% w( J: C5 j9 i) ^) A2 x* q' a
事先在SD卡里新建一个news/news.txt文件,大小为1026KB,最后测试读出时间是14秒,平均速度是60多Kbyte/s的读出速度,对于一般应用相当够用;
8 f) v! ]' `" N  Y跟另一个用模拟SPI写的工程比较,读取同样的这个文件,耗时一分49秒,平均速度只有10Kbyte/s左右。写入速度没测试,应该会慢一些。。。
, d7 H/ s& ~7 h+ U. I; `
. r5 g" [9 l7 ~, q& O% I建议:使用FATFS时选用内存稍大的点STM单片机,本实验使用的是Medium容量的,上面还有Medium density plus,跟High density的,内存和存储空间都大很多,建议选用后面两种。
2 V- J' U0 K9 r) X* b6 Z6 qSTM8L的低功耗貌似很感人,等板子来了在测试了。。。$ x  c7 L# h( d3 C: d
4 H7 Z# B% k) H' u' P

- G& M2 X5 h- g! G* X: T( L7 Z
2 a: x* Y1 {. h) R4 ]( `! i: _8 y* S" i1 s8 Y

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的卡,初始化成功了。。。感谢楼主分享。。。2 O) s; R' C* c# w* ^
! |* @: a6 A, `+ z  v  m  R3 w5 e
另外有个问题,希望楼主或者其他大侠看到了能够顺便指点一下,提前谢谢:
7 K2 z5 l" h1 h  B6 q用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
谢谢楼主。
. j3 H" y7 N0 r' }; g0 ?" ^; p4 ?2 |! d  _7 v% a2 c
这款最新的L073也不错1 c8 U! c8 D- l3 ~$ T
' M! u0 C0 K* e( z) r: u
拼实力、看创意,超低功耗STM32L0方案秀
" z. m( I% U( @" _3 ^https://www.stmcu.org.cn/module/ ... &fromuid=366506/ e; A/ y- O, N& `- {# ~
(出处: 意法半导体STM32/STM8技术社区)
- X9 S+ G/ s3 z( K( C* E, 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) I$ Z- S0 l" h) x
好像么有贴出图片来?

+ H3 P( w6 {) n2 p7 {贴了,只是显示不出来,不知道为什么呢。而且老感觉这个网站卡卡的感觉
huaiqiao 回答时间:2016-4-2 23:43:54
1201yuge 发表于 2016-4-1 20:15
1 m  r6 K- K% p贴了,只是显示不出来,不知道为什么呢。而且老感觉这个网站卡卡的感觉 ...
" n. c4 A( ]" ]
可以重新编辑一下,这样好看一些。也方便学习下你的东西哈。
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 手机版