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

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

[复制链接]
萧星-96138 发布时间:2010-4-6 18:16
5分钟用STM32的内置Flash做一个超小U盘
+ H# e. H* K" g1 A' w, ?. j4 d. F! M可以用来实现驱动的自动安装功能,或是通过Ini文件配置硬件' a9 n  w1 L7 t& V0 F+ C/ Q# N
Build a mini U-Disk in STM32 in 5 minutes
# l$ V% I0 V$ }Install device driver automatically6 z- V: W7 V( R
Or config hardware through visiable ini file
: a# ~  n/ T+ {/ V+ h1 G+ t. `, J开发环境$ o& J% h% v! t' ?/ ]
IDE&Compiler    IAR 4.42 32K 限制版
2 P  ~$ |, j( _" Q5 gUSB固件库       2.01; e# c; O  F: v3 ^4 O: w7 h6 }
硬件            万利199元开发板  STM3210B-LK14 }- ]8 t# u. b1 q9 Y
5分钟要实现一个完整的Usb Mass Storage功能是不现实的,好在网络如此发达,并不是每件事情都需要从轮子做起。
7 u+ c# ~* n. J4 ]) T/ m) vST的官方网站的UM0424中有一个关于使用STM32做Mass Storage的例子,这个mini U盘就是根据这个例子修改而来的$ K3 d- k9 W* e; G( N, w( Z
ST官网的库已经更新到3.0,我用的UM0424是2.20的,故在上传了这个老版本的库
% n  w& p3 p" m, q% B+ z2 ]& ~- N  p这个库中没有任何关于文件系统的代码,即文件系统的实现都是由操作系统完成的,这个库中只需要对操作系统发过来的读取与写入命令负责即可。
. s  L# n$ O* V( i库中的mass_mal.c为文件系统与存储介质的访问接口(Medium Access Layer interface),负责将文件存储在实际的介质上,如NAND-Flash,SD卡等  z% \* @& S/ v3 I3 y
我们需要把文件存储在STM32的内部Flash中,因此更改这里的接口即可# t' b# _- b2 \
mass_mal向外提供了四个函数% A% |) w9 l7 `* a6 J+ l6 ]
u16 MAL_Init (u8 lun);/ ]% L" M3 {& d; z" I9 V5 b' |1 H
初始化介质,由于是内部Flash,为了能写入,只需Unlock FLASH+ a! D0 K7 C5 Z
u16 MAL_GetStatus (u8 lun);3 u: u. g; z% k* M3 ]
读取介质的参数,页大小,总页数,以及总大小,这个视STM32的内Flash情况而定,为文件系统format介质提供依据
" n5 P, k5 G* J2 k3 _& s$ F" Au16 MAL_Read(u8 lun, u32 Memory_Offset, u32 *Readbuff, u16 Transfer_Length);' r! d" S  ~1 p3 e9 E' L5 x6 |
读取介质上的一块区域
. W/ Z) A% a+ D& ]u16 MAL_Write(u8 lun, u32 Memory_Offset, u32 *Writebuff, u16 Transfer_Length);
8 j* l, B8 D7 Q5 i写入介质上的一块区域7 d+ L: n' X' }0 E' \( A
这里的Memory_Offset是从零偏移开始的,用作U盘的STM32内部Flash需要从代码之后开始& c" v# a0 n, L  P0 o$ r
我这里编译结束后代码在0x0800252B,取mini U盘开始地址为0x08003000
5 h' h# o$ p( J% N# a- Y, {万利板上的芯片为103VBT6,Flash为64K,还剩余52K即0xD000,每一页为1K
6 ^, m$ s! G! U* N' C$ y根据以上信息,mass_mal更改为:6 F8 U, y1 j+ j5 N

* d8 d- f0 F) y0 L$ [" {7 b/*0001*/ #include "platform_config.h" ( ^7 o! e  `! l. \1 {, S* Q: O5 q9 v
/*0002*/ #ifdef USE_STM3210E_EVAL + F; l+ s- A4 v  b2 ?& x
/*0003*/ #include "sdcard.h" , G. H3 r- a- \* ?6 v
/*0004*/ #else 4 \* j0 H' W! u/ ^
/*0005*/ #include "msd.h"
  u, ?( n. p$ ?1 Q6 j3 Q/*0006*/ #endif
* Z/ x% {2 S; @2 }; B' a1 s/*0007*/ #include "fsmc_nand.h"
4 S" |, S" e5 z# Z: i4 t/*0008*/ #include "nand_if.h" - \6 y  g' I$ j0 M9 w
/*0009*/ #include "mass_mal.h" 7 N1 A. y3 T, ?, H2 Y
/*0010*/ 0 P& H* r- J% F
/*0011*/ /* Private typedef -----------------------------------------------------------*/ & I. ?5 g  R1 h3 y# H1 ], q9 b
/*0012*/ /* Private define ------------------------------------------------------------*/ . m$ K$ }, ^/ P8 J& R9 X
/*0013*/ #define     FLASH_START_ADDR        0x08003000    // Flash start address 8 D; \7 b4 a2 J8 D7 z1 v( w
/*0014*/ #define     FLASH_SIZE              0xD000        //  % X( j* F1 l! g) j0 k
/*0015*/ #define     FLASH_PAGE_SIZE         0x400         // 1K per page 2 J0 `  e7 u$ \, e
/*0016*/ #define     FLASH_WAIT_TIMEOUT      100000 ( S+ G6 Z2 s+ X2 l2 J$ N3 t( C
/*0017*/ 3 t. [4 ]- X- C+ I, j8 F( Y* `
/*0018*/ /* Private macro -------------------------------------------------------------*/
4 |( W4 P- r! {/*0019*/ /* Private variables ---------------------------------------------------------*/ 9 d4 ^. G8 ]9 ^7 Y  L
/*0020*/ u32 Mass_Memory_Size[2];
0 Y7 Z3 U6 c$ h- O" g% P( m/*0021*/ u32 Mass_Block_Size[2]; * i/ P0 F* x6 S0 t
/*0022*/ u32 Mass_Block_Count[2]; , g" J2 {6 [' U* D
/*0023*/
% l; x2 O4 b5 b  C/*0024*/ u16 MAL_Init(u8 lun) 6 D& A  P- i  p) d
/*0025*/ {
! W8 V  |4 \, u% {  P( e& h/*0026*/   FLASH_Unlock(); ( Q- v# G+ p2 r* Z5 g" y
/*0027*/   return lun == 0 ? MAL_OK : MAL_FAIL;   h. p. G4 q8 }, B+ ?
/*0028*/ } ' `' H/ W, M4 J5 Z$ A0 K5 ^; Z
/*0029*/
% |' c* {) S$ T: x8 v/*0030*/ u16 MAL_Write(u8 lun, u32 Memory_Offset, u32 *Writebuff, u16 Transfer_Length) ( M. ]& {' ^! D9 o, J, h# e5 q6 @1 h
/*0031*/ {
, e" U1 L2 a' ]  O- r6 u/*0032*/   if(lun == 0){
$ Q( V  V; @/ }; O2 E5 m8 X/*0033*/     for(u16 i=0; i2]); , N6 E/ w3 |7 d  D: U9 q$ g4 W
/*0044*/     }
/ v$ L7 c& N% W) C! w( c4 i* j/*0045*/     return MAL_OK;
$ k( R! g  [" ^3 ^5 J+ h/*0046*/   }
/ Z3 b$ t8 `) V/*0047*/   return MAL_FAIL; * h+ F' w- k5 e
/*0048*/ }
0 s; _0 D! b8 [) S7 q% l6 N/*0049*/ + ]' ]7 F& e4 F9 S' e
/*0050*/ u16 MAL_Read(u8 lun, u32 Memory_Offset, u32 *Readbuff, u16 Transfer_Length) * ~5 M1 y0 p9 q/ Z
/*0051*/ { 1 [6 V/ J" M. U6 X5 y
/*0052*/   if(lun == 0){ 4 I! B# p' m* v% L4 ^# n. l
/*0053*/     for(u16 i=0;i>2] = ((vu32*)(FLASH_START_ADDR + Memory_Offset))[i>>2]; & u! o& L# r% h
/*0055*/     }
0 ?$ D( T6 t" m/*0056*/     return MAL_OK; 4 z9 E5 ?0 `4 P. \2 ^
/*0057*/   }
( {9 b" D3 [, B, S3 Y/*0058*/   return MAL_FAIL;
: Q3 U! ~5 D: }/*0059*/ }   P/ C! j% s9 k! X& N; ?4 A
/*0060*/
% r7 L- {, R  F7 D' Z4 Z) d/*0061*/ u16 MAL_GetStatus (u8 lun) 1 ]( C- a) T& f. p  ]
/*0062*/ { 3 v9 Y: ~  A% r6 u5 l
/*0063*/   if(lun == 0){ 6 X3 b& I3 |8 T  A# ]
/*0064*/     Mass_Block_Count[0] = FLASH_SIZE/FLASH_PAGE_SIZE; . @& O$ s" O, D$ k  l) T- I" C
/*0065*/     Mass_Block_Size[0] =  FLASH_PAGE_SIZE;
$ z* p1 W/ W+ g* I1 Y( ?+ v" n/*0066*/     Mass_Memory_Size[0] = FLASH_SIZE;
2 T# S! N2 p1 L4 M6 m9 t1 \/*0067*/     GPIO_SetBits(USB_LED_PORT, GPIO_Pin_7);
$ Y2 V; R. S0 B% Q! F/*0068*/     return MAL_OK;
! D6 c5 N$ _8 ]: W7 G/*0069*/   } 0 z" F4 E0 V# @8 V4 b5 n/ Q4 B
/*0070*/   GPIO_ResetBits(USB_LED_PORT, GPIO_Pin_7); ' ]) E/ x% b. V3 T& H% Q+ E/ ^. U
/*0071*/   return MAL_FAIL; 1 N9 q4 A, m$ K; z$ s
/*0072*/ } ' V! x' {, f9 i3 X% C. E, D7 c
/*0073*/

6 \( T* m/ r+ Y8 W2 K* o# d5 t# ~3 \  c3 Q2 B' I5 x
改好了之后文件的存储目标就变成了STM32的内部Flash6 l: e4 M' E5 Q. {. p, @! S
实际运行中还有一个问题,那就是在memory.c中Data_Buffer定义大小为512Bytes,这里我们的Flash是1K一页,要将Data_Buffer重新定义成1KBytes的3 ]" p  n1 i. {( o+ l9 w
u32 Data_Buffer[BULK_MAX_PACKET_SIZE *4]; /* 1024 bytes*/

5 y; Y. q0 z9 q$ ?" `1 s/ C编译好后烧到板子上,电脑会提示格式化磁盘,格式化后就可以像一般的U盘那样使用这个mini U盘了% g; X5 r3 s0 f/ H
虽然小了点,但是装个驱动程序、写点广告什么的还是够用了6 {# X! g' ^+ }& J
想要的文件放好后可以将写入Flash的代码去掉,这样可以避免用户修改内容" s" _0 D) R( R2 @; o, q
 
收藏 评论0 发布时间:2010-4-6 18:16

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版