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

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

[复制链接]
天使♀的☆宇★翼 发布时间:2015-2-8 21:45
本帖最后由 天使♀的☆宇★翼 于 2015-3-4 20:42 编辑
+ \8 g/ G. e; r" z7 w3 H" k- h
8 ^3 z% Z+ b+ \/ z( c5 W6 o正点原子Alientec Mini STM32ALIENTEK MINISTM32 USB读卡器实验

Mini板功能图

Mini板功能图

6 |- s( z  l1 e5 D& aUSB 读卡器简介
3 `' G; F' ^& e" W7 Y5 CALIENTEK MiniSTM32 开发板板载了 SD 卡读卡器,而 STM32F103 又有 USB,且在板上( D  M& k/ C' e2 ?
带有 USB 连接头,这样我们便可以通过 STM32 的 USB 来读写 SD 卡,从而实现一个 USB 读5 N0 R2 G1 r/ ]
卡器。
7 U6 N: Q% |7 J2 l8 LUSB 读卡器的实现最重要的有两个部分: USB 部分和 SD 卡部分。 USB 部分同上一节的差! B' v  k- J# n. ?% V  n$ b
不多,只是这一节我们的 STM32F103 被识别成一个大容量存储设备,而不是人体学输入设备。
+ a; ~0 F$ y0 P5 N+ l$ k, CSD 卡部分,最重要的就是 2 个函数,一个 MSD_WriteBuffer 函数,用于向 SD 卡写入数据,当7 s0 c) A! e9 E6 p
你要 COPY 文件到 SD 卡的时候,就是由这个函数完成的。另外一个是 MSD_ReadBuffer 函数,
4 [/ n  `8 T. H该函数用于读取 SD 卡上面的数据。
2 c! ]& N4 Y% }" e这里的数据并不需要经过文件系统处理,而是完全电脑控制,我们要做的就是读写 SD 卡
2 L2 H; p. d4 [7 J- J5 S8 F就够了。本实验我们也是参考 Mass_Storage 例程而来的,不过在 ST 提供的例程 Mass_Storage
. |7 V$ d6 O* \  R2 t里面,使用的是 SDIO 方式来读写 SD 卡的,而我们这里采用的是 SPI 方式读写,所以速度会
; K: n, l0 H2 z8 p, j/ ?1 q8 W比较慢一点。
" R: N7 r" \9 \8 m+ K2 t3.27.2  硬件设计
# V6 w+ X3 [' L& l7 }本节实验功能简介:开机的时候先检测 SD 卡是否存在,如果不存在则等待 SD 卡插入,/ H$ ~: f6 W& f: o+ M: p  D
同时在 LCD 上显示提示信息。在 SD 卡插入之后,就开始 USB 的配置,在配置成功之后既可
6 P3 F4 o+ j9 a. W, `$ M& ]" e% Q* C以在电脑上发现可移动磁盘了。我们用 DS1 来指示 USB 正在读写 SD 卡,并在液晶上显示出" u, ?: V: T  L% `
来,同样我们还是用 DS0 来指示程序正在运行。
& b8 D' s% i, T5 Z* A所要用到的硬件资源如下:
+ d( d& U% b# r) i6 l' `% L1)STM32F103RBT6。
& ^) ]$ V1 M- ^0 s, u0 {3 h2)DS0、DS1(外部 LED0/LED1)。
, |& i4 j6 a7 o* u% a6 Z3)TFTLCD 液晶模块。
9 E6 J+ e* v! R& h4)SD 卡。
' d& T; Q# L; p. [1 E5)USB 接口。
2 ]1 E' o+ V0 }: q4 j" ~7 T1 _这几个部分,在之前的实例中都已经介绍过了,我们在此就不多说了。9 ^  E* a% U6 p/ N& i: E! I* y
3.27.3  软件设计/ }4 u+ I; g6 V: D* o9 H
这一节,我们在实验 20 的基础上修改,先打开实验 18  的工程, 在 HARDWARE 文件夹所
5 F+ L1 x/ D4 ]) J: Y+ A; L0 g) y在文件夹下新建一个 USB 的文件夹,然后在 USB 文件夹下面新建 LIB 和 CONFIG 文件夹,分: {5 V" z3 q: b6 h9 Z/ K8 B4 K
别用来存放与 USB 核相关的代码以及配置部分代码。这两部分代码我们也不细说(因为 USB
- |6 X8 h8 c/ J+ C! O( v部分我也没告通,仅是移植能用而已),这些代码都是从 ST 提供的例程 Mass_Storage 里面移植
  D$ a: w, f% [; E% W过来的。
) w/ T5 a6 I, ^9 b; E  |然后,我们在工程文件里面新建 USB 和 USBCFG 组,分别加入 USB\LIB 下面的代码和- g$ y( R& p9 F  M9 V
USB\CONFIG 下面的代码。然后把 LIB 和 CONFIG 文件夹加入头文件包含路径。5 ?/ J% v: D7 r9 r
在 test.c 里面,我们修改 main 函数如下:
/ b. _6 d" q  p; ~//bit0:表示电脑正在向 SD 卡写入数据( z, k2 X( J* |9 x
//bit1:表示电脑正从 SD 卡读出数据
+ D! f' e0 R0 d# F//bit2:SD 卡写数据错误标志位1 C' g2 I7 j( N/ V( g9 `
//bit3:SD 卡读数据错误标志位1 X/ |7 s) T0 A1 k* n
//bit4:1,表示电脑有轮询操作(表明连接还保持着)
" h& a' y: m6 c3 V9 A429; |$ J0 a/ S9 a/ c1 f8 ~- }/ C, n
u8 Usb_Status_Reg=0;           
+ H# \" J8 U2 V; hint main(void)
( G: P6 L# Z4 m, r$ R0 Y{     
, U% ?/ N3 J' [8 W7 qu8 offline_cnt=0;
3 W6 [, ~/ q3 O, }. [" {+ ?, ~u8 tct=0;2 Q' r0 L5 M. T# w" h, D
u8 USB_STA;
+ U  }% R& c# Q2 M6 ]: z# Au8 Divece_STA;8 M4 R4 N, H( b) r+ c1 a5 }
long long sd_size;//当 SD 卡容量超过 4G 的时候,u32 不足以表示其容量大小.
9 J- G, b' ^8 l0 w: u. a+ Q8 wStm32_Clock_Init(9);//系统时钟设置. R- J2 F& S( O8 |( k1 \* ]
delay_init(72);    //延时初始化
1 ]/ q4 x8 H" m7 `& W9 Y$ S' \* l- Uuart_init(72,9600); //串口 1 初始化   
/ C; V' f% {3 k' KLCD_Init();      //初始化液晶   
# x  t1 @7 W; c- ?//KEY_Init();      //按键初始化
+ }. Q7 a' M7 u5 oLED_Init();          //LED 初始化
+ W' j# f/ h8 ~( j8 \. P; gPOINT_COLOR=RED;//设置字体为蓝色 $ i. M& N" U& R0 W8 s
LCD_ShowString(60,50,"Mini STM32");
) s8 @& O- F, _* o# K$ D1 y/ fLCD_ShowString(60,70,"USB TEST");
( p! D- Z  P, B6 cLCD_ShowString(60,90,"ATOM@ALIENTEK");
7 S. c+ \! S& ^. u3 n' eLCD_ShowString(60,110,"2010/6/19");! ?; [2 S* e% N. w# N6 t
while(SD_Initialize())
# [7 q" g% \2 }3 _: R) J5 ?{: R+ ~. ^- d7 p) Z* b
LCD_ShowString(60,130,"SD Init ERR!");, U0 n1 t9 `) |7 Q' k( m  }
delay_ms(500);
4 ^4 o) A7 O% L! b, |8 mLCD_ShowString(60,130,"Please Check");$ I7 G  N0 |' T1 ^5 |' ]' z1 `
delay_ms(500);
6 d+ A* W! C; N- U" O}                                    
3 J* d' n5 Q% v) d4 v8 w8 bLCD_ShowString(60,130,"SD Card Ready");    //提示 SD 卡已经准备了
$ n& z5 W3 t, P4 dsd_size=(long long)SD_GetSectorCount()*512;    //得到 SD 卡容量,字节.
" G6 p7 u+ y/ Y4 O9 wMass_Memory_Size[0]=sd_size%4294967296;    //当 SD 卡容量超过 4G 的时候,3 L4 a4 f/ P4 t6 r( L3 J; ^- O; r% _
//需要用到两个 u32 来表示5 [8 `: W# |: u8 \2 S3 O; o6 ^
Mass_Memory_Size[1]=sd_size>>32;           //容量的高 32 位/ `6 ?1 X: k) x. V) `% F
Mass_Block_Size[0] =512;     3 P; u8 {6 @7 n
//因为我们在 Init 里面设置了 SD 卡的操作字节为 512 个,所以这里一定是 512 个字节.. R6 l9 G/ s& m
Mass_Block_Count[0]=sd_size/Mass_Block_Size[0];  //得到扇区数0 ~+ w$ Y8 d+ j# y2 o* B0 ^
LCD_ShowString(60,150,"USB Connecting...");    //提示 SD 卡已经准备了 1 r) K7 @6 L3 u7 [
//USB 配置
( l. |3 |. ?1 bUSB_Interrupts_Config();   
7 K# o, g, |5 @  Y/ w* U) H4 Z, H( {Set_USBClock();   5 p% z: e/ o! }! F) J
USB_Init();                           # j' d+ |$ s( F
while(1)
' Q; D: l. I- O  h{; W& Z$ @% }' s& V# O
delay_ms(1);
: d/ e+ Y& j: Q! ?; I" ]4 A* S430
! ]- Q+ i) z9 T$ d3 Iif(USB_STA!=Usb_Status_Reg)//状态改变了
' W* ~3 j" X8 f- q- [8 O{           8 a9 ]  @& e; i0 L
LCD_ShowString(60,170,"               ");//清除
+ Z) _" R" i% ^* ~  Wif(Usb_Status_Reg&0x01)//正在写- E0 r& v) D5 T1 W0 ~
{2 o3 m8 C: U. N+ q  x$ S- {/ W
LCD_ShowString(60,170,"USB Writing...");//提示 USB 正在写入数据
6 ]1 F" e) a, f% _" j}4 Q8 ?: t% V& v
if(Usb_Status_Reg&0x02)//正在读
; X, @9 m5 _! S1 _4 H{7 M; C8 s; @9 ~1 N: W
LCD_ShowString(60,170,"USB Reading...");//提示 USB 正在读出数据: v) t9 \! U# t. ?4 k: S
}                  
. z+ r5 K4 A  P) B- }; kif(Usb_Status_Reg&0x04)LCD_ShowString(60,190,"USB Write Err ");
1 C4 S+ l) M8 y; q7 m: \1 o& F4 e//提示写入错误
, F" v) ~  U% z' [- uelse LCD_ShowString(60,190,"               ");//清除错误  b& ]4 I9 d7 f, G6 ^( B3 v. D
if(Usb_Status_Reg&0x08)LCD_ShowString(60,210,"USB Read   Err ");/ E" Q) z3 ~3 l- e( O# ?
//提示读出错误% H6 C  _& \6 C( Y- u- d
else LCD_ShowString(60,210,"               ");//清除错误2 H7 o8 W! c  o$ i
USB_STA=Usb_Status_Reg;//记录最后的状态- ^' y0 o9 h  y6 |1 v6 p0 N# d
}
4 G$ v/ i+ s7 Gif(Divece_STA!=bDeviceState) 8 \- `3 W8 `4 @/ L1 l7 s2 q$ A
{
2 t3 F0 O4 ?3 |- eif(bDeviceState==CONFIGURED)
$ y4 P" V0 C  b3 JLCD_ShowString(60,150,"USB Connected     ");//提示 USB 连接已经建立: O; ]7 v1 x) N  f1 R6 ^
else LCD_ShowString(60,150,"USB DisConnected ");//提示 USB 被拔出了" v9 f7 |$ k" r# w
Divece_STA=bDeviceState;* S! _: ^4 B' A* Z, f( V& i
}/ X" j8 Q6 h+ U1 W
tct++;0 t3 c1 p- j4 a$ P6 ^' t2 Z3 o; s7 b: J
if(tct==200)2 {+ v- E6 }  @) a! s; F
{9 A" v2 C3 c) @5 T
tct=0;
" t# v8 C# a* y9 \+ Q6 b# [LED0=!LED0;//提示系统在运行0 f: d6 d4 N% O2 A- j
if(Usb_Status_Reg&0x10)
" m0 a% ~/ u$ W- i{
0 N$ P; D1 n% yoffline_cnt=0;//USB 连接了,则清除 offline 计数器
$ I, F" E& p6 I4 M. o" s5 @$ HbDeviceState=CONFIGURED;
4 c  t$ P/ v6 {0 R1 ?  E}else//没有得到轮询
! k$ L" }) _" R{- D& a# l2 q- p6 l
offline_cnt++;  
6 }! n9 g0 X, ~3 v0 Y& Eif(offline_cnt>10)bDeviceState=UNCONNECTED;) o, e/ Y( z: z" D- Z& t
//2s 内没收到在线标记,代表 USB 被拔出了
( O- ?' o5 q/ W}2 y0 S/ Y8 {5 B* @( U+ a  \
Usb_Status_Reg=0;3 ]% e0 \+ }% T% S
}   W, ]2 a8 f* b$ W: R* p4 Y
431: ]+ G7 f. [2 m- W, Q* W; N
};         - k8 _8 }$ [0 X
}   ( z4 {7 n3 r) b7 I' \' P
此部分代码就实现了我们之前在硬件设计部分描述的功能,这里我们用到了一个全局变量
/ f3 M% Q: g$ Z; G, pUsb_Status_Reg,用来标记 USB 的相关状态,这样我们就可以在液晶上显示当前 USB 的状态
& ?- L+ [3 U! ]) c3 N' u了。7 F+ D$ f1 P# H
! o8 C* @* N1 r9 ]; l/ R
9 \6 d7 c8 i! d, k( G* Y& D

实验结果在显示屏上显示

实验结果在显示屏上显示
360截图20150208214404721.jpg : J) [* o& B4 t3 U% \8 ~
; R2 G- |' }; X# N" `% u
4 k) f: \% ^0 [3 N  s
: r6 i/ h5 ~( S9 o+ n

$ M8 q, L* O6 _
2 u9 |0 [! Q- d9 f. S: [
收藏 1 评论33 发布时间:2015-2-8 21:45

举报

33个回答
天使♀的☆宇★翼 回答时间:2015-3-4 22:29:08
阿斌99 发表于 2015-3-4 20:396 z- k" @2 ]' d1 i
多谢楼主分享,支持支持,虽然有些看不太明白,算是小白吧

1 k) O4 I4 J! W) R. ^$ C, C& T没事儿,都是从小白开始的,我在大一也是小白,后来对这些感兴趣,就一步一步的学习,没关心,慢慢来,相信你能行
天使♀的☆宇★翼 回答时间:2015-3-4 22:06:21
beautiful阿朱 发表于 2015-3-4 21:441 o5 ]) g) I7 j6 ?& r" G5 m
以前只用51单片机做过,不过效果不好,主要是因为MCU性能不好,正好来学习学习,家里有一块F4的板子,嘿嘿 ...
* `( ~# S+ o, X" }1 G
哈哈,没关系,大家一起相互讨论,相互学习
wamcncn 回答时间:2015-3-5 08:35:18
天使♀的☆宇★翼 发表于 2015-3-4 22:276 B" T) B8 c* z; s
没事儿,用ST官方的板子,可以根据电路图以及硬件的连接位置,改动一些配置函数将程序一直过去就好了,其 ...
5 j2 ~/ n) p  s8 J
呵呵,我就是通过外接学习的
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+ a' t1 q3 u4 M- w
学习了,只有核心板

8 l3 Q6 _, b. |& K6 Y+ b) ]- L+ B: n没事儿,用ST官方的板子,可以根据电路图以及硬件的连接位置,改动一些配置函数将程序一直过去就好了,其实原理都差不多
天使♀的☆宇★翼 回答时间:2015-3-4 22:27:47
MouseCat 发表于 2015-2-9 08:33
1 r  c! c6 {/ a% H' X4 U: J& H* u收藏了谢谢分享
% i3 M8 Q/ {, {
不客气,以后多多讨论,互相学习啦
天使♀的☆宇★翼 回答时间:2015-3-4 22:36:34
MouseCat 发表于 2015-2-9 08:336 s* v! @( e% v6 c" \
收藏了谢谢分享

+ B5 [; i" b0 a% H3 u1 U; k不客气,以后有好的资料会马上分享的,以后有时间也会自己原创一些帖子发上来的,一起学习吧
123下一页

所属标签

相似分享

官网相关资源

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