《基于STM32的SD卡设计毕业设计.doc》由会员分享,可在线阅读,更多相关《基于STM32的SD卡设计毕业设计.doc(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、淮南师范学院电子工程学院2013级电子信息科学与技术专业ARM嵌入式系统课程设计 成绩课程论文 题 目: 基于STM32的SD卡设计 课程名称: ARM嵌入式系统 学生姓名: 学生学号: 系 别: 电子工程学院 专 业: 电子信息科学与技术 年 级: 2013级 任课教师: 电子工程学院制2015年10月基于STM32的SD卡设计学生:指导教师:电子工程学院:电子信息科学与技术1概述1.1设计背景21世纪是一信息传递及应用高速的时代,信息在人类社会活动中已经必不可缺,使用嵌入式系统的电子产品已经在人们的日常生活中广泛普及应用。其中人们日常生活中最经常接触使用到的数码相机、手机、MP3、MP4、
2、多媒体播放器等,其信息数据的存储大部分都是使用的SD卡。所以SD卡在嵌入式上应用有着十分大市场空间。 SD卡拥有轻小、高存储容量、高速的传输速率以及很高的安全性,更换和编程也相当方便。根据SD卡胡特性,它已然成为非常多数码产品的外部应用储存的第一选择目标。ALIENTKE MiniSTM32开发板就带有SD卡接口,利用STM32自带的 SPI接口,最大通信速度可达18Mbps,每秒可传输数据 2M 字节以上,对于一般应用足够了。 2硬件设计2.1硬件读写模块SD卡存储模式是Flash。SD卡的卡内智能控制模块包含电源和时钟的管理、协议、算法安全、存取数据、ECC算法、处理缺陷和分析数据。FLA
3、SH每个扇区的写寿命在10万次左右,读的次数是无限制的。SD卡一般支持2种操作模式: 1、SD卡模式; 2、PI模式;SD卡的引脚排序如下图所示:图1 SD卡的引脚排序 SD卡的九个引脚功能:表1:SD卡引脚功能表针脚123456789SD卡模式CD/DAT3CMDVSSVCCCLKVSSDAT0DAT1DAT2SPI模式CSMOSIVSSVCCCLKVSSMIS0NCNCSD卡只能使用3.3V的IO电平,所以,MCU一定要能够支持3.3V的IO端口输出。注意:在SPI模式下,CS/MOSI/MISO/CLK都需要加10100K左右的上拉电阻。在STM32中,开板使用的是SPI的接口模式来进得
4、读写,所以,主要应用的便是SPI的模式。由于SD卡内部的供电电压上升是需要一段时间,大约是64个时钟,而且需要10个时钟与SD卡同步,所以在发送CMD0之前,要发送74个时钟。SD卡与STM32 进行数据交换,要将SD卡外部驱动,将外部储存卡与STM32联系起来。开发板对成为外部储存空间的SD卡进行读写,把读写命令解析并传送到SD卡中,从而实现开发板对外部储存卡的操作与控制。2.2硬件设计模块所需要的硬件资源如下: 1、SD卡。 2、STM32F103ZET6。 3、DS0(外部 LED0)。4、串口 1。 SD卡和STM32的连接:SPI1与安全数码卡通信,如下其引脚的连接定义为: PE3:
5、SPI1-SPI2全双工通讯,低电平作用; PA7:通讯结束后跟随一个CRC校验; PA5:SPI1、SPI2的NSS引脚是断开的; PA6:SPI驱动,NSS引脚由软件设置配置; PC12:MOSI输出,与STM32通信; CLK:时钟信号; CMD:双向命令和响应信号; DAT0-3:双向数据信号; VDD,VSS:电源和地信号;原理图如下:图2 SD卡接口与STM32连接原理图 在SPI模式下,引脚1(DAT3)作为SPI片选线CS用,引脚2(CMD)用作SPI总线的数据输出线MOSI,而引脚7(DAT0)为数据输入线MISO ,NSS由硬件配置, SPI2为主机, SPI1为从机,使
6、SS输出(置位 SPI_ CR2 SSOE位),SPI2 NSS引脚复位 SPI1的 NSS引脚并配置 SPI1为从机。在通讯中使用DMA可以减少代码密度和执行时间,容易接收和发送数据。利用各种硬件设备自身的特点来减小其运转开销,例如减小中断次数、利用DMA传输方式等。安全数码卡传输给STM32,STM32和SD卡进行数据间的互换。3软件设计3.1SD卡初始化SD卡的典型初始化过程如下:(1) 初始化与SD卡连接的硬件条件(MCU的SPI配置,I/O口配置)。(2) 上电延时(74个CLK)(3) 复位卡(CMD0),进入LDLE状态。(4) 发送CMD8,检查是否支持2.0协议。(5) 根据
7、不同协议检查SD卡(命令包括CMD55、CMD41、CMD58和CMD1等)。(6) 取消片选,发多8个CLK,结束初始化。开始发送74个时钟周期发送复位命令CMD0进入SPI总线模式发送激活命令CMD1SD卡响应Bit=0?结束NY图3 流程图(SD卡初始化)3.2读SD卡SD卡读取数据,这里通过CMD17来实现,具体过程如下:(1) 发送CMD17。(2) 接收卡响应R1。(3) 接收数据起始令牌0XFE。(4) 接收数据。(5) 接收2个字节的CRC,如果不使用CRC,两个字节在读取后可以丢掉。(6) 禁止片选之后,发多8个CLK。3.3写SD卡写数据通过CMD24来实现,具体过程如下:
8、(1) 发送CMD24.(2) 接收卡响应R1。(3) 发送写数据起始令牌0XFE。(4) 发送数据。(5) 发送2字节的伪CRC。(6) 禁止片选之后,发多8个CLK。开始SD卡初始化发送命令CMD24接收SD卡响应超时错误发送数据起始标志发送512字节数据发送2字节CRC码接收SD卡响应&0x1F=5?结束返回NYYN开始SD卡初始化发送写命令CMD17应答=0xFE接收512字节数据接收2字节CRC码结束返回NY图4 流程图(读SD卡) 图5 流程图(写SD卡)4软件仿真打开keil5编译运行编写好的程序,没有错误后选择软件仿真(Debug)使用波形仿真。点开Setup设置引脚PORTA
9、.3,PORTA.5,PORTA.6,PORTA.7选择Bit模式。按下KEY0初始化SD卡,SD卡开始发送接收数据。点击Run.仿真情况如下图:5总结SD卡应用使让人越来依赖它,可以说是已经成为人类社会生活中不可或缺的一部分,SD卡具有广阔的发展前景和市场前景。21世纪是一信息传递及应用高速的时代,信息在人类社会活动中已经必不可缺,使用嵌入式系统的电子产品已经在人们的日常生活中广泛普及应用。 通过本次设计实验,让我各方面都有了一个提升。技术上,我更加深入了解STM32和SD卡,学到了以前没有学过的知识。在做这个设计时,也有着各种各样的困难,通过请教老师、同学和查找各种资料克服了一个又一个困难
10、,最终完成了这篇论文。本次设计实验从选题之初到准备材料到编写论文到完成论文,让我深刻的人数到我有很多不足之处,比如书本知识不能学以致用,缺乏综合应用知识的能力,分析问题的能力也比较弱。通过这次的学习和实践,我清楚的认识到自己的知识还很不全面,处理问题等方面都还需要一个更大的提升,做任何都要认真对待、全力以赴。也明白任何事都不像看起来那么简单,只有通过认真学习和动手实践才能克服困难,走向成功。参考文献1张洋,刘军,严汉宇.原子教你玩STM32(库函数版) M.北京航空航天大学出版社,2013. 2邓奕.电子线路CAD实用教程(第2版)M. 华中科技大学出版社.2012 3刘明福. 基于STM32
11、的SD卡设计D.江西科技学院.20124刘同法,肖志刚,彭继卫. ARM Cortex-M3内核微控制器快速入门与应用M北京航空航天大学出版社.2009 5 Cortex-M3 技术参考手册.pdf 6STM32不完全手册_库函数版本_V3.1.pdf7STM32固件库使用手册的中文翻译版.pdf8protel99se不完全使用手册.pdf9喻金钱、喻斌.STM32F系列ARMCortex-M3核微控制器开发与应用M.清华大学出版社.10 百度百科SD卡附录:#include sys.h#include mmc_sd.h#include spi.h#include usart.h u8 SD_
12、Type=0;/SD卡的类型 /移植修改区/移植时候的接口/data:要写入的数据/返回值:读到的数据u8 SD_SPI_ReadWriteByte(u8 data)return SPI1_ReadWriteByte(data); /SD卡初始化的时候,需要低速void SD_SPI_SpeedLow(void) SPI1_SetSpeed(SPI_BaudRatePrescaler_256);/设置到低速模式/SD卡正常工作的时候,可以高速了void SD_SPI_SpeedHigh(void) SPI1_SetSpeed(SPI_BaudRatePrescaler_2);/设置到高速模式/
13、SPI硬件层初始化void SD_SPI_Init(void) /设置硬件上与SD卡相关联的控制引脚输出/禁止其他外设(NRF/W25Q64)对SD卡产生影响GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE ); /PORTA时钟使能 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;/PA2.3.4 推挽 n_3|GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode
14、= GPIO_Mode_Out_PP ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);/PA2.3.4上拉 SPI1_Init();SD_CS=1;/取消选择,释放SPI总线void SD_DisSelect(void)SD_CS=1; SD_SPI_ReadWriteByte(0xff);/提供额外的8个时钟/选择sd卡,并且等待卡准备OK/返回值:0,成功;
15、1,失败;u8 SD_Select(void)SD_CS=0;if(SD_WaitReady()=0)return 0;/等待成功SD_DisSelect();return 1;/等待失败/等待卡准备好/返回值:0,准备好了;其他,错误代码u8 SD_WaitReady(void)u32 t=0;doif(SD_SPI_ReadWriteByte(0XFF)=0XFF)return 0;/OKt+; while(t0XFFFFFF);/等待 return 1;/等待SD卡回应/Response:要得到的回应值/返回值:0,成功得到了该回应值/ 其他,得到回应值失败u8 SD_GetRespon
16、se(u8 Response)u16 Count=0xFFFF;/等待次数 while (SD_SPI_ReadWriteByte(0XFF)!=Response)&Count)Count-;/等待得到准确的回应 if (Count=0)return MSD_RESPONSE_FAILURE;/得到回应失败 else return MSD_RESPONSE_NO_ERROR;/正确回应/从sd卡读取一个数据包的内容/buf:数据缓存区/len:要读取的数据长度./返回值:0,成功;其他,失败;u8 SD_RecvData(u8*buf,u16 len) if(SD_GetResponse(0x
17、FE)return 1;/等待SD卡发回数据起始令牌0xFE while(len-)/开始接收数据 *buf=SPI1_ReadWriteByte(0xFF); buf+; /下面是2个伪CRC(dummy CRC) SD_SPI_ReadWriteByte(0xFF); SD_SPI_ReadWriteByte(0xFF); return 0;/读取成功/向sd卡写入一个数据包的内容 512字节/buf:数据缓存区/cmd:指令/返回值:0,成功;其他,失败;u8 SD_SendBlock(u8*buf,u8 cmd)u16 t; if(SD_WaitReady()return 1;/等待准
18、备失效SD_SPI_ReadWriteByte(cmd);if(cmd!=0XFD)/不是结束指令for(t=0;t 24); SD_SPI_ReadWriteByte(arg 16); SD_SPI_ReadWriteByte(arg 8); SD_SPI_ReadWriteByte(arg); SD_SPI_ReadWriteByte(crc); if(cmd=CMD12)SD_SPI_ReadWriteByte(0xff);/Skip a stuff byte when stop reading /等待响应,或超时退出Retry=0X1F;dor1=SD_SPI_ReadWriteByt
19、e(0xFF);while(r1&0X80) & Retry-); /返回状态值 return r1; /获取SD卡的CID信息,包括制造商信息/输入: u8 *cid_data(存放CID的内存,至少16Byte) /返回值:0:NO_ERR/ 1:错误 u8 SD_GetCID(u8 *cid_data) u8 r1; /发CMD10命令,读CID r1=SD_SendCmd(CMD10,0,0x01); if(r1=0x00)r1=SD_RecvData(cid_data,16);/接收16个字节的数据 SD_DisSelect();/取消片选if(r1)return 1;else re
20、turn 0; /获取SD卡的CSD信息,包括容量和速度信息/输入:u8 *cid_data(存放CID的内存,至少16Byte) /返回值:0:NO_ERR/1:错误 u8 SD_GetCSD(u8 *csd_data) u8 r1; r1=SD_SendCmd(CMD9,0,0x01);/发CMD9命令,读CSD if(r1=0) r1=SD_RecvData(csd_data, 16);/接收16个字节的数据 SD_DisSelect();/取消片选if(r1)return 1;else return 0; /获取SD卡的总扇区数(扇区数) /返回值:0: 取容量出错 / 其他:SD卡的
21、容量(扇区数/512字节)/每扇区的字节数必为512,因为如果不是512,则初始化不能通过.u32 SD_GetSectorCount(void) u8 csd16; u32 Capacity; u8 n;u16 csize; /取CSD信息,如果期间出错,返回0 if(SD_GetCSD(csd)!=0) return 0; /如果为SDHC卡,按照下面方式计算 if(csd0&0xC0)=0x40) /V2.00的卡 csize = csd9 + (u16)csd8 8) + 1;Capacity = (u32)csize 7) + (csd9 & 3) 6) + (u16)csd7 2)
22、 + (u16)(csd6 & 3) 10) + 1;Capacity= (u32)csize (n - 9);/得到扇区数 return Capacity;/初始化SD卡u8 SD_Initialize(void) u8 r1; / 存放SD卡的返回值 u16 retry; / 用来进行超时计数 u8 buf4; u16 i;SD_SPI_Init();/初始化IO SD_SPI_SpeedLow();/设置到低速模式 for(i=0;i10;i+)SD_SPI_ReadWriteByte(0XFF);/发送最少74个脉冲retry=20;dor1=SD_SendCmd(CMD0,0,0x9
23、5);/进入IDLE状态while(r1!=0X01) & retry-); SD_Type=0;/默认无卡if(r1=0X01)if(SD_SendCmd(CMD8,0x1AA,0x87)=1)/SD V2.0for(i=0;i4;i+)bufi=SD_SPI_ReadWriteByte(0XFF);/Get trailing return value of R7 respif(buf2=0X01&buf3=0XAA)/卡是否支持2.73.6Vretry=0XFFFE;doSD_SendCmd(CMD55,0,0X01);/发送CMD55r1=SD_SendCmd(CMD41,0x40000
24、000,0X01);/发送CMD41while(r1&retry-);if(retry&SD_SendCmd(CMD58,0,0X01)=0)/鉴别SD2.0卡版本开始for(i=0;i4;i+)bufi=SD_SPI_ReadWriteByte(0XFF);/得到OCR值if(buf0&0x40)SD_Type=SD_TYPE_V2HC; /检查CCSelse SD_Type=SD_TYPE_V2; else/SD V1.x/ MMCV3SD_SendCmd(CMD55,0,0X01);/发送CMD55r1=SD_SendCmd(CMD41,0,0X01);/发送CMD41if(r1=1)S
25、D_Type=SD_TYPE_V1;retry=0XFFFE;do /等待退出IDLE模式SD_SendCmd(CMD55,0,0X01);/发送CMD55r1=SD_SendCmd(CMD41,0,0X01);/发送CMD41while(r1&retry-);else/MMC卡不支持CMD55+CMD41识别SD_Type=SD_TYPE_MMC;/MMC V3retry=0XFFFE;do /等待退出IDLE模式 r1=SD_SendCmd(CMD1,0,0X01);/发送CMD1while(r1&retry-); if(retry=0|SD_SendCmd(CMD16,512,0X01)
26、!=0)SD_Type=SD_TYPE_ERR;/错误的卡SD_DisSelect();/取消片选SD_SPI_SpeedHigh();/高速if(SD_Type)return 0;else if(r1)return r1; return 0xaa;/其他错误/读SD卡/buf:数据缓存区/sector:扇区/cnt:扇区数/返回值:0,ok;其他,失败.u8 SD_ReadDisk(u8*buf,u32 sector,u8 cnt)u8 r1;if(SD_Type!=SD_TYPE_V2HC)sector = 9;/转换为字节地址if(cnt=1)r1=SD_SendCmd(CMD17,se
27、ctor,0X01);/读命令if(r1=0)/指令发送成功r1=SD_RecvData(buf,512);/接收512个字节 elser1=SD_SendCmd(CMD18,sector,0X01);/连续读命令dor1=SD_RecvData(buf,512);/接收512个字节 buf+=512; while(-cnt & r1=0); SD_SendCmd(CMD12,0,0X01);/发送停止命令 SD_DisSelect();/取消片选return r1;/写SD卡/buf:数据缓存区/sector:起始扇区/cnt:扇区数/返回值:0,ok;其他,失败.u8 SD_WriteDi
28、sk(u8*buf,u32 sector,u8 cnt)u8 r1;if(SD_Type!=SD_TYPE_V2HC)sector *= 512;/转换为字节地址if(cnt=1)r1=SD_SendCmd(CMD24,sector,0X01);/读命令if(r1=0)/指令发送成功r1=SD_SendBlock(buf,0xFE);/写512个字节 elseif(SD_Type!=SD_TYPE_MMC)SD_SendCmd(CMD55,0,0X01);SD_SendCmd(CMD23,cnt,0X01);/发送指令 r1=SD_SendCmd(CMD25,sector,0X01);/连续读
29、命令if(r1=0)dor1=SD_SendBlock(buf,0xFC);/接收512个字节 buf+=512; while(-cnt & r1=0);r1=SD_SendBlock(0,0xFD);/接收512个字节 SD_DisSelect();/取消片选return r1;/#include led.h#include delay.h#include sys.h#include usart.h#include lcd.h#include key.h#include malloc.h #include MMC_SD.h /读取SD卡的指定扇区的内容,并通过串口1输出/sec:扇区物理地址
30、编号void SD_Read_Sectorx(u32 sec)u8 *buf;u16 i;buf=mymalloc(512);/申请内存if(SD_ReadDisk(buf,sec,1)=0)/读取0扇区的内容LCD_ShowString(60,190,200,16,16,USART1 Sending Data.);printf(SECTOR 0 DATA:rn);for(i=0;i11,5,16);/显示SD卡容量while(1)key=KEY_Scan(0);if(key=KEY0_PRES)SD_Read_Sectorx(0);/KEY0按,读取SD卡扇区0的内容t+;delay_ms(
31、10);if(t=20)LED0=!LED0;t=0; 1. 基于C8051F单片机直流电动机反馈控制系统的设计与研究2. 基于单片机的嵌入式Web服务器的研究 3. MOTOROLA单片机MC68HC(8)05PV8/A内嵌EEPROM的工艺和制程方法及对良率的影响研究 4. 基于模糊控制的电阻钎焊单片机温度控制系统的研制 5. 基于MCS-51系列单片机的通用控制模块的研究 6. 基于单片机实现的供暖系统最佳启停自校正(STR)调节器7. 单片机控制的二级倒立摆系统的研究8. 基于增强型51系列单片机的TCP/IP协议栈的实现 9. 基于单片机的蓄电池自动监测系统 10. 基于32位嵌入式
32、单片机系统的图像采集与处理技术的研究11. 基于单片机的作物营养诊断专家系统的研究 12. 基于单片机的交流伺服电机运动控制系统研究与开发 13. 基于单片机的泵管内壁硬度测试仪的研制 14. 基于单片机的自动找平控制系统研究 15. 基于C8051F040单片机的嵌入式系统开发 16. 基于单片机的液压动力系统状态监测仪开发 17. 模糊Smith智能控制方法的研究及其单片机实现 18. 一种基于单片机的轴快流CO,2激光器的手持控制面板的研制 19. 基于双单片机冲床数控系统的研究 20. 基于CYGNAL单片机的在线间歇式浊度仪的研制 21. 基于单片机的喷油泵试验台控制器的研制 22.
33、 基于单片机的软起动器的研究和设计 23. 基于单片机控制的高速快走丝电火花线切割机床短循环走丝方式研究 24. 基于单片机的机电产品控制系统开发 25. 基于PIC单片机的智能手机充电器 26. 基于单片机的实时内核设计及其应用研究 27. 基于单片机的远程抄表系统的设计与研究 28. 基于单片机的烟气二氧化硫浓度检测仪的研制 29. 基于微型光谱仪的单片机系统 30. 单片机系统软件构件开发的技术研究 31. 基于单片机的液体点滴速度自动检测仪的研制32. 基于单片机系统的多功能温度测量仪的研制 33. 基于PIC单片机的电能采集终端的设计和应用 34. 基于单片机的光纤光栅解调仪的研制
34、35. 气压式线性摩擦焊机单片机控制系统的研制 36. 基于单片机的数字磁通门传感器 37. 基于单片机的旋转变压器-数字转换器的研究 38. 基于单片机的光纤Bragg光栅解调系统的研究 39. 单片机控制的便携式多功能乳腺治疗仪的研制 40. 基于C8051F020单片机的多生理信号检测仪 41. 基于单片机的电机运动控制系统设计 42. Pico专用单片机核的可测性设计研究 43. 基于MCS-51单片机的热量计 44. 基于双单片机的智能遥测微型气象站 45. MCS-51单片机构建机器人的实践研究 46. 基于单片机的轮轨力检测 47. 基于单片机的GPS定位仪的研究与实现 48. 基于单片机的电液伺服控制系统 49. 用于单片机系统的MMC卡文件系统研制 50. 基于单片机的时控和计数系统性能优化的研究 51. 基于单片机和C