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

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

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

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

Mini板功能图

Mini板功能图

USB 读卡器简介
ALIENTEK MiniSTM32 开发板板载了 SD 卡读卡器,而 STM32F103 又有 USB,且在板上
带有 USB 连接头,这样我们便可以通过 STM32 的 USB 来读写 SD 卡,从而实现一个 USB 读
卡器。
USB 读卡器的实现最重要的有两个部分: USB 部分和 SD 卡部分。 USB 部分同上一节的差
不多,只是这一节我们的 STM32F103 被识别成一个大容量存储设备,而不是人体学输入设备。
SD 卡部分,最重要的就是 2 个函数,一个 MSD_WriteBuffer 函数,用于向 SD 卡写入数据,当
你要 COPY 文件到 SD 卡的时候,就是由这个函数完成的。另外一个是 MSD_ReadBuffer 函数,
该函数用于读取 SD 卡上面的数据。
这里的数据并不需要经过文件系统处理,而是完全电脑控制,我们要做的就是读写 SD 卡
就够了。本实验我们也是参考 Mass_Storage 例程而来的,不过在 ST 提供的例程 Mass_Storage
里面,使用的是 SDIO 方式来读写 SD 卡的,而我们这里采用的是 SPI 方式读写,所以速度会
比较慢一点。
3.27.2  硬件设计
本节实验功能简介:开机的时候先检测 SD 卡是否存在,如果不存在则等待 SD 卡插入,
同时在 LCD 上显示提示信息。在 SD 卡插入之后,就开始 USB 的配置,在配置成功之后既可
以在电脑上发现可移动磁盘了。我们用 DS1 来指示 USB 正在读写 SD 卡,并在液晶上显示出
来,同样我们还是用 DS0 来指示程序正在运行。
所要用到的硬件资源如下:
1)STM32F103RBT6。
2)DS0、DS1(外部 LED0/LED1)。
3)TFTLCD 液晶模块。
4)SD 卡。
5)USB 接口。
这几个部分,在之前的实例中都已经介绍过了,我们在此就不多说了。
3.27.3  软件设计
这一节,我们在实验 20 的基础上修改,先打开实验 18  的工程, 在 HARDWARE 文件夹所
在文件夹下新建一个 USB 的文件夹,然后在 USB 文件夹下面新建 LIB 和 CONFIG 文件夹,分
别用来存放与 USB 核相关的代码以及配置部分代码。这两部分代码我们也不细说(因为 USB
部分我也没告通,仅是移植能用而已),这些代码都是从 ST 提供的例程 Mass_Storage 里面移植
过来的。
然后,我们在工程文件里面新建 USB 和 USBCFG 组,分别加入 USB\LIB 下面的代码和
USB\CONFIG 下面的代码。然后把 LIB 和 CONFIG 文件夹加入头文件包含路径。
在 test.c 里面,我们修改 main 函数如下:
//bit0:表示电脑正在向 SD 卡写入数据
//bit1:表示电脑正从 SD 卡读出数据
//bit2:SD 卡写数据错误标志位
//bit3:SD 卡读数据错误标志位
//bit4:1,表示电脑有轮询操作(表明连接还保持着)
429
u8 Usb_Status_Reg=0;           
int main(void)
{     
u8 offline_cnt=0;
u8 tct=0;
u8 USB_STA;
u8 Divece_STA;
long long sd_size;//当 SD 卡容量超过 4G 的时候,u32 不足以表示其容量大小.
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72);    //延时初始化
uart_init(72,9600); //串口 1 初始化   
LCD_Init();      //初始化液晶   
//KEY_Init();      //按键初始化
LED_Init();          //LED 初始化
POINT_COLOR=RED;//设置字体为蓝色
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");
while(SD_Initialize())
{
LCD_ShowString(60,130,"SD Init ERR!");
delay_ms(500);
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 卡容量,字节.
Mass_Memory_Size[0]=sd_size%4294967296;    //当 SD 卡容量超过 4G 的时候,
//需要用到两个 u32 来表示
Mass_Memory_Size[1]=sd_size>>32;           //容量的高 32 位
Mass_Block_Size[0] =512;     
//因为我们在 Init 里面设置了 SD 卡的操作字节为 512 个,所以这里一定是 512 个字节.
Mass_Block_Count[0]=sd_size/Mass_Block_Size[0];  //得到扇区数
LCD_ShowString(60,150,"USB Connecting...");    //提示 SD 卡已经准备了
//USB 配置
USB_Interrupts_Config();   
Set_USBClock();   
USB_Init();                           
while(1)
{
delay_ms(1);
430
if(USB_STA!=Usb_Status_Reg)//状态改变了
{           
LCD_ShowString(60,170,"               ");//清除
if(Usb_Status_Reg&0x01)//正在写
{
LCD_ShowString(60,170,"USB Writing...");//提示 USB 正在写入数据
}
if(Usb_Status_Reg&0x02)//正在读
{
LCD_ShowString(60,170,"USB Reading...");//提示 USB 正在读出数据
}                  
if(Usb_Status_Reg&0x04)LCD_ShowString(60,190,"USB Write Err ");
//提示写入错误
else LCD_ShowString(60,190,"               ");//清除错误
if(Usb_Status_Reg&0x08)LCD_ShowString(60,210,"USB Read   Err ");
//提示读出错误
else LCD_ShowString(60,210,"               ");//清除错误
USB_STA=Usb_Status_Reg;//记录最后的状态
}
if(Divece_STA!=bDeviceState)
{
if(bDeviceState==CONFIGURED)
LCD_ShowString(60,150,"USB Connected     ");//提示 USB 连接已经建立
else LCD_ShowString(60,150,"USB DisConnected ");//提示 USB 被拔出了
Divece_STA=bDeviceState;
}
tct++;
if(tct==200)
{
tct=0;
LED0=!LED0;//提示系统在运行
if(Usb_Status_Reg&0x10)
{
offline_cnt=0;//USB 连接了,则清除 offline 计数器
bDeviceState=CONFIGURED;
}else//没有得到轮询
{
offline_cnt++;  
if(offline_cnt>10)bDeviceState=UNCONNECTED;
//2s 内没收到在线标记,代表 USB 被拔出了
}
Usb_Status_Reg=0;
}
431
};         
}   
此部分代码就实现了我们之前在硬件设计部分描述的功能,这里我们用到了一个全局变量
Usb_Status_Reg,用来标记 USB 的相关状态,这样我们就可以在液晶上显示当前 USB 的状态
了。


实验结果在显示屏上显示

实验结果在显示屏上显示
360截图20150208214404721.jpg





收藏 1 评论33 发布时间:2015-2-8 21:45

举报

33个回答
wambob 回答时间: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
dsjsjf 回答时间: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的板子,嘿嘿,支持一下
1234下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

官网相关资源

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