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

5分钟用STM32的内置Flash做一个超小U盘

[复制链接]
萧星-96138 发布时间:2010-4-6 18:16
5分钟用STM32的内置Flash做一个超小U盘4 }- d$ S1 u4 c
可以用来实现驱动的自动安装功能,或是通过Ini文件配置硬件0 S/ M  V4 D$ s. S0 J$ n) B, @8 \
Build a mini U-Disk in STM32 in 5 minutes2 j( y" y. Y1 ?" I
Install device driver automatically
! c0 t$ c0 Y& ?) O7 }* gOr config hardware through visiable ini file
8 P9 A7 B. E: s! M开发环境8 I5 f. m6 r8 q  A
IDE&Compiler    IAR 4.42 32K 限制版# I; ?9 d& w0 D2 y
USB固件库       2.01
2 m- E/ J/ S7 c+ |4 a硬件            万利199元开发板  STM3210B-LK1" n) K: i% G. @8 r) k; F
5分钟要实现一个完整的Usb Mass Storage功能是不现实的,好在网络如此发达,并不是每件事情都需要从轮子做起。8 y, T" w5 x1 S
ST的官方网站的UM0424中有一个关于使用STM32做Mass Storage的例子,这个mini U盘就是根据这个例子修改而来的( e/ P7 B+ `$ `8 u
ST官网的库已经更新到3.0,我用的UM0424是2.20的,故在上传了这个老版本的库8 i; Z8 M' x* g- H3 B
这个库中没有任何关于文件系统的代码,即文件系统的实现都是由操作系统完成的,这个库中只需要对操作系统发过来的读取与写入命令负责即可。
; D2 Q9 X( E  C: l库中的mass_mal.c为文件系统与存储介质的访问接口(Medium Access Layer interface),负责将文件存储在实际的介质上,如NAND-Flash,SD卡等9 B1 s1 I- J9 H/ U# r/ h
我们需要把文件存储在STM32的内部Flash中,因此更改这里的接口即可# Q+ w4 B: l* @0 L
mass_mal向外提供了四个函数! w# l0 h! V0 r0 D; h/ }2 f
u16 MAL_Init (u8 lun);
0 f' B0 _/ @" A& O5 F初始化介质,由于是内部Flash,为了能写入,只需Unlock FLASH4 }4 _2 Q/ c: X% y! O
u16 MAL_GetStatus (u8 lun);/ e* J" g, p3 Y
读取介质的参数,页大小,总页数,以及总大小,这个视STM32的内Flash情况而定,为文件系统format介质提供依据% \& E8 S; @/ B. [# W
u16 MAL_Read(u8 lun, u32 Memory_Offset, u32 *Readbuff, u16 Transfer_Length);+ w( n+ @- Z+ T5 W
读取介质上的一块区域2 D) H8 T+ m  g3 o: k1 F/ B
u16 MAL_Write(u8 lun, u32 Memory_Offset, u32 *Writebuff, u16 Transfer_Length);
  A1 x; L) C, G, a$ e* s写入介质上的一块区域
0 }0 b- o8 y& D, D, \这里的Memory_Offset是从零偏移开始的,用作U盘的STM32内部Flash需要从代码之后开始
* B# k. ~5 @4 e. Z) y4 @- g我这里编译结束后代码在0x0800252B,取mini U盘开始地址为0x08003000
2 r+ k8 a' _+ m1 S  p万利板上的芯片为103VBT6,Flash为64K,还剩余52K即0xD000,每一页为1K6 \. k) D) D+ T
根据以上信息,mass_mal更改为:! N3 j( Q2 `" y( e- l2 w
" }/ J) }7 P3 k
/*0001*/ #include "platform_config.h"
& q! `; w) |5 t/*0002*/ #ifdef USE_STM3210E_EVAL 1 R- q$ k& O$ t$ Q
/*0003*/ #include "sdcard.h"
1 F: p( [& Z, u* \/*0004*/ #else : |) z- o' t3 v& K$ p
/*0005*/ #include "msd.h" ) t4 H4 I3 T% B6 a! p* J
/*0006*/ #endif
( x5 Q2 V- @; A3 b/*0007*/ #include "fsmc_nand.h" , J8 o$ n2 R$ r; p) X7 m
/*0008*/ #include "nand_if.h" : q" ^, n4 N* F+ g3 R0 S* O
/*0009*/ #include "mass_mal.h" 9 N; I  a" v- I1 O
/*0010*/ 6 S5 h2 L- h" h0 G* d, l" n& r
/*0011*/ /* Private typedef -----------------------------------------------------------*/ * v1 ~- d  D7 v/ q4 G* u
/*0012*/ /* Private define ------------------------------------------------------------*/
: d. Y# I) P  t6 l2 i! A1 c/*0013*/ #define     FLASH_START_ADDR        0x08003000    // Flash start address
. x8 M5 ~  H2 i6 y) `; w" v/*0014*/ #define     FLASH_SIZE              0xD000        // 
. b! _5 }4 R7 P  W5 X. c9 x/*0015*/ #define     FLASH_PAGE_SIZE         0x400         // 1K per page
) y$ w# T# ~0 y) V1 o/*0016*/ #define     FLASH_WAIT_TIMEOUT      100000
' {  n$ M2 U- q% T( w: F' B1 m/*0017*/
7 O6 ], X1 Q* T, w) m3 K  }/ m/*0018*/ /* Private macro -------------------------------------------------------------*/
1 t8 l. {$ [3 s2 m3 K  {6 q/*0019*/ /* Private variables ---------------------------------------------------------*/ 0 W. T- D. i' T& K3 F" W* _
/*0020*/ u32 Mass_Memory_Size[2]; " F. O- D" q. Q  V7 H" H) L6 u
/*0021*/ u32 Mass_Block_Size[2]; ; T( G2 j" b5 g
/*0022*/ u32 Mass_Block_Count[2]; ) ~$ a6 q# M6 W
/*0023*/
: t' f6 j7 a) i/*0024*/ u16 MAL_Init(u8 lun)
8 z" @+ O3 H6 v% h) j0 ~2 B% P/*0025*/ { : c$ V7 s8 q& Q! l
/*0026*/   FLASH_Unlock(); ; R: H8 C6 F1 h! a0 c( M5 r: V
/*0027*/   return lun == 0 ? MAL_OK : MAL_FAIL; , F& y5 T* a6 w$ y
/*0028*/ }
" B- e, m1 x0 n* a9 `. d7 v( h/*0029*/
3 N0 Q, x' _! H6 P- e. Q7 S/*0030*/ u16 MAL_Write(u8 lun, u32 Memory_Offset, u32 *Writebuff, u16 Transfer_Length) 1 t: }* o9 E1 J) L' y
/*0031*/ { - ?& @9 P" V( p1 P+ U7 l
/*0032*/   if(lun == 0){ & {2 P- {  s$ u8 a
/*0033*/     for(u16 i=0; i2]);
- w. z5 c; H4 _& Z/*0044*/     }
% f/ ~7 j1 B& M  w1 {, S/*0045*/     return MAL_OK; ; i; z; I/ s# i# U
/*0046*/   } " C  k, K' y' h2 m5 N
/*0047*/   return MAL_FAIL; # ]' X8 K( A  w# _. K* n
/*0048*/ } ) l$ t7 F$ f- k* E* x& `
/*0049*/ " s( b5 o! w" M# o3 V
/*0050*/ u16 MAL_Read(u8 lun, u32 Memory_Offset, u32 *Readbuff, u16 Transfer_Length)
1 W- R# N# H# C/*0051*/ {
4 R  ^% R: \) W8 Y% t/*0052*/   if(lun == 0){
. n5 j( b5 T5 d' P" C2 v/*0053*/     for(u16 i=0;i>2] = ((vu32*)(FLASH_START_ADDR + Memory_Offset))[i>>2]; - B$ y- h5 P% D
/*0055*/     } - @0 [  i' K8 g' L) ?3 Q
/*0056*/     return MAL_OK; 0 Y0 v: ]1 A" T
/*0057*/   } 2 k6 ]: v. L. ^" c
/*0058*/   return MAL_FAIL;
0 b/ B0 q6 s$ F& A) d  s7 Y/*0059*/ } / \2 u5 v- f2 A
/*0060*/
0 s) d' g# r0 I6 F) x: Y' v/*0061*/ u16 MAL_GetStatus (u8 lun) 3 ^9 }' o! j" p5 }& t3 S6 U1 M( `
/*0062*/ { 6 j' X- K+ ~7 T' F3 q
/*0063*/   if(lun == 0){ ' [' F9 i! J' s% d: [  }5 F% ~
/*0064*/     Mass_Block_Count[0] = FLASH_SIZE/FLASH_PAGE_SIZE;
  r$ s7 i/ @# O: |/*0065*/     Mass_Block_Size[0] =  FLASH_PAGE_SIZE;
, `8 N( k: F# q+ {/*0066*/     Mass_Memory_Size[0] = FLASH_SIZE;
! l  w  C* a6 q$ m* x! m/*0067*/     GPIO_SetBits(USB_LED_PORT, GPIO_Pin_7); 8 Z1 b" m) F5 Z0 E% j$ m
/*0068*/     return MAL_OK; 8 s; L% R6 L: A: S2 L4 \  Q
/*0069*/   } 5 ?, G0 S6 u4 L. Y. |6 [3 S
/*0070*/   GPIO_ResetBits(USB_LED_PORT, GPIO_Pin_7);
! `  `5 G7 Y3 B3 q/*0071*/   return MAL_FAIL;
* S5 ^% ^3 A+ Y' y, `7 q/*0072*/ } ( I8 n9 `+ f) U# z9 N
/*0073*/
$ ~: X  J6 i) z( j# {

: M, H" O& E7 A0 y/ M& a+ D改好了之后文件的存储目标就变成了STM32的内部Flash
5 o& j# F0 W; p; S) u. D实际运行中还有一个问题,那就是在memory.c中Data_Buffer定义大小为512Bytes,这里我们的Flash是1K一页,要将Data_Buffer重新定义成1KBytes的0 N' u! d# E9 ~" q
u32 Data_Buffer[BULK_MAX_PACKET_SIZE *4]; /* 1024 bytes*/

# |( Z- T) {1 [. g' P2 }; Z编译好后烧到板子上,电脑会提示格式化磁盘,格式化后就可以像一般的U盘那样使用这个mini U盘了% s; e( w: B% X( X
虽然小了点,但是装个驱动程序、写点广告什么的还是够用了( k8 d+ ]- {- ]% i5 L8 ~
想要的文件放好后可以将写入Flash的代码去掉,这样可以避免用户修改内容
3 o. h; ^: G! a3 X9 A5 j' s 
收藏 评论0 发布时间:2010-4-6 18:16

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版