
本帖最后由 天使♀的☆宇★翼 于 2015-3-4 20:42 编辑 正点原子Alientec Mini STM32ALIENTEK MINISTM32 USB读卡器实验 Miniæ¿åè½å¾ ![]() USB 读卡器简介 ALIENTEK MiniSTM32 开发板板载了 SD 卡读卡器,而 STM32F103 又有 USB,且在板上( D M& k/ C' e2 ? 带有 USB 连接头,这样我们便可以通过 STM32 的 USB 来读写 SD 卡,从而实现一个 USB 读5 N0 R2 G1 r/ ] 卡器。 USB 读卡器的实现最重要的有两个部分: USB 部分和 SD 卡部分。 USB 部分同上一节的差! B' v k- J# n. ?% V n$ b 不多,只是这一节我们的 STM32F103 被识别成一个大容量存储设备,而不是人体学输入设备。 SD 卡部分,最重要的就是 2 个函数,一个 MSD_WriteBuffer 函数,用于向 SD 卡写入数据,当7 s0 c) A! e9 E6 p 你要 COPY 文件到 SD 卡的时候,就是由这个函数完成的。另外一个是 MSD_ReadBuffer 函数, 该函数用于读取 SD 卡上面的数据。 这里的数据并不需要经过文件系统处理,而是完全电脑控制,我们要做的就是读写 SD 卡 就够了。本实验我们也是参考 Mass_Storage 例程而来的,不过在 ST 提供的例程 Mass_Storage 里面,使用的是 SDIO 方式来读写 SD 卡的,而我们这里采用的是 SPI 方式读写,所以速度会 比较慢一点。 3.27.2 硬件设计 本节实验功能简介:开机的时候先检测 SD 卡是否存在,如果不存在则等待 SD 卡插入,/ H$ ~: f6 W& f: o+ M: p D 同时在 LCD 上显示提示信息。在 SD 卡插入之后,就开始 USB 的配置,在配置成功之后既可 以在电脑上发现可移动磁盘了。我们用 DS1 来指示 USB 正在读写 SD 卡,并在液晶上显示出" u, ?: V: T L% ` 来,同样我们还是用 DS0 来指示程序正在运行。 所要用到的硬件资源如下: 1)STM32F103RBT6。 2)DS0、DS1(外部 LED0/LED1)。 3)TFTLCD 液晶模块。 4)SD 卡。 5)USB 接口。 这几个部分,在之前的实例中都已经介绍过了,我们在此就不多说了。9 ^ E* a% U6 p/ N& i: E! I* y 3.27.3 软件设计/ }4 u+ I; g6 V: D* o9 H 这一节,我们在实验 20 的基础上修改,先打开实验 18 的工程, 在 HARDWARE 文件夹所 在文件夹下新建一个 USB 的文件夹,然后在 USB 文件夹下面新建 LIB 和 CONFIG 文件夹,分: {5 V" z3 q: b6 h9 Z/ K8 B4 K 别用来存放与 USB 核相关的代码以及配置部分代码。这两部分代码我们也不细说(因为 USB 部分我也没告通,仅是移植能用而已),这些代码都是从 ST 提供的例程 Mass_Storage 里面移植 过来的。 然后,我们在工程文件里面新建 USB 和 USBCFG 组,分别加入 USB\LIB 下面的代码和- g$ y( R& p9 F M9 V USB\CONFIG 下面的代码。然后把 LIB 和 CONFIG 文件夹加入头文件包含路径。5 ?/ J% v: D7 r9 r 在 test.c 里面,我们修改 main 函数如下: //bit0:表示电脑正在向 SD 卡写入数据( z, k2 X( J* |9 x //bit1:表示电脑正从 SD 卡读出数据 //bit2:SD 卡写数据错误标志位1 C' g2 I7 j( N/ V( g9 ` //bit3:SD 卡读数据错误标志位1 X/ |7 s) T0 A1 k* n //bit4:1,表示电脑有轮询操作(表明连接还保持着) 429; |$ J0 a/ S9 a/ c1 f8 ~- }/ C, n u8 Usb_Status_Reg=0; int main(void) { u8 offline_cnt=0; u8 tct=0;2 Q' r0 L5 M. T# w" h, D u8 USB_STA; u8 Divece_STA;8 M4 R4 N, H( b) r+ c1 a5 } long long sd_size;//当 SD 卡容量超过 4G 的时候,u32 不足以表示其容量大小. Stm32_Clock_Init(9);//系统时钟设置. R- J2 F& S( O8 |( k1 \* ] delay_init(72); //延时初始化 uart_init(72,9600); //串口 1 初始化 LCD_Init(); //初始化液晶 //KEY_Init(); //按键初始化 LED_Init(); //LED 初始化 POINT_COLOR=RED;//设置字体为蓝色 $ i. M& N" U& R0 W8 s LCD_ShowString(60,50,"Mini STM32"); LCD_ShowString(60,70,"USB TEST"); LCD_ShowString(60,90,"ATOM@ALIENTEK"); LCD_ShowString(60,110,"2010/6/19");! ?; [2 S* e% N. w# N6 t while(SD_Initialize()) {: R+ ~. ^- d7 p) Z* b LCD_ShowString(60,130,"SD Init ERR!");, U0 n1 t9 `) |7 Q' k( m } delay_ms(500); LCD_ShowString(60,130,"Please Check");$ I7 G N0 |' T1 ^5 |' ]' z1 ` delay_ms(500); } LCD_ShowString(60,130,"SD Card Ready"); //提示 SD 卡已经准备了 sd_size=(long long)SD_GetSectorCount()*512; //得到 SD 卡容量,字节. Mass_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 配置 USB_Interrupts_Config(); Set_USBClock(); 5 p% z: e/ o! }! F) J USB_Init(); # j' d+ |$ s( F while(1) {; W& Z$ @% }' s& V# O delay_ms(1); 430 if(USB_STA!=Usb_Status_Reg)//状态改变了 { 8 a9 ] @& e; i0 L LCD_ShowString(60,170," ");//清除 if(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 正在写入数据 }4 Q8 ?: t% V& v if(Usb_Status_Reg&0x02)//正在读 {7 M; C8 s; @9 ~1 N: W LCD_ShowString(60,170,"USB Reading...");//提示 USB 正在读出数据: v) t9 \! U# t. ?4 k: S } if(Usb_Status_Reg&0x04)LCD_ShowString(60,190,"USB Write Err "); //提示写入错误 else 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 } if(Divece_STA!=bDeviceState) 8 \- `3 W8 `4 @/ L1 l7 s2 q$ A { if(bDeviceState==CONFIGURED) LCD_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; LED0=!LED0;//提示系统在运行0 f: d6 d4 N% O2 A- j if(Usb_Status_Reg&0x10) { offline_cnt=0;//USB 连接了,则清除 offline 计数器 bDeviceState=CONFIGURED; }else//没有得到轮询 {- D& a# l2 q- p6 l offline_cnt++; if(offline_cnt>10)bDeviceState=UNCONNECTED;) o, e/ Y( z: z" D- Z& t //2s 内没收到在线标记,代表 USB 被拔出了 }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 此部分代码就实现了我们之前在硬件设计部分描述的功能,这里我们用到了一个全局变量 Usb_Status_Reg,用来标记 USB 的相关状态,这样我们就可以在液晶上显示当前 USB 的状态 了。7 F+ D$ f1 P# H ! o8 C* @* N1 r9 ]; l/ R 9 \6 d7 c8 i! d, k( G* Y& D å®éªç»æå¨æ¾ç¤ºå±ä¸æ¾ç¤º ![]() ![]() ; R2 G- |' }; X# N" `% u 4 k) f: \% ^0 [3 N s : r6 i/ h5 ~( S9 o+ n |
最全USB HID开发资料,悉心整理一个月,亲自测试
实战经验 | 选择USBX模块生成USB CDC ACM无PD的项目
STM32 USB HID键盘例程
刘氓兔的杂谈【001】-片上USB 高速PHY
【经验分享】在进行 USB CDC 类开发时,无法发送 64整数倍的数据
【源码】STLINK-V3MINI 高速USB仿真器,成功改刷【高速CMSIS-DAP】
在线直播|无需编写任何代码即可在STM32上实现USB-C Power Delivery
STM32 USB CDC 虚拟多串口
圈圈发布USB图书第二版有感,以及分享一些我学习USB过程...
USB Audio设计与实现
没事儿,都是从小白开始的,我在大一也是小白,后来对这些感兴趣,就一步一步的学习,没关心,慢慢来,相信你能行
哈哈,没关系,大家一起相互讨论,相互学习
呵呵,我就是通过外接学习的
没事儿,用ST官方的板子,可以根据电路图以及硬件的连接位置,改动一些配置函数将程序一直过去就好了,其实原理都差不多
不客气,以后多多讨论,互相学习啦
不客气,以后有好的资料会马上分享的,以后有时间也会自己原创一些帖子发上来的,一起学习吧