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

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

[复制链接]
1201yuge 发布时间:2016-3-22 09:51
      最近老师需要做一个低功耗的各种环境参数采集仪,要求不多,就是采集各种参数并储存起来,但是要求低功耗。所以我第一时间就想到了STM8L系列单片机,发出去做的板子还没回来,就先使用现有的一块板子先调试文件系统和RTC这些啦。今晚还有点时间就写个移植过程吧,给后来人种一颗小树苗吧。。。  \' O/ p" l) S. g# r
5 f0 n9 Y5 t3 T* @+ `
硬件介绍:
/ |. W. |" C- T, i/ j1 N    单片机:STM8l152c6t6, 2K RAM,32K FLASH
9 T9 j  M. i& e" s    SD卡:4G和8G  
5 N  S7 O* a: f! q+ I+ T0 i. b    接口连接://SD_DT3--SD_CS----------------PB4+ `$ a2 W3 E- L$ P/ s  T) g' Z
                   //SD_CMD--SPI1_MOSI--------PB6  k+ g% M4 _+ H
                   //SD_SCK--SPI1_SCK-----------PB5
. M- B4 l, d( E% b7 L2 D* b                   //SD_DT0--SPI1_MISO--------PB7
1 q$ P' L7 O6 d& |& ^
) g+ d. X( [8 s1 d软件介绍:- @, s1 @* C5 G9 M
    编译器:IAR for STM8; k$ f0 b' p4 f" ^; e* i- @8 X' L$ Y
    FATFs版本:R0.11a ,直接到FAT官网上面下载即可,下面附件也有。
3 Q  }$ ?8 _0 u) W9 p    通信协议:硬件SPI   (附件也有一份软件SPI的源码)
5 _: g9 a' x$ e, s0 |    RTC:使用STM8L内置的RTC1 s+ x7 B" [# E5 c4 _# N$ P
; t2 t9 y5 |7 W: g
移植意义:可能大家觉得在STM8这种这么low的单片机上面运行FAT文件系统没什么意义,但是我觉得STM8l在用在低功耗采集或者信息节点的场合很多时候都需要存储数据,那么说到存储数据最适合的存储介质我觉得就是SD卡了,低成本大内存。那么自然想到FAT,存储的文件可以直接在电脑打开,每天新建一个文件来存储等。所以我觉得这东西上面使用FAT还是很有意义的。Tiny-FATFS需要单片机的1K的RAM用做工作区,具体需要多大的FLASH看你的要求了,可以适当的裁剪FATFS,我编译出来是20多K。
( B  \, ^; f/ S5 @4 N7 R1 N0 H3 \  E% j
; K  C+ Y" c8 `, v移植步骤:
' v- z! y! k' ^! W   1.下载FATFS源码包,解压之后把src文件夹直接复制到工程目录中,并把带的字库和说明删掉,如下图;
( R* r' M+ y/ Y9 g5 g# `9 t   
" Y( z3 e  k, f; E) \8 P   2.打开STM8工程,把FATFS中的xx.c文件(diskio.c和ff.c)添加至工程目中,并在option中包含路径5 f: L. g: R$ g2 q
  8 y% F& q7 F$ S8 B
   3.配置ffconf.h(简要说下,具体可参考原子哥的手册);
$ K9 j( @) X5 F8 U   #define _FS_READONLY        0    //可读可写$ G' Y" A$ |$ u: }+ x
   ##define _FS_MINIMIZE        3    //_FS_MINIMIZE、 _FS_READONLY、 _USE_STRFUNC、 _USE_MKFS、_USE_FORWARD 这些宏是用来对文件系统进行裁剪的,具体见下表
) L. R4 _& D% r8 G   #define _CODE_PAGE        1    //就支持ASCII码,小内存伤不起# a+ T/ S2 \8 r
    。。。。。。。: j% c! R: @7 W
   #define _VOLUMES        1        //注意:Tiny-FATFS仅支持一个逻辑设备,设为1
  q1 u* z& ~5 q! r" E9 I   #define        _FS_TINY        1        //就是这个地方,设为1之后就是Tiny-FATFS了,编译之后你会发现比设为0的时候用的RAM少不少,只需1K,当然牺牲就是变慢了% Z+ {! u- {$ E+ M! \, i. K0 \2 F
   " e. I- v# q/ g# d$ Y- r$ {- m
4.编写diskio.c里面的5个接口函数。
( j! X+ T# ]4 L6 A/ s   前面5个接口函数我是参照原子哥的代码改的,我把除了SD_CARD的其他选项全删了,只留下SD_CARD的部分,因为其他的设备都用不上。(具体代码见附件), m, G: U1 C6 b; g  @
  get_fattime函数:! m) d8 }4 Z' m8 o1 ?
DWORD get_fattime (void)& N6 s0 Y1 L* b
{                                 ' u# C( g0 \9 m9 f
        return (((u32)(RTC_DateStr.RTC_Year-(RTC_DateStr.RTC_Year>>4)*6)+20) << 25) /* Year */
. Q" F7 Z" w1 {+ ^6 r              | ((u32)(RTC_DateStr.RTC_Month-(RTC_DateStr.RTC_Month>>4)*6) << 21)      /* Month*/, Z! d% e5 P9 y: I6 ]5 C. y: A
              | ((u32)(RTC_DateStr.RTC_Date-(RTC_DateStr.RTC_Date>>4)*6) << 16)       /* Day*/
, J  F9 G, _7 y0 K  ~              | ((u32)(RTC_TimeStr.RTC_Hours-(RTC_TimeStr.RTC_Hours>>4)*6) << 11)      /* Hour*/
. k* ?9 M! N! c2 d3 z0 T              | ((u32)(RTC_TimeStr.RTC_Minutes-(RTC_TimeStr.RTC_Minutes>>4)*6) << 5)     /* Min*/
1 @2 V, G9 F; ~( j+ _2 L2 ?              | ((u32)(RTC_TimeStr.RTC_Seconds-(RTC_TimeStr.RTC_Seconds>>4)*6) >> 1)     /* Sec*/+ j% X+ |) ~3 F
;
6 S; i8 {! H: \) j}4 |: D$ t5 U8 A0 t/ P9 {2 O

- _  ?8 Y" v& u  这里使用的是内部的RTC,每1S时间产生一个唤醒中断,然后在中断函数中更新日期时间,注意这里的日期时间都是BCD吗,例如0x16表示的是16年,所以上面做了转换。/ K- \( [( G% Y  L% J: }) f+ ^* z

4 H0 c1 T: n& J% _% p. ]5.RTC初始化配置见附件源码了。下面是初始化过程中一个需要注意的地方! O% |1 t7 S5 A/ C
  if ((RTC->ISR1 & RTC_ISR1_INITS) == RESET)  //Check calendar has been initialized or not?  W8 r% M1 J1 Q0 o6 e  F
  {
: Y1 ^) I  f2 e* D1 |4 c$ g7 y    RTC_DateStructInit(&RTC_DateStr);
5 [/ u% O( W% K( K' Z) g    RTC_DateStr.RTC_WeekDay = RTC_Weekday_Friday;
8 }( a/ z% V$ p$ P5 M    RTC_DateStr.RTC_Date = 6;/ K. c8 z0 n4 u$ O+ ~( O# Z
    RTC_DateStr.RTC_Month = RTC_Month_March;4 K7 F" n" d$ _$ G8 {
    RTC_DateStr.RTC_Year = 16;7 C5 t7 y9 n1 Y2 K) L9 s
    RTC_SetDate(RTC_Format_BIN, &RTC_DateStr);
. x/ O  z- c$ q* v0 h, K  j5 p1 M6 `+ S" A8 W, e0 P" a
    RTC_TimeStructInit(&RTC_TimeStr);
# g+ d; H2 i8 z( i0 k/ ~7 q5 o) @    RTC_TimeStr.RTC_Hours   = 20;
* l/ \3 T' }' V+ \# c0 r    RTC_TimeStr.RTC_Minutes = 02;
+ r/ N- Q, V, ~. F* w. @  x* o    RTC_TimeStr.RTC_Seconds = 00;
8 q% w! Y  `7 a+ b0 W0 ?) Y    RTC_SetTime(RTC_Format_BIN, &RTC_TimeStr);   
% I) v" Y8 Z* O/ R7 y1 c  }* i# a) r' ~  \9 j

& G) W7 n! J2 i/ s, J" b就是设置日期时间之前检查是RTC是否已经被设置过了,设置过了就不需要设置了。类似于STM32的备份寄存器,这样子只要不断电RTC的时间就不会复位。顺便提一句,STM8l的RTC还是很稳定、很准的,当时测了两三天跟电脑的时间差不了2秒,美中不足的是没有留出电池供电引脚,单片机断电就完了。
3 `7 m% T9 H$ _' g; x) R+ Y6.硬件SPI配置,这步非常简单,看图
& b! _4 R' @$ _+ k/ d0 |6 h3 Y
! e' ?! \0 _8 G
5 ?" X/ h' @2 F2 _0 s2 n简简单单几句就把它给配置了,做好这个借口,直接就跟原子哥的MMC_SD.c和MMC_SD.H对接上了,修改很少。4 O  q- X. ^2 L6 {; P9 L
7 f' [7 |( j7 I
7.最后主函数:不适用内存分配函数,直接全局变量作为静态工作区。
2 p2 Q3 N- f1 _- ^! Y  
3 s& r9 J* O7 s" V3 }4 w) n测试代码:挂载并新建文件
9 C. u/ E4 y5 f. `7 ~+ h% ?7 U: b  
6 e$ U  r. r" a, L9 X
* E8 u0 C  A' I# _3 v1 i( c8 N6 Q编译运行结果(RAM包含了自己测试用的一个长度为514字节的buff数组):* Z% R, R- l$ ^( l% Y
0 g( `# t" g: ^, U) h$ Q9 W( Z

* Q' R/ T, k7 [2 i
7 s: f) ?% m8 Y& O, e1 i- a, r在工程Backup文件夹里面还有一段测试读文件的代码:
3 x: v/ f" D% {2 |+ E9 f. ^3 v   res = f_open(&fl,"news/news.txt",FA_READ);   
: R) u" J" Q0 H) a- O" e; ]   if(res == FR_OK)
9 s1 O5 v- d! L- z   {/ V* p* W" K, O& N. V
     Usart1_Str("Open file ok!\r\n");
6 b, u1 f2 E, i     Usart1_Str("The news is:\r\n");
! ^  C5 ?9 N* |. q6 l& B     do( n: q' k0 |7 `, |( x; x
     {9 U  d7 s: V2 z2 |* x% L, o% w6 `
       //for(i=0;i<50;i++) buff = 0;1 V5 G/ Z( Y" C2 {$ E
       res = f_read(&fl,buff,512,&r);* {! y9 j! X) l3 Z! R/ v( z+ O
       //Usart1_Str(buff);
; p8 B1 F' a  f2 h$ r       if(res || r<512)/ d5 C) ]; t% D8 Y; D
       {
4 v% m3 P# M+ s6 k2 P  |7 M( n          Usart1_Str("Read over!\r\n");
$ u- U0 G) |% V, [0 @         break;   //error or eof    ( N, d8 A9 \: u. I
       }8 N" ]# h  |0 T5 R
     }
2 A6 n4 s" Q2 W* }$ u  E* w     while(1);2 v4 i+ |% i8 A
   }
, m' b  W' r) @   else3 Z1 {' V! G; S0 ]& c& ?  q
     Usart1_Str("Open file failed!\r\n");7 Q+ X+ J% ?) A9 z  O8 Y
   f_close(&fl);. q9 M3 Z; D, _' a

/ q+ e1 v1 X' L7 d# [& e0 B5 z; g! d1 W7 B8 ^6 I% G+ j7 ^3 Q
事先在SD卡里新建一个news/news.txt文件,大小为1026KB,最后测试读出时间是14秒,平均速度是60多Kbyte/s的读出速度,对于一般应用相当够用;
7 m6 i8 w. p" Y. i6 o/ k* D跟另一个用模拟SPI写的工程比较,读取同样的这个文件,耗时一分49秒,平均速度只有10Kbyte/s左右。写入速度没测试,应该会慢一些。。。
' g, m2 D  Y1 `- H! P  C, P. e* s5 g" D% X5 s, O! B8 |1 g
建议:使用FATFS时选用内存稍大的点STM单片机,本实验使用的是Medium容量的,上面还有Medium density plus,跟High density的,内存和存储空间都大很多,建议选用后面两种。
& \& n2 c" E2 @) N# x: VSTM8L的低功耗貌似很感人,等板子来了在测试了。。。
. u9 K9 g- b$ @, A6 ^4 R7 P9 K9 U
! n/ l7 k1 T1 R7 H* m4 s
# Z) ~5 ?5 ~  Z/ Y; I  g: B
5 m  s; V% E3 U  C/ }1 I# 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的卡,初始化成功了。。。感谢楼主分享。。。
1 }3 j- y5 Q* O/ l$ A' z' e: D1 S8 J0 x# n
另外有个问题,希望楼主或者其他大侠看到了能够顺便指点一下,提前谢谢:4 z8 [4 h* b$ h
用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
谢谢楼主。
' o8 L2 A- O: X6 b4 r5 m8 V/ S4 g
) T/ t5 [# _9 B7 h6 G这款最新的L073也不错
0 L4 g) S3 _% p! j9 }' x7 M
# [: ]; z0 ~! l0 A& s0 ?+ }( G拼实力、看创意,超低功耗STM32L0方案秀! c% a: \2 Q+ t) B+ M( j" \. U
https://www.stmcu.org.cn/module/ ... &fromuid=366506
1 X$ h/ N5 D2 Q3 l1 A(出处: 意法半导体STM32/STM8技术社区)- U5 ]. P3 M1 t8 v) f, w
黑夜之狼 回答时间: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
4 E: b! I1 f, X* x. Q/ P" [好像么有贴出图片来?
  i7 `5 @* w: O8 C! z
贴了,只是显示不出来,不知道为什么呢。而且老感觉这个网站卡卡的感觉
huaiqiao 回答时间:2016-4-2 23:43:54
1201yuge 发表于 2016-4-1 20:15
' j: [  c0 E4 Y' I. w$ z贴了,只是显示不出来,不知道为什么呢。而且老感觉这个网站卡卡的感觉 ...
6 w; o' t' Y5 P& z0 N
可以重新编辑一下,这样好看一些。也方便学习下你的东西哈。
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 手机版