|
本帖最后由 天使♀的☆宇★翼 于 2015-3-4 20:42 编辑 ) ], t8 ]2 x' c" ~, e 正点原子Alientec Mini STM32ALIENTEK MINISTM32 USB读卡器实验 Miniæ¿åè½å¾
USB 读卡器简介 ALIENTEK MiniSTM32 开发板板载了 SD 卡读卡器,而 STM32F103 又有 USB,且在板上 带有 USB 连接头,这样我们便可以通过 STM32 的 USB 来读写 SD 卡,从而实现一个 USB 读) f9 l! E9 s: H4 b* ^ 卡器。 USB 读卡器的实现最重要的有两个部分: 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 函数, 该函数用于读取 SD 卡上面的数据。 这里的数据并不需要经过文件系统处理,而是完全电脑控制,我们要做的就是读写 SD 卡 就够了。本实验我们也是参考 Mass_Storage 例程而来的,不过在 ST 提供的例程 Mass_Storage; V" j" y; ^$ g5 R8 D( j$ _3 [ 里面,使用的是 SDIO 方式来读写 SD 卡的,而我们这里采用的是 SPI 方式读写,所以速度会 比较慢一点。/ V8 H1 Y9 n; G 3.27.2 硬件设计 本节实验功能简介:开机的时候先检测 SD 卡是否存在,如果不存在则等待 SD 卡插入,8 h. g3 V+ d6 k, H& S; Q) T 同时在 LCD 上显示提示信息。在 SD 卡插入之后,就开始 USB 的配置,在配置成功之后既可 以在电脑上发现可移动磁盘了。我们用 DS1 来指示 USB 正在读写 SD 卡,并在液晶上显示出$ O. H' `: P z( P 来,同样我们还是用 DS0 来指示程序正在运行。 所要用到的硬件资源如下: 1)STM32F103RBT6。 2)DS0、DS1(外部 LED0/LED1)。" Y* u5 T9 ^7 J+ N/ I( Q* e; B$ o 3)TFTLCD 液晶模块。 4)SD 卡。 5)USB 接口。 这几个部分,在之前的实例中都已经介绍过了,我们在此就不多说了。, 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 部分我也没告通,仅是移植能用而已),这些代码都是从 ST 提供的例程 Mass_Storage 里面移植 过来的。 然后,我们在工程文件里面新建 USB 和 USBCFG 组,分别加入 USB\LIB 下面的代码和 USB\CONFIG 下面的代码。然后把 LIB 和 CONFIG 文件夹加入头文件包含路径。 在 test.c 里面,我们修改 main 函数如下: //bit0:表示电脑正在向 SD 卡写入数据 //bit1:表示电脑正从 SD 卡读出数据7 I+ Z# s& M2 T7 C: z$ r( w/ e //bit2:SD 卡写数据错误标志位9 x& E, N/ j5 s //bit3:SD 卡读数据错误标志位 //bit4:1,表示电脑有轮询操作(表明连接还保持着) 429- 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 { u8 offline_cnt=0; u8 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);//系统时钟设置 delay_init(72); //延时初始化! Y) k0 p6 D4 x* Y& V- J uart_init(72,9600); //串口 1 初始化 LCD_Init(); //初始化液晶 - G& b, I b, M0 e! C //KEY_Init(); //按键初始化 LED_Init(); //LED 初始化 POINT_COLOR=RED;//设置字体为蓝色 LCD_ShowString(60,50,"Mini STM32"); LCD_ShowString(60,70,"USB TEST");0 `* A, h$ y$ r# A# H% f, R LCD_ShowString(60,90,"ATOM@ALIENTEK"); LCD_ShowString(60,110,"2010/6/19"); while(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"); delay_ms(500); } LCD_ShowString(60,130,"SD Card Ready"); //提示 SD 卡已经准备了 sd_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 来表示 Mass_Memory_Size[1]=sd_size>>32; //容量的高 32 位 Mass_Block_Size[0] =512; " m5 x' ^' n/ q- e //因为我们在 Init 里面设置了 SD 卡的操作字节为 512 个,所以这里一定是 512 个字节. Mass_Block_Count[0]=sd_size/Mass_Block_Size[0]; //得到扇区数5 y0 r3 S! F3 h LCD_ShowString(60,150,"USB Connecting..."); //提示 SD 卡已经准备了 //USB 配置- m$ y( C: V3 C4 }+ N& ^ USB_Interrupts_Config(); Set_USBClock(); USB_Init(); 7 _0 o9 f- q k( B- |) c while(1) { delay_ms(1); + ]# C9 ]4 C& T: \8 c" v) v) G 430 if(USB_STA!=Usb_Status_Reg)//状态改变了; B4 S+ m+ N7 i: w/ ]% W3 ?, `: ] { LCD_ShowString(60,170," ");//清除 if(Usb_Status_Reg&0x01)//正在写: M8 b; R; ]( y9 b# _' ] { LCD_ShowString(60,170,"USB Writing...");//提示 USB 正在写入数据 }; w5 H* q* J8 ], g6 {$ r4 D4 O if(Usb_Status_Reg&0x02)//正在读 { LCD_ShowString(60,170,"USB Reading...");//提示 USB 正在读出数据 } 6 \9 h) D4 a- s% r( S if(Usb_Status_Reg&0x04)LCD_ShowString(60,190,"USB Write Err "); //提示写入错误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 //提示读出错误 else LCD_ShowString(60,210," ");//清除错误 USB_STA=Usb_Status_Reg;//记录最后的状态 }4 Q( u5 w3 H$ n: y if(Divece_STA!=bDeviceState) $ x Z3 u9 g7 W) Y { if(bDeviceState==CONFIGURED) LCD_ShowString(60,150,"USB Connected ");//提示 USB 连接已经建立) ?! M* l' i1 k+ Q2 a) H* J7 p# q else LCD_ShowString(60,150,"USB DisConnected ");//提示 USB 被拔出了 Divece_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) { tct=0;- L( G q. S _1 a3 X LED0=!LED0;//提示系统在运行 if(Usb_Status_Reg&0x10) {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; }else//没有得到轮询 { offline_cnt++; 1 i0 l0 n0 ^% G& `1 l5 | if(offline_cnt>10)bDeviceState=UNCONNECTED;, g. A7 g$ a( M G //2s 内没收到在线标记,代表 USB 被拔出了 } Usb_Status_Reg=0;7 O _# a+ e5 l: m6 i; ]: ? } 431- 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 的状态 了。 , G: S" `$ D) ^" f8 V0 _+ [ ~ å®éªç»æå¨æ¾ç¤ºå±ä¸æ¾ç¤º
0 ]0 I1 K2 J: x |
最全USB HID开发资料,悉心整理一个月,亲自测试
【源码】STLINK-V3MINI 高速USB仿真器,成功改刷【高速CMSIS-DAP】
STM32 USB CDC 虚拟多串口
实战经验 | 选择USBX模块生成USB CDC ACM无PD的项目
STM32 USB HID键盘例程
刘氓兔的杂谈【001】-片上USB 高速PHY
【经验分享】在进行 USB CDC 类开发时,无法发送 64整数倍的数据
在线直播|无需编写任何代码即可在STM32上实现USB-C Power Delivery
圈圈发布USB图书第二版有感,以及分享一些我学习USB过程...
USB Audio设计与实现
微信公众号
手机版
没事儿,都是从小白开始的,我在大一也是小白,后来对这些感兴趣,就一步一步的学习,没关心,慢慢来,相信你能行
哈哈,没关系,大家一起相互讨论,相互学习
呵呵,我就是通过外接学习的
没事儿,用ST官方的板子,可以根据电路图以及硬件的连接位置,改动一些配置函数将程序一直过去就好了,其实原理都差不多
不客气,以后多多讨论,互相学习啦
不客气,以后有好的资料会马上分享的,以后有时间也会自己原创一些帖子发上来的,一起学习吧