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

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

[复制链接]
天使♀的☆宇★翼 发布时间:2015-2-8 21:45
本帖最后由 天使♀的☆宇★翼 于 2015-3-4 20:42 编辑 ) ], t8 ]2 x' c" ~, e

  F, {. ^( m; q  c7 h5 S正点原子Alientec Mini STM32ALIENTEK MINISTM32 USB读卡器实验

Mini板功能图

Mini板功能图
/ g6 o! I  h4 r4 E
USB 读卡器简介
5 |( N: c9 n5 HALIENTEK MiniSTM32 开发板板载了 SD 卡读卡器,而 STM32F103 又有 USB,且在板上
  P4 j$ ?8 j9 B& c带有 USB 连接头,这样我们便可以通过 STM32 的 USB 来读写 SD 卡,从而实现一个 USB 读) f9 l! E9 s: H4 b* ^
卡器。
  e/ z5 F- z  {6 nUSB 读卡器的实现最重要的有两个部分: USB 部分和 SD 卡部分。 USB 部分同上一节的差; W5 v, S2 I9 z0 b% F2 O' v
不多,只是这一节我们的 STM32F103 被识别成一个大容量存储设备,而不是人体学输入设备。2 _9 p' Z6 E! o3 g
SD 卡部分,最重要的就是 2 个函数,一个 MSD_WriteBuffer 函数,用于向 SD 卡写入数据,当0 s9 d9 C# f7 b$ R: y# j/ Z% G, i
你要 COPY 文件到 SD 卡的时候,就是由这个函数完成的。另外一个是 MSD_ReadBuffer 函数,
( B* h% D1 O/ y3 D/ `; {该函数用于读取 SD 卡上面的数据。
5 W9 ?) a9 X) f9 D# F% m这里的数据并不需要经过文件系统处理,而是完全电脑控制,我们要做的就是读写 SD 卡
: n5 W( I% p) H2 p就够了。本实验我们也是参考 Mass_Storage 例程而来的,不过在 ST 提供的例程 Mass_Storage; V" j" y; ^$ g5 R8 D( j$ _3 [
里面,使用的是 SDIO 方式来读写 SD 卡的,而我们这里采用的是 SPI 方式读写,所以速度会
# Y  e3 K! [4 o$ i! o/ n比较慢一点。/ V8 H1 Y9 n; G
3.27.2  硬件设计
6 ^9 |3 y, Z& i4 R7 W9 D3 s本节实验功能简介:开机的时候先检测 SD 卡是否存在,如果不存在则等待 SD 卡插入,8 h. g3 V+ d6 k, H& S; Q) T
同时在 LCD 上显示提示信息。在 SD 卡插入之后,就开始 USB 的配置,在配置成功之后既可
- A% V) p) l3 G: H4 L+ x以在电脑上发现可移动磁盘了。我们用 DS1 来指示 USB 正在读写 SD 卡,并在液晶上显示出$ O. H' `: P  z( P
来,同样我们还是用 DS0 来指示程序正在运行。
8 G0 r+ J7 E9 |4 ?! t  x所要用到的硬件资源如下:
+ }  \" h9 [$ J, u1)STM32F103RBT6。
  u( g, c$ m0 N0 C6 V$ Z2)DS0、DS1(外部 LED0/LED1)。" Y* u5 T9 ^7 J+ N/ I( Q* e; B$ o
3)TFTLCD 液晶模块。
1 Z1 B% ]$ r5 q  M5 {. P+ K4)SD 卡。
' F% S5 }0 B' ~5 n& f- V" L8 |7 K5)USB 接口。
) f1 W) b3 u2 F0 ]  _这几个部分,在之前的实例中都已经介绍过了,我们在此就不多说了。, M9 L7 I/ J+ N# Q- |
3.27.3  软件设计  h. Q& q/ |/ B
这一节,我们在实验 20 的基础上修改,先打开实验 18  的工程, 在 HARDWARE 文件夹所8 B; x2 U; P3 E; V, F9 F
在文件夹下新建一个 USB 的文件夹,然后在 USB 文件夹下面新建 LIB 和 CONFIG 文件夹,分/ ]4 H6 n7 c- X; c; _# O
别用来存放与 USB 核相关的代码以及配置部分代码。这两部分代码我们也不细说(因为 USB
8 C: d  G2 M, Y% t+ u5 Z: D9 o部分我也没告通,仅是移植能用而已),这些代码都是从 ST 提供的例程 Mass_Storage 里面移植
, W5 Z! t* c6 Q1 `& B5 d过来的。
% T1 g) B' ]' c: j8 o4 W/ ^. R- _然后,我们在工程文件里面新建 USB 和 USBCFG 组,分别加入 USB\LIB 下面的代码和
( p3 [' `5 ?# j$ a6 c) g- OUSB\CONFIG 下面的代码。然后把 LIB 和 CONFIG 文件夹加入头文件包含路径。
1 k1 G$ d( H8 O! Y在 test.c 里面,我们修改 main 函数如下:
9 \6 v7 F# o$ t+ O//bit0:表示电脑正在向 SD 卡写入数据
9 S3 {- Y. z& G# l2 g//bit1:表示电脑正从 SD 卡读出数据7 I+ Z# s& M2 T7 C: z$ r( w/ e
//bit2:SD 卡写数据错误标志位9 x& E, N/ j5 s
//bit3:SD 卡读数据错误标志位
& [9 U- j! U5 w* k& ]1 E/ e//bit4:1,表示电脑有轮询操作(表明连接还保持着)
; U: w- S7 X2 w9 d' {- w429- J2 h7 ~% ]! J& L; G& j6 X" j
u8 Usb_Status_Reg=0;           ( b0 v0 {% X  K$ ~( V9 ^
int main(void)& z! s. J' a! R9 v2 S
{     
' {* m2 x+ s& \u8 offline_cnt=0;
# k" t5 Y2 Y# ?- du8 tct=0;( \! P. [) q0 v
u8 USB_STA;" J  P8 p+ _2 h( d! E% Y
u8 Divece_STA;- C! d: y, h4 ]1 V; i' K
long long sd_size;//当 SD 卡容量超过 4G 的时候,u32 不足以表示其容量大小.2 z& }9 b% @; L2 i( h: L) l
Stm32_Clock_Init(9);//系统时钟设置
( ~9 m3 t, C, c: r: Gdelay_init(72);    //延时初始化! Y) k0 p6 D4 x* Y& V- J
uart_init(72,9600); //串口 1 初始化   
2 e" Y0 R1 d4 ~/ C& I) `LCD_Init();      //初始化液晶   - G& b, I  b, M0 e! C
//KEY_Init();      //按键初始化
1 c8 h0 ^, _; p( o' N7 ]$ @7 HLED_Init();          //LED 初始化
  ?  d4 u( `" l1 j  X- o1 v6 b$ MPOINT_COLOR=RED;//设置字体为蓝色
6 t' d+ k4 @* A! K* q9 [1 ALCD_ShowString(60,50,"Mini STM32");
' R% l$ w3 M: B9 vLCD_ShowString(60,70,"USB TEST");0 `* A, h$ y$ r# A# H% f, R
LCD_ShowString(60,90,"ATOM@ALIENTEK");
6 y. e9 C6 L: K: JLCD_ShowString(60,110,"2010/6/19");
4 Q- `+ @2 E/ A8 ?# [/ }5 H0 Dwhile(SD_Initialize())3 C. u' C1 r$ O" I
{, Q5 Y2 t1 A# x6 P
LCD_ShowString(60,130,"SD Init ERR!");" {9 @0 [( Z# [5 F/ `9 e
delay_ms(500);- w" X7 G: _) `0 s( c) y0 a& t+ }
LCD_ShowString(60,130,"Please Check");
# Y. n" |7 U3 p" M: jdelay_ms(500);
/ P4 w: b  s( i}                                    
+ f- j) V2 Q5 s) k4 g+ G. bLCD_ShowString(60,130,"SD Card Ready");    //提示 SD 卡已经准备了
. O1 Y& @1 @0 A4 ?( D! K; m* Fsd_size=(long long)SD_GetSectorCount()*512;    //得到 SD 卡容量,字节.+ u& c4 W' L/ U7 R: C+ F
Mass_Memory_Size[0]=sd_size%4294967296;    //当 SD 卡容量超过 4G 的时候,+ I3 M( ~# Z! K2 }
//需要用到两个 u32 来表示
/ _5 I6 {4 `% M  rMass_Memory_Size[1]=sd_size>>32;           //容量的高 32 位
0 s4 |  z* b8 m. q' i% Y1 _2 G- v" W) ]Mass_Block_Size[0] =512;     " m5 x' ^' n/ q- e
//因为我们在 Init 里面设置了 SD 卡的操作字节为 512 个,所以这里一定是 512 个字节.
  F* A" m# \3 y( |' lMass_Block_Count[0]=sd_size/Mass_Block_Size[0];  //得到扇区数5 y0 r3 S! F3 h
LCD_ShowString(60,150,"USB Connecting...");    //提示 SD 卡已经准备了
, l  j0 }/ |" S; }: x//USB 配置- m$ y( C: V3 C4 }+ N& ^
USB_Interrupts_Config();   
5 c5 Y* |- ]* |2 xSet_USBClock();   
2 k* _, T. M9 l- _% k8 c* bUSB_Init();                           7 _0 o9 f- q  k( B- |) c
while(1)
# x6 [% Q- {4 X3 J9 J) A+ M/ A( ~{
0 f# L" v9 g/ \" O2 bdelay_ms(1); + ]# C9 ]4 C& T: \8 c" v) v) G
430
$ u: u* o. R. ?: O% fif(USB_STA!=Usb_Status_Reg)//状态改变了; B4 S+ m+ N7 i: w/ ]% W3 ?, `: ]
{           
7 y; M3 e4 s8 v0 Z3 GLCD_ShowString(60,170,"               ");//清除
$ `' t" h6 r2 i/ P9 \; T6 Fif(Usb_Status_Reg&0x01)//正在写: M8 b; R; ]( y9 b# _' ]
{
/ \! ?# M2 S. Q: M$ dLCD_ShowString(60,170,"USB Writing...");//提示 USB 正在写入数据
, p2 W0 A. S7 Y. M6 o' j  N2 s}; w5 H* q* J8 ], g6 {$ r4 D4 O
if(Usb_Status_Reg&0x02)//正在读
5 H8 ?  d0 ~' R" e" S. O{
9 R, {) y5 |; c7 |6 E# {0 KLCD_ShowString(60,170,"USB Reading...");//提示 USB 正在读出数据
0 i5 f+ ^/ W  i+ E, C}                   6 \9 h) D4 a- s% r( S
if(Usb_Status_Reg&0x04)LCD_ShowString(60,190,"USB Write Err ");
/ G) }) f: Y" G//提示写入错误4 F5 W4 v3 F$ o+ e3 m: M( l; [
else LCD_ShowString(60,190,"               ");//清除错误) i' G, G; e* u* k/ |
if(Usb_Status_Reg&0x08)LCD_ShowString(60,210,"USB Read   Err ");* s4 T" J( {- j: c0 \8 D
//提示读出错误
( Q# l, }* A% b6 H7 E) C1 Zelse LCD_ShowString(60,210,"               ");//清除错误
. t" Q* V" {2 L! Z2 ]USB_STA=Usb_Status_Reg;//记录最后的状态
* i" J; p1 {+ {! J}4 Q( u5 w3 H$ n: y
if(Divece_STA!=bDeviceState) $ x  Z3 u9 g7 W) Y
{
) K5 M! U4 U& k; P3 a* ?; Dif(bDeviceState==CONFIGURED)
' E$ F7 g8 I* @5 m8 _! y0 c) K, k1 D9 dLCD_ShowString(60,150,"USB Connected     ");//提示 USB 连接已经建立) ?! M* l' i1 k+ Q2 a) H* J7 p# q
else LCD_ShowString(60,150,"USB DisConnected ");//提示 USB 被拔出了
: \9 I6 b, B3 nDivece_STA=bDeviceState;3 U* _7 @. Q3 d
}" D. J: l6 ]' M. Y, M* o9 j3 T( [3 }
tct++;# a0 h* Q4 _, f! m% W
if(tct==200)
0 w1 E0 k% J/ z8 O6 ~" I9 g{
, Z( d- o* y3 j* l! O: y( C; n$ \9 Ftct=0;- L( G  q. S  _1 a3 X
LED0=!LED0;//提示系统在运行
& b8 A# A* d5 i# }" X( Yif(Usb_Status_Reg&0x10)
$ o; T. z7 r3 t* V{1 B1 Q0 R% A' A9 F0 w" V$ x0 O
offline_cnt=0;//USB 连接了,则清除 offline 计数器: v# A* t# A9 |1 t- a; S$ M5 p
bDeviceState=CONFIGURED;
- s) `+ \* p& U+ L# w}else//没有得到轮询
9 U$ p  s3 d7 y2 K{
7 _. M( e2 D8 V  [" z. |offline_cnt++;  1 i0 l0 n0 ^% G& `1 l5 |
if(offline_cnt>10)bDeviceState=UNCONNECTED;, g. A7 g$ a( M  G
//2s 内没收到在线标记,代表 USB 被拔出了
8 N/ O1 y1 _* Y: `}
. \1 W  H/ C1 _  ^" r5 oUsb_Status_Reg=0;7 O  _# a+ e5 l: m6 i; ]: ?
}
  [, K9 }% Q( H3 r' g+ W5 Y3 d# s431- H+ y2 M5 R1 B  h
};         ) S/ a% F2 f7 Q8 X% z5 P5 y; J
}   7 G: B2 A7 `+ S- d/ \
此部分代码就实现了我们之前在硬件设计部分描述的功能,这里我们用到了一个全局变量4 c- T" i* R* |2 O5 N8 k7 q
Usb_Status_Reg,用来标记 USB 的相关状态,这样我们就可以在液晶上显示当前 USB 的状态
1 Q7 x! S/ z; d9 d1 r了。
- w' p% X" \/ Y1 e! m
9 F. f0 |) [0 X. w7 m& j, G: S" `$ D) ^" f8 V0 _+ [  ~

实验结果在显示屏上显示

实验结果在显示屏上显示
360截图20150208214404721.jpg * C9 ~5 W& k0 h  r( M1 J5 V

# N9 L+ _3 }# E) a4 \/ d% M
7 n' j% i, X; f  G
: `1 A; A, u" m9 t  K0 ]0 I1 K2 J: x

* g1 B! u9 s0 M1 h
赞 收藏 1 评论33 发布时间:2015-2-8 21:45

举报

33个回答
天使♀的☆宇★翼 回答时间:2015-3-4 22:29:08
阿斌99 发表于 2015-3-4 20:39
: y" ~6 E0 ^. ]: E, w7 S6 B多谢楼主分享,支持支持,虽然有些看不太明白,算是小白吧

, [, ?: c) O# q9 X5 H" C) H$ C9 b没事儿,都是从小白开始的,我在大一也是小白,后来对这些感兴趣,就一步一步的学习,没关心,慢慢来,相信你能行
天使♀的☆宇★翼 回答时间:2015-3-4 22:06:21
beautiful阿朱 发表于 2015-3-4 21:44& N, P( K- y- b: P8 T& u
以前只用51单片机做过,不过效果不好,主要是因为MCU性能不好,正好来学习学习,家里有一块F4的板子,嘿嘿 ...
+ b1 Y0 H9 S" r# V. {. k6 J7 W* b: _
哈哈,没关系,大家一起相互讨论,相互学习
wamcncn 回答时间:2015-3-5 08:35:18
天使♀的☆宇★翼 发表于 2015-3-4 22:272 g" U; X$ Y( V1 [1 p6 {5 b
没事儿,用ST官方的板子,可以根据电路图以及硬件的连接位置,改动一些配置函数将程序一直过去就好了,其 ...
4 _: c! v  z1 X
呵呵,我就是通过外接学习的
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
% R/ \; u6 S6 t9 Y7 z/ {学习了,只有核心板

: l% t7 w+ b2 d2 E* _- q% y) n没事儿,用ST官方的板子,可以根据电路图以及硬件的连接位置,改动一些配置函数将程序一直过去就好了,其实原理都差不多
天使♀的☆宇★翼 回答时间:2015-3-4 22:27:47
MouseCat 发表于 2015-2-9 08:33
' a0 |$ F0 M6 a2 E5 r; B- f收藏了谢谢分享
; @4 H' y7 _" _* p" A) N' m
不客气,以后多多讨论,互相学习啦
天使♀的☆宇★翼 回答时间:2015-3-4 22:36:34
MouseCat 发表于 2015-2-9 08:33" b- U) u) Y2 x) B
收藏了谢谢分享

- ^& H9 `- a% o1 t1 j: E不客气,以后有好的资料会马上分享的,以后有时间也会自己原创一些帖子发上来的,一起学习吧
123下一页

所属标签

相似技术帖

官网相关资源

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