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

正点原子Alientec Mini STM32ALIENTEK MINISTM32 USB读卡器实验

[复制链接]
天使♀的☆宇★翼 发布时间:2015-2-8 21:45
本帖最后由 天使♀的☆宇★翼 于 2015-3-4 20:42 编辑   t& M/ S/ S1 E; J# U, a+ W4 B$ m
! ~, Y# t) G1 N8 E1 v; W
正点原子Alientec Mini STM32ALIENTEK MINISTM32 USB读卡器实验

Mini板功能图

Mini板功能图
. @$ ?: J+ K* G/ h. I4 d$ u/ k
USB 读卡器简介
0 n  X; t6 {" x  \( ?  bALIENTEK MiniSTM32 开发板板载了 SD 卡读卡器,而 STM32F103 又有 USB,且在板上1 Y4 ]% R2 G; v" d  n
带有 USB 连接头,这样我们便可以通过 STM32 的 USB 来读写 SD 卡,从而实现一个 USB 读
9 p5 O0 S( G4 R1 l+ n$ Q9 m- ~卡器。+ X: q) m  O, j. O+ q% D8 O. v
USB 读卡器的实现最重要的有两个部分: USB 部分和 SD 卡部分。 USB 部分同上一节的差& ?/ q; O8 i! S  V- f. X& Z- I6 i( Z
不多,只是这一节我们的 STM32F103 被识别成一个大容量存储设备,而不是人体学输入设备。
! W# ~/ u' P. f6 ~& [SD 卡部分,最重要的就是 2 个函数,一个 MSD_WriteBuffer 函数,用于向 SD 卡写入数据,当
9 W( V3 c' \' p  o) P你要 COPY 文件到 SD 卡的时候,就是由这个函数完成的。另外一个是 MSD_ReadBuffer 函数,
6 J$ b- Y8 _, d" N6 V6 @; |该函数用于读取 SD 卡上面的数据。
* B9 d& O6 E, G5 a! H* F1 L5 g这里的数据并不需要经过文件系统处理,而是完全电脑控制,我们要做的就是读写 SD 卡
# ^/ ?, u$ P0 ?3 @, j/ e就够了。本实验我们也是参考 Mass_Storage 例程而来的,不过在 ST 提供的例程 Mass_Storage
. N& [2 R6 G% l! J! f里面,使用的是 SDIO 方式来读写 SD 卡的,而我们这里采用的是 SPI 方式读写,所以速度会
$ @* ?* e3 P+ r. H) C# O" K9 T) M比较慢一点。
7 R6 I+ ~+ \: @) F3.27.2  硬件设计) p( m" B4 E. v; ?2 d8 v! q/ D
本节实验功能简介:开机的时候先检测 SD 卡是否存在,如果不存在则等待 SD 卡插入,
5 G* M6 T" {# i/ G2 @# L同时在 LCD 上显示提示信息。在 SD 卡插入之后,就开始 USB 的配置,在配置成功之后既可+ @2 q5 p$ B( _5 U5 }, Y& u+ I
以在电脑上发现可移动磁盘了。我们用 DS1 来指示 USB 正在读写 SD 卡,并在液晶上显示出
9 \3 e! @" I- I& e来,同样我们还是用 DS0 来指示程序正在运行。$ c$ P: \/ h7 X( b5 x+ r; `
所要用到的硬件资源如下:
2 X. x3 ]) ~# I6 A1)STM32F103RBT6。: o5 R1 F6 b5 ]4 \- |
2)DS0、DS1(外部 LED0/LED1)。
! `1 l2 L* I) x) h: ?/ @2 }$ w3)TFTLCD 液晶模块。 5 x- P( N/ H& ^+ s; v, U5 R
4)SD 卡。 4 u4 P5 q% |+ H- l+ @! J3 m& ]
5)USB 接口。
  j$ ?5 h; G% F# A4 a$ J* V这几个部分,在之前的实例中都已经介绍过了,我们在此就不多说了。
* _9 y) w0 L9 B. [/ N3.27.3  软件设计
; Y  c3 P6 C5 i2 w6 e这一节,我们在实验 20 的基础上修改,先打开实验 18  的工程, 在 HARDWARE 文件夹所4 e$ }6 m" D, Z: [
在文件夹下新建一个 USB 的文件夹,然后在 USB 文件夹下面新建 LIB 和 CONFIG 文件夹,分# e3 E& M- a. B( n" `; X  X
别用来存放与 USB 核相关的代码以及配置部分代码。这两部分代码我们也不细说(因为 USB
- ~+ j' u* a  y4 u8 s部分我也没告通,仅是移植能用而已),这些代码都是从 ST 提供的例程 Mass_Storage 里面移植3 i4 a# C$ m2 `) q6 m! q
过来的。! d- O5 z) i5 e
然后,我们在工程文件里面新建 USB 和 USBCFG 组,分别加入 USB\LIB 下面的代码和
/ ?( _1 h1 A8 |# R* a, j+ hUSB\CONFIG 下面的代码。然后把 LIB 和 CONFIG 文件夹加入头文件包含路径。
$ S5 J7 \8 b# H在 test.c 里面,我们修改 main 函数如下:& c+ I  ]  H0 B: D- C
//bit0:表示电脑正在向 SD 卡写入数据
6 T7 e, _) u% }5 X+ A' \//bit1:表示电脑正从 SD 卡读出数据
8 U8 I2 _- W2 t+ |# Z9 q: S3 j7 y# N//bit2:SD 卡写数据错误标志位
6 O# P& b8 c  d9 [) {& m//bit3:SD 卡读数据错误标志位
: Q5 l! c/ q7 t; {0 B4 z! i# j//bit4:1,表示电脑有轮询操作(表明连接还保持着) ' L; o1 B( w7 }$ V9 k, B- M" [  U
429
$ J: X$ V1 w) h" |$ X1 r8 Iu8 Usb_Status_Reg=0;           
2 @, Z2 N0 g2 a6 o: b/ b! }int main(void)
) X! Z" U* K4 y2 l{     3 c5 P% Y( s+ m6 C% u
u8 offline_cnt=0;
5 j6 M) ]9 `9 M% _4 }+ Au8 tct=0;# O' _  q& F# }; Z
u8 USB_STA;
1 J4 Q+ W" e1 T  k4 r# ou8 Divece_STA;# c! g) h# S( A4 p8 J& E
long long sd_size;//当 SD 卡容量超过 4G 的时候,u32 不足以表示其容量大小.
8 X; K% w5 C$ A* zStm32_Clock_Init(9);//系统时钟设置
2 S. d! {" Y: Ydelay_init(72);    //延时初始化
6 C. X0 X! V. u8 m( Fuart_init(72,9600); //串口 1 初始化   0 [; P+ t2 F3 ~- S0 W
LCD_Init();      //初始化液晶   
* D8 W7 m$ t: T5 I- G9 B% K//KEY_Init();      //按键初始化
  v! k4 x& |# X; D! ?LED_Init();          //LED 初始化: M: p  R, f# V: _9 |' @7 g* y
POINT_COLOR=RED;//设置字体为蓝色
: c+ d  O  g; I& }LCD_ShowString(60,50,"Mini STM32");2 M& L. l; o  S& ~' T' ?5 ?* H
LCD_ShowString(60,70,"USB TEST");5 k$ {; \/ h, s& s- v: \2 U
LCD_ShowString(60,90,"ATOM@ALIENTEK");
- z4 S5 T! ^& z3 S% u( W' ELCD_ShowString(60,110,"2010/6/19");6 ?% W$ ]0 ^" d8 y& g) i; r
while(SD_Initialize())
' A$ D" [2 R& b8 c" M$ s# z- w{: K# d+ Q/ c; ~
LCD_ShowString(60,130,"SD Init ERR!");
) H: }# z9 K/ g5 y7 {/ |! ]2 udelay_ms(500);
6 g+ V( u  {. A$ k5 U6 ?8 iLCD_ShowString(60,130,"Please Check");& {" P+ D* h4 O7 ~
delay_ms(500);6 ?* J& Z8 D' w4 p. H
}                                    
1 Z" d+ u: n) c6 QLCD_ShowString(60,130,"SD Card Ready");    //提示 SD 卡已经准备了
8 ^1 Z1 X6 o. t$ ]( |( ^sd_size=(long long)SD_GetSectorCount()*512;    //得到 SD 卡容量,字节.
5 Y4 i2 i' n% N1 tMass_Memory_Size[0]=sd_size%4294967296;    //当 SD 卡容量超过 4G 的时候,7 ]' j0 r  }, e1 O$ {
//需要用到两个 u32 来表示
: B1 F+ o$ \' A- G& b) SMass_Memory_Size[1]=sd_size>>32;           //容量的高 32 位
# c# \, E' D0 a0 _, i1 n) |: D+ a# _Mass_Block_Size[0] =512;     ; T+ i/ e0 J  ^9 {2 t: Y7 ^
//因为我们在 Init 里面设置了 SD 卡的操作字节为 512 个,所以这里一定是 512 个字节.
0 ~& w7 _, s+ T3 Q3 O4 j3 wMass_Block_Count[0]=sd_size/Mass_Block_Size[0];  //得到扇区数% [  W, J% \- L, E- _) c
LCD_ShowString(60,150,"USB Connecting...");    //提示 SD 卡已经准备了 , o) ~4 F9 \% |+ _/ M
//USB 配置
# M& d/ c3 L& o, @USB_Interrupts_Config();    ! M. u, e! b0 B6 b
Set_USBClock();   ' M; ^' A9 Y4 A- v: [+ p  A9 T9 c
USB_Init();                           
9 `& i2 n2 K- u  B- W7 X% q) l9 M% B" Qwhile(1)
, _4 I2 N2 P* Q# a" m( I{) k5 p4 b4 V5 [& f4 M
delay_ms(1);
1 g3 E5 `$ b# ^7 [5 r+ h# F430, y: W# E; L! j. F
if(USB_STA!=Usb_Status_Reg)//状态改变了
5 F3 m' [, e# C6 Q{           * R8 b  O* I7 n) r6 l
LCD_ShowString(60,170,"               ");//清除
* {/ E/ G. l& Lif(Usb_Status_Reg&0x01)//正在写! G7 b3 t; J! Z* S( U: I
{. U& `- M5 ]' |; T
LCD_ShowString(60,170,"USB Writing...");//提示 USB 正在写入数据3 z$ \' N6 h2 D
}
7 q% b# B- q+ n! c9 qif(Usb_Status_Reg&0x02)//正在读
/ J/ |2 l* ?  X) I  W{
' R, f- D  p& z1 a6 j* I/ dLCD_ShowString(60,170,"USB Reading...");//提示 USB 正在读出数据8 X" U$ f0 R6 P4 t6 C2 H! W) l6 Z
}                   ' g* Q$ J) H  D4 Z- K1 V5 [$ W
if(Usb_Status_Reg&0x04)LCD_ShowString(60,190,"USB Write Err ");, X+ z2 Y* }4 Z& }/ K/ Y3 u
//提示写入错误
; {6 y# g$ ?, |, |0 Q$ w: P; t. uelse LCD_ShowString(60,190,"               ");//清除错误2 \( f' Q* y" |) {* |" Z  D% j
if(Usb_Status_Reg&0x08)LCD_ShowString(60,210,"USB Read   Err ");
- D! t8 i9 I" f. M8 `//提示读出错误# V+ P4 O) T8 p$ t( c/ _
else LCD_ShowString(60,210,"               ");//清除错误- r  G6 |. r: C( C, V2 E9 _, ?7 F
USB_STA=Usb_Status_Reg;//记录最后的状态
; ?( m. V8 b6 \/ M}; ], a; ^/ g; E( \  z
if(Divece_STA!=bDeviceState)
* [* D* }- \) e, K. r7 ^' I{
" q4 e/ M/ m6 E" y( y5 K' C" ]* ?if(bDeviceState==CONFIGURED)6 i4 }  J# B( B
LCD_ShowString(60,150,"USB Connected     ");//提示 USB 连接已经建立
) m6 e; \8 {) ]. b( Eelse LCD_ShowString(60,150,"USB DisConnected ");//提示 USB 被拔出了
* p& ~$ l% f4 ]: W) _! pDivece_STA=bDeviceState;- L4 a4 J% o) _# c2 x
}  ]+ Y, n: G5 [  T
tct++;
2 W6 D4 j# N6 ]2 i5 Xif(tct==200)+ b* i' |0 N7 L, y8 ]7 x: w
{
5 x3 H3 R! k- u9 [tct=0;
% H# v: r& v% G1 R5 Z4 ]% f! hLED0=!LED0;//提示系统在运行
) O0 c( u0 p: K9 F- d0 jif(Usb_Status_Reg&0x10)+ R: K2 m* y  k9 y4 e6 |% }+ P4 e
{
& I" x$ m1 ?; P4 Coffline_cnt=0;//USB 连接了,则清除 offline 计数器  a1 d. T, E2 Z, Y
bDeviceState=CONFIGURED;$ r% P( _' |, u/ u$ w7 |0 ?
}else//没有得到轮询
8 c, W+ |! J& |+ T) n{$ K! X' ~! @' p  b
offline_cnt++;  # r2 a! T: m( e! l6 _$ J" m' {  H
if(offline_cnt>10)bDeviceState=UNCONNECTED;
* a# _/ H2 t0 H% c9 c, h3 f//2s 内没收到在线标记,代表 USB 被拔出了0 R( T' b+ L/ |8 K& h
}
% R+ _+ ?: k+ T9 W5 u! XUsb_Status_Reg=0;' z' U4 A& `; u' Z& R2 F& ]9 R
} 2 {- ?$ K7 C8 L5 X+ O$ ~( j
431' C  k  U6 k, R3 s# F9 F
};         % C* j; k% _: E3 ^/ c* k8 a
}   2 e+ ^+ b# s3 a; Z3 y# D  {! Y
此部分代码就实现了我们之前在硬件设计部分描述的功能,这里我们用到了一个全局变量
" A5 P$ s8 I0 z/ PUsb_Status_Reg,用来标记 USB 的相关状态,这样我们就可以在液晶上显示当前 USB 的状态  \, e6 `1 r# j: }  ]" Z. U, {
了。# Z2 n: S7 ~# g% c: @7 d

/ D! g( |" u; a0 Y; |- _: _0 \- Q8 ]% O( X5 @

实验结果在显示屏上显示

实验结果在显示屏上显示
360截图20150208214404721.jpg
4 E: h, a7 d) {$ d- ^
, j0 a' T" z/ E! ?" R* u) F3 r& c9 I& E1 o/ H6 @  q. V& T
' X9 v5 M& ]9 D: {& f
; C0 E1 W, h7 I
" q6 P6 u3 x# a5 G9 X# J
赞 收藏 1 评论33 发布时间:2015-2-8 21:45

举报

33个回答
天使♀的☆宇★翼 回答时间:2015-3-4 22:29:08
阿斌99 发表于 2015-3-4 20:39
! n$ ]( m) P; d' O7 K0 w多谢楼主分享,支持支持,虽然有些看不太明白,算是小白吧

9 }, S) T4 T4 z' K没事儿,都是从小白开始的,我在大一也是小白,后来对这些感兴趣,就一步一步的学习,没关心,慢慢来,相信你能行
天使♀的☆宇★翼 回答时间:2015-3-4 22:06:21
beautiful阿朱 发表于 2015-3-4 21:44) J+ m3 x- u4 G
以前只用51单片机做过,不过效果不好,主要是因为MCU性能不好,正好来学习学习,家里有一块F4的板子,嘿嘿 ...

0 N7 a: A* M3 Z" H+ V6 G哈哈,没关系,大家一起相互讨论,相互学习
wamcncn 回答时间:2015-3-5 08:35:18
天使♀的☆宇★翼 发表于 2015-3-4 22:27
2 T1 Q* Y+ V! y# W6 K没事儿,用ST官方的板子,可以根据电路图以及硬件的连接位置,改动一些配置函数将程序一直过去就好了,其 ...
+ h1 d0 c: z% ~2 }2 w
呵呵,我就是通过外接学习的
wamcncn 回答时间:2015-2-9 08:26:50
学习了,只有核心板
MouseCat 回答时间:2015-2-9 08:33:05
收藏了谢谢分享
liam-2047208 回答时间:2015-2-9 10:00:49
呵呵         
阿里巴巴 回答时间:2015-2-9 10:20:03
aaaaaaaaa.jpg
埃斯提爱慕 回答时间:2015-2-9 16:52:14
提示: 作者被禁止或删除 内容自动屏蔽
lkl0305 回答时间:2015-2-9 20:58:37
多谢分享
123玄风夕韵 回答时间:2015-2-9 21:21:46
xfty7tkjguig9
阿斌99 回答时间:2015-3-4 20:39:08
多谢楼主分享,支持支持,虽然有些看不太明白,算是小白吧
beautiful阿朱 回答时间:2015-3-4 21:44:00
以前只用51单片机做过,不过效果不好,主要是因为MCU性能不好,正好来学习学习,家里有一块F4的板子,嘿嘿,支持一下
天使♀的☆宇★翼 回答时间:2015-3-4 22:27:28
wambob 发表于 2015-2-9 08:26' s" Y) b# ?( `" R9 D+ e
学习了,只有核心板

+ G) P' i6 J6 [, m没事儿,用ST官方的板子,可以根据电路图以及硬件的连接位置,改动一些配置函数将程序一直过去就好了,其实原理都差不多
天使♀的☆宇★翼 回答时间:2015-3-4 22:27:47
MouseCat 发表于 2015-2-9 08:33
, w- d( W- O! r" f收藏了谢谢分享

) _( H1 N0 ]( o* c8 s8 P( r不客气,以后多多讨论,互相学习啦
天使♀的☆宇★翼 回答时间:2015-3-4 22:36:34
MouseCat 发表于 2015-2-9 08:33
1 ~) N& m- R& E0 i5 w/ K  e, l% W收藏了谢谢分享
, t& z, k1 j- M. Z
不客气,以后有好的资料会马上分享的,以后有时间也会自己原创一些帖子发上来的,一起学习吧
123下一页

所属标签

相似技术帖

官网相关资源

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