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

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

[复制链接]
天使♀的☆宇★翼 发布时间:2015-2-8 21:45
本帖最后由 天使♀的☆宇★翼 于 2015-3-4 20:42 编辑
9 x4 z: h- P- K
$ `8 [  v& F7 G8 O/ l, _正点原子Alientec Mini STM32ALIENTEK MINISTM32 USB读卡器实验

Mini板功能图

Mini板功能图
% {, B; o! q$ K: b6 U4 J- T
USB 读卡器简介
! @5 O2 S  C3 p$ p5 h, sALIENTEK MiniSTM32 开发板板载了 SD 卡读卡器,而 STM32F103 又有 USB,且在板上+ o% `4 w/ t& W- J* B& N
带有 USB 连接头,这样我们便可以通过 STM32 的 USB 来读写 SD 卡,从而实现一个 USB 读
; P* W* I) |% V0 L2 G% ]9 _  _6 X卡器。
) W3 o* R* ]1 c- U3 gUSB 读卡器的实现最重要的有两个部分: USB 部分和 SD 卡部分。 USB 部分同上一节的差
: p! ?5 s6 C& l" R6 g' Z不多,只是这一节我们的 STM32F103 被识别成一个大容量存储设备,而不是人体学输入设备。( W; r; ^5 G, y: M
SD 卡部分,最重要的就是 2 个函数,一个 MSD_WriteBuffer 函数,用于向 SD 卡写入数据,当
+ t9 Y3 `& Z, S% H你要 COPY 文件到 SD 卡的时候,就是由这个函数完成的。另外一个是 MSD_ReadBuffer 函数,
% q! q5 O+ b5 ~( L4 A该函数用于读取 SD 卡上面的数据。4 L/ N# Q/ A: m/ z! Y
这里的数据并不需要经过文件系统处理,而是完全电脑控制,我们要做的就是读写 SD 卡
3 D9 n0 T# A1 l9 y# h! v就够了。本实验我们也是参考 Mass_Storage 例程而来的,不过在 ST 提供的例程 Mass_Storage' w+ G, X4 a  Q
里面,使用的是 SDIO 方式来读写 SD 卡的,而我们这里采用的是 SPI 方式读写,所以速度会4 ]# T# M, U. m. p. m0 p
比较慢一点。
; _# l. t/ u- H' H( _6 {3.27.2  硬件设计
- h3 b/ ]1 T  n6 G本节实验功能简介:开机的时候先检测 SD 卡是否存在,如果不存在则等待 SD 卡插入,
! J; B8 |4 v7 G0 ~/ f3 Y8 A& l, `同时在 LCD 上显示提示信息。在 SD 卡插入之后,就开始 USB 的配置,在配置成功之后既可$ ~( m, |1 k4 v
以在电脑上发现可移动磁盘了。我们用 DS1 来指示 USB 正在读写 SD 卡,并在液晶上显示出
2 C) q& C; e% t& ?# h来,同样我们还是用 DS0 来指示程序正在运行。, G' V) c2 f/ D5 [$ ]2 l0 Z- s
所要用到的硬件资源如下:
8 s4 Z4 t- B6 |3 M8 b1 U1)STM32F103RBT6。
# |6 D& H6 [% N2 d8 h5 P2)DS0、DS1(外部 LED0/LED1)。9 K+ R: ~; t6 g1 A/ w( [
3)TFTLCD 液晶模块。 9 q; @$ |! L- t$ Y; k$ `4 u
4)SD 卡。 " t4 \4 c5 w% M* g
5)USB 接口。 / a$ l* L& [; R7 t
这几个部分,在之前的实例中都已经介绍过了,我们在此就不多说了。
. M& q8 u) M* Q/ i6 Y- j3.27.3  软件设计
" d* P- }. A$ r6 m/ n, R& @3 t这一节,我们在实验 20 的基础上修改,先打开实验 18  的工程, 在 HARDWARE 文件夹所8 V4 J; d$ [# g5 L4 B* i7 o
在文件夹下新建一个 USB 的文件夹,然后在 USB 文件夹下面新建 LIB 和 CONFIG 文件夹,分
; q1 y7 W4 l+ ?别用来存放与 USB 核相关的代码以及配置部分代码。这两部分代码我们也不细说(因为 USB# x2 r# |7 @" V/ j, {
部分我也没告通,仅是移植能用而已),这些代码都是从 ST 提供的例程 Mass_Storage 里面移植) Y+ F* w9 @' ?- b5 Q; ~
过来的。
( B! [2 C  u: _( @/ g然后,我们在工程文件里面新建 USB 和 USBCFG 组,分别加入 USB\LIB 下面的代码和1 z8 ^9 p- r  r
USB\CONFIG 下面的代码。然后把 LIB 和 CONFIG 文件夹加入头文件包含路径。1 R: }' U! S# ^
在 test.c 里面,我们修改 main 函数如下:
) n8 @" ]; s8 N0 l//bit0:表示电脑正在向 SD 卡写入数据  n& r* m4 J, [8 M6 o! z
//bit1:表示电脑正从 SD 卡读出数据6 }& _  ^* e* Y4 k% W& Y0 R. b
//bit2:SD 卡写数据错误标志位
8 N- W! ?5 r1 o" @( k//bit3:SD 卡读数据错误标志位
3 g* T; C' \7 I) k8 e6 c//bit4:1,表示电脑有轮询操作(表明连接还保持着) * r! Y& z, v. ^
429
5 M: x+ B5 v4 o% j5 W/ [u8 Usb_Status_Reg=0;           9 n+ D, p& ?. u9 y7 D9 x1 p( e
int main(void)
* u& h; u6 V6 S  k% G( n' c{     ! \: Y. t. l+ m
u8 offline_cnt=0;5 V) Y- q- Q: p
u8 tct=0;
: H( }" M7 }! Eu8 USB_STA;# @0 g+ u% \+ Q1 E
u8 Divece_STA;2 X$ V( z3 H7 |6 }5 G5 `
long long sd_size;//当 SD 卡容量超过 4G 的时候,u32 不足以表示其容量大小.
, v  d& F8 f" }7 |' a( t/ L( B6 g1 yStm32_Clock_Init(9);//系统时钟设置! ~9 O- s, ^! K2 F) o7 h* N
delay_init(72);    //延时初始化! |, ^* C2 _& P0 N& E$ j1 p* c% u
uart_init(72,9600); //串口 1 初始化   
2 y- O9 }1 z0 {6 H. T' [LCD_Init();      //初始化液晶   $ O3 |: y9 O/ O
//KEY_Init();      //按键初始化
/ Y. h. ]* g' a& pLED_Init();          //LED 初始化
! ]2 r0 |. ]: O; K: ?POINT_COLOR=RED;//设置字体为蓝色
- Z8 P3 n2 d: [7 }# A" r  F# TLCD_ShowString(60,50,"Mini STM32");* L7 Y% e8 g( B- a
LCD_ShowString(60,70,"USB TEST");6 ^( A: Z1 S, W9 g3 c  s. Z( p
LCD_ShowString(60,90,"ATOM@ALIENTEK");+ ~- I" M' o' q
LCD_ShowString(60,110,"2010/6/19");$ W3 [8 V' H" V" T
while(SD_Initialize()); R4 M& e2 U! P. @
{4 I* \' m8 Y1 t3 x7 ?6 h, |
LCD_ShowString(60,130,"SD Init ERR!");
) W2 J  o: |  }# e5 hdelay_ms(500);
5 X5 l2 f2 v2 C4 mLCD_ShowString(60,130,"Please Check");  S/ z! w# C9 l1 q: l5 W+ F
delay_ms(500);$ X. U) y, M+ N! G
}                                    
& }) F  f- b& I8 v7 P$ mLCD_ShowString(60,130,"SD Card Ready");    //提示 SD 卡已经准备了! |+ X( m1 H! b, t0 Y: q
sd_size=(long long)SD_GetSectorCount()*512;    //得到 SD 卡容量,字节.$ B9 e  N& P9 _/ X  v9 R' I' i
Mass_Memory_Size[0]=sd_size%4294967296;    //当 SD 卡容量超过 4G 的时候,/ w  I. A" ?2 ~. {+ Q$ C8 h# e) Y- @
//需要用到两个 u32 来表示8 r8 z; I- B: t, V- r( a
Mass_Memory_Size[1]=sd_size>>32;           //容量的高 32 位
& k, G& x. D  [) Q& U) I9 C. z, @Mass_Block_Size[0] =512;     ) D8 P* i# V2 ?( V' h5 |9 S- U
//因为我们在 Init 里面设置了 SD 卡的操作字节为 512 个,所以这里一定是 512 个字节.
- D9 \! ?, G3 a1 {" vMass_Block_Count[0]=sd_size/Mass_Block_Size[0];  //得到扇区数2 [% l: o( X7 \1 S9 y3 @& u
LCD_ShowString(60,150,"USB Connecting...");    //提示 SD 卡已经准备了 . J8 \4 j5 D- }7 E* H+ n
//USB 配置  U0 n; J# ^# }& q
USB_Interrupts_Config();   
9 O9 P! f1 Y2 K) n& e  }8 U; NSet_USBClock();   , Q& }0 O: W; R
USB_Init();                           
- K/ u9 N( A( b% _: P8 g+ \; F6 Zwhile(1)
7 G" q0 x2 n/ i7 R{9 x4 I; b: ?5 [7 s- O7 c2 H( q
delay_ms(1); 0 e2 [: W" j# E. r4 h, G
4305 F9 M5 ?: `8 o& L, ^. ^
if(USB_STA!=Usb_Status_Reg)//状态改变了
$ y# |; E* q- q/ ~; g5 A- _7 ~{           
8 I% D; c6 b; m) [6 aLCD_ShowString(60,170,"               ");//清除5 ]9 b+ W! l1 P) T" \/ w
if(Usb_Status_Reg&0x01)//正在写
. a& y. u4 E" V8 {5 }& c{2 j4 z  b8 w" Z$ @: [4 w
LCD_ShowString(60,170,"USB Writing...");//提示 USB 正在写入数据
+ ?% v2 P. Q* E9 |}
5 z% h+ N3 L) i6 g% E- }; K5 A7 ^if(Usb_Status_Reg&0x02)//正在读
: I* y- H& b1 S' }$ }4 l, g{2 y+ y& H/ A- w0 X( j
LCD_ShowString(60,170,"USB Reading...");//提示 USB 正在读出数据4 [* ^+ Q4 Z+ M
}                  
' {9 _; g4 S; p- kif(Usb_Status_Reg&0x04)LCD_ShowString(60,190,"USB Write Err ");
, l' Q! R6 C) @* q' _6 Y; W* _" P//提示写入错误( b0 d: }( ?3 I# a, n7 s7 I
else LCD_ShowString(60,190,"               ");//清除错误
& i! a, u8 @6 \* o# uif(Usb_Status_Reg&0x08)LCD_ShowString(60,210,"USB Read   Err ");. p- I/ k, q$ I) x6 x
//提示读出错误- @+ }. l/ ?, }; Y& _
else LCD_ShowString(60,210,"               ");//清除错误
' N. z% j, s3 x1 M( f( ?  `) FUSB_STA=Usb_Status_Reg;//记录最后的状态
: m# P/ Y+ R$ A1 b}
2 r+ ]2 b' M) A  b( F9 [4 c" _8 n7 zif(Divece_STA!=bDeviceState) 6 y2 N, R* y' {+ C" z0 [( A
{
: s* y6 `" ~: [4 Z9 v4 ~; B& S1 |if(bDeviceState==CONFIGURED)& N7 f6 _$ l* R, c' z) C2 ]& z3 U: {
LCD_ShowString(60,150,"USB Connected     ");//提示 USB 连接已经建立! t' ~1 O% {# x& S* j' {5 u# ^
else LCD_ShowString(60,150,"USB DisConnected ");//提示 USB 被拔出了
) y0 K  K7 y! HDivece_STA=bDeviceState;
  j1 o# G! k) p: f; ^( B}5 |$ u8 E; N! k, ?0 @7 \  P
tct++;
$ Z. w# M+ o' K% e3 v- w/ v  E# E/ ]  Dif(tct==200)7 ?* P' z7 t2 e+ o& a: B8 J! O4 R2 b$ I- b
{, W+ O% t/ u9 g3 l6 Y) D
tct=0;8 x; y! q% z& q, \! C
LED0=!LED0;//提示系统在运行
# o* X, ^) U7 o. o# ^1 p7 Jif(Usb_Status_Reg&0x10)
; u1 M3 N- |1 T& x- T& k{
6 ^; g2 l0 e- z: e* W$ r. s& Z4 Soffline_cnt=0;//USB 连接了,则清除 offline 计数器/ c! Y- b  s  d
bDeviceState=CONFIGURED;
' h! G' v7 o  }}else//没有得到轮询
9 }) `7 Q. f  a{; Y, l& P, y# V
offline_cnt++;  , g' W0 Z/ c. C4 r6 b
if(offline_cnt>10)bDeviceState=UNCONNECTED;) W- [/ d, d: h2 L5 P, y
//2s 内没收到在线标记,代表 USB 被拔出了2 U& O! k5 ^1 \8 C4 K. D0 ?
}2 k% v1 D- E/ ]+ v$ ~7 V( t
Usb_Status_Reg=0;4 ~: Z( @. i: n* J# I) X. E* x; w
} ) F; ~* o! H, G- Y0 l
431) i+ x7 M2 ?- |+ [0 R9 u0 q/ H$ W
};         ; _, }- y9 d6 b. W; x" T9 {
}   
1 r! m; [* x* U4 u8 ^) W此部分代码就实现了我们之前在硬件设计部分描述的功能,这里我们用到了一个全局变量( i4 E, i: y( i: _# i# l
Usb_Status_Reg,用来标记 USB 的相关状态,这样我们就可以在液晶上显示当前 USB 的状态
" N% F' e& f1 D. o( k了。% E% R6 h5 E6 ?1 A, |
; |! ~7 q" `$ _
+ w" t' }9 N* @! _1 d

实验结果在显示屏上显示

实验结果在显示屏上显示
360截图20150208214404721.jpg 3 v# ]6 p9 q" w% ?! b, K5 l
5 E# }3 f; n  \$ c. k7 A  G9 Y
- G4 @% k8 C0 K: L

; i* Y7 u) u4 \$ {. C+ K. z' `2 E& b' Y4 b% {3 h1 z! a
0 _/ `. b* z2 b5 I+ o2 I2 [; o: t
收藏 1 评论33 发布时间:2015-2-8 21:45

举报

33个回答
天使♀的☆宇★翼 回答时间:2015-3-4 22:29:08
阿斌99 发表于 2015-3-4 20:39
5 [4 O" b1 S2 Z/ n4 ?. v多谢楼主分享,支持支持,虽然有些看不太明白,算是小白吧
4 v8 Y# b+ O6 g: V
没事儿,都是从小白开始的,我在大一也是小白,后来对这些感兴趣,就一步一步的学习,没关心,慢慢来,相信你能行
天使♀的☆宇★翼 回答时间:2015-3-4 22:06:21
beautiful阿朱 发表于 2015-3-4 21:44
% x/ ?- e) Q0 ^) ^6 r6 z: W以前只用51单片机做过,不过效果不好,主要是因为MCU性能不好,正好来学习学习,家里有一块F4的板子,嘿嘿 ...

: m  r; B* s! Z7 ]: t$ C: w/ C哈哈,没关系,大家一起相互讨论,相互学习
wamcncn 回答时间:2015-3-5 08:35:18
天使♀的☆宇★翼 发表于 2015-3-4 22:27
' ?8 E( F* s$ p+ K$ D/ j8 ^$ {没事儿,用ST官方的板子,可以根据电路图以及硬件的连接位置,改动一些配置函数将程序一直过去就好了,其 ...
0 F( I0 Q/ t, p% U" k; y* w; h
呵呵,我就是通过外接学习的
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
5 z% B$ ]8 F6 z0 Z! D8 i学习了,只有核心板

: P: Q) m; t- r$ I  w0 v没事儿,用ST官方的板子,可以根据电路图以及硬件的连接位置,改动一些配置函数将程序一直过去就好了,其实原理都差不多
天使♀的☆宇★翼 回答时间:2015-3-4 22:27:47
MouseCat 发表于 2015-2-9 08:33
3 E, L; o/ x% G! x7 X& c+ z收藏了谢谢分享
% K3 \0 c1 ?0 K% s8 V& o
不客气,以后多多讨论,互相学习啦
天使♀的☆宇★翼 回答时间:2015-3-4 22:36:34
MouseCat 发表于 2015-2-9 08:33* [1 `# Q% J5 y, Q( I5 ]2 w
收藏了谢谢分享

! r, u& r$ f4 n- W. l' a5 j: {: ]不客气,以后有好的资料会马上分享的,以后有时间也会自己原创一些帖子发上来的,一起学习吧
123下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版