基于嵌入式ARM的SD卡的读写.

合集下载

SD卡读写包括两种模式

SD卡读写包括两种模式

SD卡读写包括两种模式:SD模式和SPI模式。

其中SD模式又可以分为1bit 和4bit两种传输模式。

SD卡缺省使用专有的SD模式。

SD卡规范中主要讲了一些命令,响应和CRC效验等等,整个规范的内容还是很多的。

SD卡上电后,卡处于空闲状态,主机发送CMD0复位SD卡,然后通过CMD55和ACMD41判断当前电压是否在卡的工作范围内。

在得到了正确的响应后,主机可以继续通过CMD10读取SD卡的CID寄存器,通过CMD16设置数据块长度,通过CMD9读取卡的CSD寄存器。

从CSD寄存器中,主机可以获知卡容量,支持的命令集等重要参数。

此时,卡以进入了传输状态,主机就可以通过CMD17/18和CMD24/25对卡进行读写。

CRC校验是为了防止SD卡的命令,应答,数据传输出现错误。

每个命令和应答信号都会产生CRC效验码,每个数据块的传输也会长生CRC效验码。

这段程序是友善之臂推出的mini2440开发板中带的ADS测试源码。

整个阅读代码的过程是对这S3C2440的芯片手册和SD卡规范来看的,对于MMC卡没有给出注释,其实和SD卡是大同小异。

由于是初次接触ARM,对SD规范的认识也不是很深入,再加上自己水平有限,还不能完全读懂源代码,其中的肯定存在一些错误,欢迎大家一起交流讨论。

#define INT 1#define DMA 2int CMD13(void);// Send card statusint CMD9(void);unsigned int*Tx_buffer;//128[word]*16[blk]=8192[byte] unsigned int*Rx_buffer;//128[word]*16[blk]=8192[byte] volatile unsigned int rd_cnt;//读数据计数器volatile unsigned int wt_cnt;//写数据计数器volatile unsigned int block;//读写块总数volatile unsigned int TR_end=0;int Wide=0;// 0:1bit, 1:4bitint MMC=0;// 0:SD , 1:MMCint Maker_ID;char Product_Name[7];int Serial_Num;volatile int RCA;void Test_SDI(void){U32 save_rGPEUP, save_rGPECON;RCA=0;MMC=0;block=3072;//3072Blocks=1.5MByte,((2Block=1024Byte)*1024Block=1MByte)save_rGPEUP=rGPEUP;save_rGPECON=rGPECON;//**配置SD/MMC控制器rGPEUP = 0xf83f;// SDCMD, SDDAT[3:0] => PU En. rGPECON = 0xaaaaaaaa;//SDCMD, SDDAT[3:0]Uart_Printf("\nSDI Card Write and Read Test\n");if(!SD_card_init())//等待SD卡初始化完成return;TR_Buf_new();//发送数据缓冲区初始化Wt_Block();//写卡Rd_Block();//读卡View_Rx_buf();if(MMC)TR_Buf_new();if(MMC){rSDICON |=(1<<5);// YH 0519, MMC Type SDCLKWt_Stream();Rd_Stream();View_Rx_buf();}Card_sel_desel(0);// Card deselectif(!CMD9())Uart_Printf("Get CSD fail!!!\n");rSDIDCON=0;//tark???rSDICSTA=0xffff;rGPEUP=save_rGPEUP;rGPECON=save_rGPECON;}void TR_Buf_new(void)//发送数据缓冲区初始化{//-- Tx & Rx Buffer initializeint i, j;Tx_buffer=(unsigned int*)0x31000000;j=0;for(i=0;i<2048;i++)//128[word]*16[blk]=8192[byte]*(Tx_buffer+i)=i+j;Flush_Rx_buf();}void Flush_Rx_buf(void)//接收数据缓冲区清0{//-- Flushing Rx bufferint i;Rx_buffer=(unsigned int*)0x31800000;for(i=0;i<2048;i++)//128[word]*16[blk]=8192[byte]*(Rx_buffer+i)=0;Uart_Printf("End Rx buffer flush\n");}void View_Rx_buf(){//-- Display Rx bufferint i,error=0;Tx_buffer=(unsigned int*)0x31000000;Rx_buffer=(unsigned int*)0x31800000;Uart_Printf("Check Rx data\n");for(i=0;i<128*block;i++){if(Rx_buffer[i]!= Tx_buffer[i]){Uart_Printf("\nTx/Rx error\n");Uart_Printf("%d:Tx-0x%08x, Rx-0x%08x\n",i,Tx_buffer[i], Rx_buffer[i]);error=1;break;}}if(!error){Uart_Printf("\nThe Tx_buffer is same to Rx_buffer!\n");Uart_Printf("SD CARD Write and Read test is OK!\n");}}void View_Tx_buf(void){}int SD_card_init(void)//SD卡初始化{//-- SD controller & card initializeint i;/* Important notice for MMC test condition *//* Cmd & Data lines must be enabled by pull up resister */rSDIPRE=PCLK/(INICLK)-1;// 400KHzUart_Printf("Init. Frequency is %dHz\n",(PCLK/(rSDIPRE+1)));rSDICON=(1<<4)|1;//先传高位,再传低位,使能CLKrSDIFSTA=rSDIFSTA|(1<<16);//SDI FIFO status register,FIFO复位rSDIBSIZE=0x200;// SDI block size register,设置每块大小为512byte(128word)rSDIDTIMER=0x7fffff;// SDI data / busy timer register,设置超时周期for(i=0;i<0x1000;i++);// 延时,CARD自身初始化需要74个CLKCMD0();//发送CMD0Uart_Printf("In idle\n");//-- Check MMC card OCRif(Chk_MMC_OCR()){Uart_Printf("In MMC ready\n");MMC=1;goto RECMD2;}Uart_Printf("MMC check end!!\n");//-- Check SD card OCRif(Chk_SD_OCR())Uart_Printf("In SD ready\n");else{Uart_Printf("Initialize fail\nNo Card assertion\n");return 0;}RECMD2://检查连接的卡,识别卡的状态rSDICARG=0x0;// CMD2(stuff bit)rSDICCON=(0x1<<10)|(0x1<<9)|(0x1<<8)|0x42;//CMD2为长应答并等待应答,开始发//送CMD2,命令卡发回CID寄存器(保存了生产厂家/时间/批号等等),产生RSP2//检查CMD2是否成功发送并收到响应if(!Chk_CMDend(2, 1))goto RECMD2;//CMD2出错,重新发送rSDICSTA=0xa00;// 清除命令和应答结束标志位Uart_Printf("End id\n");RECMD3://--发送CMD3,给卡分配RCA,rSDICARG=MMC<<16;//CMD3参数, MMC:设置 RCA, SD:请求发RCArSDICCON=(0x1<<9)|(0x1<<8)|0x43;//CMD3为短应答并等待应答,开始发//送CMD3, MMC(设置RCA,产生RSP1),SD(设置RCA,产生RSP6)//检查CMD3是否成功发送并收到响应if(!Chk_CMDend(3, 1))goto RECMD3;//CMD3出错,重新发送rSDICSTA=0xa00;// 清除命令和应答结束标志位//--Publish RCAif(MMC){RCA=1;rSDIPRE=(PCLK/MMCCLK)-1;Uart_Printf("MMC Frequency is %dHz\n",(PCLK/(rSDIPRE+1)));}else{RCA=( rSDIRSP0 & 0xffff0000 )>>16;//回读RCA,卡被分配RCA后进入//TransferMODE,准备读写Uart_Printf("RCA=0x%x\n",RCA);rSDIPRE=PCLK/(SDCLK)-1;// Normal clock=25MHzUart_Printf("SD Frequency is %dHz\n",(PCLK/(rSDIPRE+1)));}//--State(stand-by) check//根据SD规范,rSDIRSP0高16位存储RCA,低16位存储CARD的状态if(rSDIRSP0 &0x1e00!=0x600 )// 检查CARD状态,不是处于stand-by 状态goto RECMD3;////未就绪,重新发送CMD3Uart_Printf("In stand-by\n");Card_sel_desel(1);// Selectif(!MMC)//若位SD卡,设置4bit的数据传输模式Set_4bit_bus();else//若位MMC卡,设置1bit的数据传输模式Set_1bit_bus();return 1;}void Card_sel_desel(char sel_desel){//-- Card select or deselectif(sel_desel)//选择该卡{RECMDS7://送CMD7表示选择该卡,准备读写,产生RSP1.rSDICARG=RCA<<16;// CMD7参数(RCA,stuff bit),其中高16位为RCA rSDICCON=(0x1<<9)|(0x1<<8)|0x47;//CMD7为短应答并等待应答,开始发//送CMD7选择该卡,准备读写,产生RSP1//检查CMD7是否成功发送并收到响应if(!Chk_CMDend(7, 1))goto RECMDS7;//出错,重新发送rSDICSTA=0xa00;//清除命令和应答结束标志位//检查是否处于transfer modeif( rSDIRSP0 & 0x1e00!=0x800 )goto RECMDS7;//不处于transfer mode,重新发送CMD7}else//卸载该卡{RECMDD7:rSDICARG=0<<16;// CMD7参数(RCA,stuff bit),其中高16位为RCA rSDICCON=(0x1<<8)|0x47;// 无应答并,并开始发送CMD7//检查CMD7是否成功if(!Chk_CMDend(7, 0))goto RECMDD7;//失败,重新卸载rSDICSTA=0x800;// //清除命令结束标志位}}void __irq Rd_Int(void)//读中断函数U32 i,status;status=rSDIFSTA;if((status&0x200)== 0x200 )//检查接收FIFO最后是否有数据到来{for(i=(status & 0x7f)/4;i>0;i--){*Rx_buffer++=rSDIDAT;rd_cnt++;}rSDIFSTA=rSDIFSTA&0x200;//清 Rx FIFO Last data Ready标志位}else if((status&0x80)== 0x80 )// 检查Half FULL interrupt标志,只要大于31个字节,就会将该标志置1{for(i=0;i<8;i++){*Rx_buffer++=rSDIDAT;rd_cnt++;}}ClearPending(BIT_SDI);//清零源中断挂起寄存器和中断挂起寄存器}void __irq Wt_Int(void)//写中断函数ClearPending(BIT_SDI);//清零源中断挂起寄存器和中断挂起寄存器rSDIDAT=*Tx_buffer++;wt_cnt++;if(wt_cnt==128*block){rINTMSK |= BIT_SDI;//屏蔽BIT_SDI中断rSDIDAT=*Tx_buffer;TR_end=1;}}void __irq DMA_end(void){ClearPending(BIT_DMA0);//清零源中断挂起寄存器和中断挂起寄存器TR_end=1;}void Rd_Block(void){U32 mode;int status;rd_cnt=0;Uart_Printf("Block read test[ Polling read ]\n");mode = 0 ;rSDIFSTA=rSDIFSTA|(1<<16);// 复位FIFOif(mode!=2)rSDIDCON=(2<<22)|(1<<19)|(1<<17)|(Wide<<16)|(1<<14)|(2<<12)|(block <<0);//YH 040220//设置数据控制寄存器:字传输,块数据传输,4bit数据传输,开始数据传输,数据发送模//式,共读block个块rSDICARG=0x0;// CMD17/18地址参数RERDCMD:switch(mode){case POL:if(block<2)// SINGLE_READ写单块{rSDICCON=(0x1<<9)|(0x1<<8)|0x51;//CMD17为短应答并等待应答,开始发//送CMD17单块读命令,开始读,产生RSP1if(!Chk_CMDend(17, 1))//-- Check end of CMD17goto RERDCMD;//失败,继续发送}else// MULTI_READ,读多块{rSDICCON=(0x1<<9)|(0x1<<8)|0x52;//CMD18为短应答并等待应答,开始发//送CMD18多块读命令,开始读,产生RSP1if(!Chk_CMDend(18, 1))//-- Check end of CMD18goto RERDCMD;//失败,继续发送}rSDICSTA=0xa00;// 清命令和应答结束标志while(rd_cnt<128*block)// 512块个字节{if((rSDIDSTA&0x20)==0x20)// 是否超时{rSDIDSTA=(0x1<<0x5);// 清超时标志位break;}status=rSDIFSTA;if((status&0x1000)==0x1000)// FIFO非空{*Rx_buffer++=rSDIDAT;rd_cnt++;}}break;case INT:pISR_SDI=(unsigned)Rd_Int;rINTMSK =~(BIT_SDI);//屏蔽除所有其他中断rSDIIMSK=5;// 开启Last & Rx FIFO half 中断.if(block<2)// SINGLE_READ{rSDICCON=(0x1<<9)|(0x1<<8)|0x51;//CMD17为短应答并等待应答,开始发//送CMD17单块读命令,开始读,产生RSP1if(!Chk_CMDend(17, 1))//-- Check end of CMD17goto RERDCMD;//失败,继续发送}else// MULTI_READ{rSDICCON=(0x1<<9)|(0x1<<8)|0x52;//CMD18为短应答并等待应答,开始发//送CMD18多块读命令,开始读,产生RSP1if(!Chk_CMDend(18, 1))//-- Check end of CMD18goto RERDCMD;//失败,继续发送}rSDICSTA=0xa00;// 清命令和应答结束标志while(rd_cnt<128*block);rINTMSK |=(BIT_SDI);//屏蔽BIT_SDI中断rSDIIMSK=0;//屏蔽所有中断break;case DMA:pISR_DMA0=(unsigned)DMA_end;rINTMSK =~(BIT_DMA0);rSDIDCON=rSDIDCON|(1<<24);//YH 040227, Burst4 EnablerDISRC0=(int)(SDIDAT);// SDIDATrDISRCC0=(1<<1)+(1<<0);// APB, fixrDIDST0=(U32)(Rx_buffer);// Rx_bufferrDIDSTC0=(0<<1)+(0<<0);// AHB, incrDCON0=(1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(2<<24)+(1<<23) +(1<<22)+(2<<20)+128*block;rDMASKTRIG0=(0<<2)+(1<<1)+0;//no-stop, DMA2 channel on, no-swtriggerrSDIDCON=(2<<22)|(1<<19)|(1<<17)|(Wide<<16)|(1<<15)|(1<<14)|(2 <<12)|(block<<0);if(block<2)// SINGLE_READ{rSDICCON=(0x1<<9)|(0x1<<8)|0x51;// sht_resp, wait_resp, dat, start, CMD17if(!Chk_CMDend(17, 1))//-- Check end of CMD17goto RERDCMD;}else// MULTI_READ{rSDICCON=(0x1<<9)|(0x1<<8)|0x52;// sht_resp, wait_resp, dat, start, CMD18if(!Chk_CMDend(18, 1))//-- Check end of CMD18goto RERDCMD;}rSDICSTA=0xa00;// Clear cmd_end(with rsp)while(!TR_end);//Uart_Printf("rSDIFSTA=0x%x\n",rSDIFSTA);rINTMSK |=(BIT_DMA0);TR_end=0;rDMASKTRIG0=(1<<2);//DMA0 stopbreak;default:break;}//-- Check end of DATAif(!Chk_DATend())Uart_Printf("dat error\n");rSDIDCON=rSDIDCON&~(7<<12);rSDIFSTA=rSDIFSTA&0x200;//Clear Rx FIFO Last data Ready, YH 040221 rSDIDSTA=0x10;// Clear data Tx/Rx end detectif(block>1){RERCMD12://--Stop cmd(CMD12)rSDICARG=0x0;//CMD12(stuff bit)rSDICCON=(0x1<<9)|(0x1<<8)|0x4c;//sht_resp, wait_resp, start, CMD12 //-- Check end of CMD12if(!Chk_CMDend(12, 1))goto RERCMD12;rSDICSTA=0xa00;// Clear cmd_end(with rsp)}}void Rd_Stream(void)// only for MMC, 3blk read{int status, rd_cnt=0;if(MMC!=1){Uart_Printf("Stream read command supports only MMC!\n"); return;}Uart_Printf("\n[Stream read test]\n");RECMD11:rSDIDCON=(2<<22)|(1<<19)|(0<<17)|(0<<16)|(1<<14)|(2<<12);rSDICARG=0x0;// CMD11(addr)rSDICCON=(0x1<<9)|(0x1<<8)|0x4b;//sht_resp, wait_resp, dat, start, CMD11while(rd_cnt<128*block){if((rSDIDSTA&0x20)== 0x20 ){Uart_Printf("Rread timeout error");return;}status=rSDIFSTA;if((status&0x1000)==0x1000){//*Rx_buffer++=rSDIDAT;//rd_cnt++;Rx_buffer[rd_cnt++]=rSDIDAT;}}//-- Check end of CMD11if(!Chk_CMDend(11, 1))goto RECMD11;rSDICSTA=0xa00;// Clear cmd_end(with rsp)//-- Check end of DATArSDIDCON=(2<<22)|(1<<19)|(0<<17)|(0<<16);//YH 040220rSDIDCON=rSDIDCON&~(7<<12);//YH 040220, no operation, data readywhile( rSDIDSTA&0x3 !=0x0 );if(rSDIDSTA!=0)Uart_Printf("rSDIDSTA=0x%x\n", rSDIDSTA);rSDIDSTA=0xff;//YH 040221STRCMD12://--Stop cmd(CMD12)rSDICARG=0x0;//CMD12(stuff bit)rSDICCON=(0x1<<9)|(0x1<<8)|0x4c;//sht_resp, wait_resp, start, CMD12//-- Check end of CMD12if(!Chk_CMDend(12, 1))goto STRCMD12;rSDICSTA=0xa00;// Clear cmd_end(with rsp)rSDIFSTA=rSDIFSTA&0x200;//Clear Rx FIFO Last data Ready, YH 040221 Uart_Printf("rSDIFSTA1=0x%x\n", rSDIFSTA);//YH 040221rSDIFSTA=rSDIFSTA&0x200;//Clear Rx FIFO Last data Ready, YH 040221Uart_Printf("rSDIFSTA2=0x%x\n", rSDIFSTA);//YH 040221Uart_Printf("\n--End stream read test\n");}void Wt_Block(void){U32 mode;int status;wt_cnt=0;Uart_Printf("Block write test[ Polling write ]\n");mode = 0 ;rSDIFSTA=rSDIFSTA|(1<<16);//复位FIFOif(mode!=2)rSDIDCON=(2<<22)|(1<<20)|(1<<17)|(Wide<<16)|(1<<14)|(3<<12)|(block <<0);//设置数据控制寄存器:字传输,块数据传输,4bit数据传输,开始数据传输,数据发送模//式,共写block个块rSDICARG=0x0;// CMD24/25地址参数REWTCMD:switch(mode){case POL:if(block<2)// SINGLE_WRITE,写单块{rSDICCON=(0x1<<9)|(0x1<<8)|0x58;//CMD24为短应答并等待应答,开始发//送CMD24单块写命令,开始写,产生RSP1if(!Chk_CMDend(24, 1))//-- Check end of CMD24goto REWTCMD;//命令发送失败}else// MULTI_WRITE,写多块{rSDICCON=(0x1<<9)|(0x1<<8)|0x59;//CMD25为短应答并等待应答,开发//送CMD25多块写命令,开始读写,产生RSP1if(!Chk_CMDend(25, 1))//-- Check end of CMD25goto REWTCMD;//命令发送失败}rSDICSTA=0xa00;// 清命令和应答结束标志while(wt_cnt<128*block){status=rSDIFSTA;if((status&0x2000)==0x2000)//FIFO未满{rSDIDAT=*Tx_buffer++;wt_cnt++;//Uart_Printf("Block No.=%d, wt_cnt=%d\n",block,wt_cnt);}}break;case INT:pISR_SDI=(unsigned)Wt_Int;rINTMSK =~(BIT_SDI);rSDIIMSK=0x10;// Tx FIFO half int.if(block<2)// SINGLE_WRITE{rSDICCON=(0x1<<9)|(0x1<<8)|0x58;//sht_resp, wait_resp, dat, start, CMD24if(!Chk_CMDend(24, 1))//-- Check end of CMD24goto REWTCMD;}else// MULTI_WRITE{rSDICCON=(0x1<<9)|(0x1<<8)|0x59;//sht_resp, wait_resp, dat, start, CMD25if(!Chk_CMDend(25, 1))//-- Check end of CMD25goto REWTCMD;}rSDICSTA=0xa00;// Clear cmd_end(with rsp)while(!TR_end);//while(wt_cnt<128);rINTMSK |=(BIT_SDI);TR_end=0;rSDIIMSK=0;// All maskbreak;case DMA:pISR_DMA0=(unsigned)DMA_end;rINTMSK =~(BIT_DMA0);rSDIDCON=rSDIDCON|(1<<24);//YH 040227, Burst4 EnablerDISRC0=(int)(Tx_buffer);// Tx_bufferrDISRCC0=(0<<1)+(0<<0);// AHB, incrDIDST0=(U32)(SDIDAT);// SDIDATrDIDSTC0=(1<<1)+(1<<0);// APB, fixrDCON0=(1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(2<<24)+(1<<23) +(1<<22)+(2<<20)+128*block;//handshake, sync PCLK, TC int, single tx, single service, SDI, H/W request,//auto-reload off, word, 128blk*numrDMASKTRIG0=(0<<2)+(1<<1)+0;//no-stop, DMA0 channel on, no-swtriggerrSDIDCON=(2<<22)|(1<<20)|(1<<17)|(Wide<<16)|(1<<15)|(1<<14)|(3<<1 2)|(block<<0);//YH 040220// Word Tx, Tx after rsp, blk, 4bit bus, dma enable, Tx start, blk numif(block<2)// SINGLE_WRITE{rSDICCON=(0x1<<9)|(0x1<<8)|0x58;//sht_resp, wait_resp, dat, start, CMD24if(!Chk_CMDend(24, 1))//-- Check end of CMD24goto REWTCMD;}else// MULTI_WRITE{rSDICCON=(0x1<<9)|(0x1<<8)|0x59;//sht_resp, wait_resp, dat, start, CMD25if(!Chk_CMDend(25, 1))//-- Check end of CMD25goto REWTCMD;}rSDICSTA=0xa00;// Clear cmd_end(with rsp)while(!TR_end);rINTMSK |=(BIT_DMA0);TR_end=0;rDMASKTRIG0=(1<<2);//DMA0 stopbreak;default:break;}//-- Check end of DATAif(!Chk_DATend())Uart_Printf("dat error\n");rSDIDCON=rSDIDCON&~(7<<12);//YH 040220, Clear Data Transfer mode => no operation, Cleata Data Transfer startrSDIDSTA=0x10;// Clear data Tx/Rx endif(block>1){//--Stop cmd(CMD12)REWCMD12:rSDIDCON=(1<<18)|(1<<17)|(0<<16)|(1<<14)|(1<<12)|(block<<0);//YH 040220rSDICARG=0x0;//CMD12(stuff bit)rSDICCON=(0x1<<9)|(0x1<<8)|0x4c;//sht_resp, wait_resp, start, CMD12 //-- Check end of CMD12if(!Chk_CMDend(12, 1))goto REWCMD12;rSDICSTA=0xa00;// Clear cmd_end(with rsp)//-- Check end of DATA(with busy state)if(!Chk_BUSYend())Uart_Printf("error\n");rSDIDSTA=0x08;//! Should be cleared by writing '1'.}}void Wt_Stream(void)// only for MMC, 3blk write{int status, wt_cnt=0;if(MMC!=1){Uart_Printf("Stream write command supports only MMC!\n");return;}Uart_Printf("\n[Stream write test]\n");RECMD20:rSDIDCON=(2<<22)|(1<<20)|(0<<17)|(0<<16)|(1<<14)|(3<<12);// stream moderSDICARG=0x0;// CMD20(addr)rSDICCON=(0x1<<9)|(0x1<<8)|0x54;//sht_resp, wait_resp, dat, start, CMD20//-- Check end of CMD25if(!Chk_CMDend(20, 1))goto RECMD20;rSDICSTA=0xa00;// Clear cmd_end(with rsp)while(wt_cnt<128*block){status=rSDIFSTA;if((status&0x2000)==0x2000)rSDIDAT=Tx_buffer[wt_cnt++];}//-- Check end of DATAwhile( rSDIFSTA&0x400 );Delay(10);// for the empty of DATA line(Hardware)rSDIDCON=(1<<20)|(0<<17)|(0<<16);//YH 040220rSDIDCON=rSDIDCON&~(7<<12);//YH 040220, no operation, data readywhile((rSDIDSTA&0x3)!=0x0 );if(rSDIDSTA!=0x0)Uart_Printf("rSDIDSTA=0x%x\n", rSDIDSTA);rSDIDSTA=0xff;//Clear rSDIDSTASTWCMD12://--Stop cmd(CMD12)rSDIDCON=(1<<18)|(1<<17)|(0<<16)|(1<<14)|(1<<12);rSDICARG=0x0;//CMD12(stuff bit)rSDICCON=(0x1<<9)|(0x1<<8)|0x4c;//sht_resp, wait_resp, start, CMD12//-- Check end of CMD12if(!Chk_CMDend(12, 1))goto STWCMD12;rSDICSTA=0xa00;// Clear cmd_end(with rsp)//-- Check end of DATA(with busy state)if(!Chk_BUSYend())Uart_Printf("error\n");rSDIDSTA=0x08;Uart_Printf("\n--End Stream write test\n");}int Chk_CMDend(int cmd,int be_resp)//0: Timeout{int finish0;if(!be_resp)// 没有应答信号{finish0=rSDICSTA;//读取SDI command status register,while((finish0&0x800)!=0x800)// 等待命令结束finish0=rSDICSTA;rSDICSTA=finish0;// 清命令结束标志return 1;//成功,返回1}else// 有应答信号{finish0=rSDICSTA;//读取SDI command status register,while(!(((finish0&0x200)==0x200)|((finish0&0x400)==0x400)))//检查超时和应答信号finish0=rSDICSTA;if(cmd==1 | cmd==41)// CRC no check, CMD9 is a long Resp. command.{if((finish0&0xf00)!= 0xa00 )// 命令,应答有错,或超时{rSDICSTA=finish0;// 清错误标志if(((finish0&0x400)==0x400))// 若超时,返回0return 0;}rSDICSTA=finish0;// 清命令和应答结束标志}else// 进行CRC效验{if((finish0&0x1f00)!= 0xa00 )// CRC效验出错{Uart_Printf("CMD%d:rSDICSTA=0x%x, rSDIRSP0=0x%x\n",cmd, rSDICSTA, rSDIRSP0);//输出对应寄存器的值rSDICSTA=finish0;// 清除错误标志位if(((finish0&0x400)==0x400))// 若超时,返回0return 0;}rSDICSTA=finish0;}return 1;}}int Chk_DATend(void){int finish;finish=rSDIDSTA;while(!(((finish&0x10)==0x10)|((finish&0x20)==0x20)))// 检查数据结束和超时位finish=rSDIDSTA;if((finish&0xfc)!= 0x10 )//数据传输结束{Uart_Printf("DATA:finish=0x%x\n", finish);rSDIDSTA=0xec;//清除错误标志return 0;}return 1;}int Chk_BUSYend(void){int finish;finish=rSDIDSTA;while(!(((finish&0x08)==0x08)|((finish&0x20)==0x20)))//检查忙标志位finish=rSDIDSTA;if((finish&0xfc)!= 0x08 ){Uart_Printf("DATA:finish=0x%x\n", finish);rSDIDSTA=0xf4;//清除错误标志return 0;}return 1;}void CMD0(void)//CMD0用于对SD实现软件复位,不论卡处于何种状态,使SD卡处于//空闲状态,等待下一个命令的到来{//-- Make card idle staterSDICARG=0x0;// ,CMD0(stuff bit)rSDICCON=(1<<8)|0x40;// 不等待应答信号,命令开始//并再次发送CMD0 关于cmd0定义:0(start_bit)1(cmd标志)000000(6位cmd编//码)后面是参数(无参数就全0)//-- Check end of CMD0Chk_CMDend(0, 0);// 检查命令是否成功发送rSDICSTA=0x800;// 清除命令结束标志}int Chk_MMC_OCR(void){int i;//-- MMC卡识别的等待操作, 使卡处于空闲状态for(i=0;i<100;i++)//等待的时间取决于厂商{// rSDICARG=0xffc000; //CMD1(MMC OCR:2.6V~3.6V),设置工作电压rSDICARG=0xff8000;//CMD1(SD OCR:2.7V~3.6V),设置工作电压rSDICCON=(0x1<<9)|(0x1<<8)|0x41;//CMD1为短应答并等待应答,开始发送CMD1//-- 检查CMD1是否发送成功,并检查卡状态// if(Chk_CMDend(1, 1) & rSDIRSP0==0x80ffc000) //31:忙状态标志位,0表示忙//0xffc000为卡的正常工作电压范围if(Chk_CMDend(1, 1)&&(rSDIRSP0>>16)==0x80ff)//卡处于空闲// if(Chk_CMDend(1, 1) & rSDIRSP0==0x80ff8000)rSDICSTA=0xa00;// 清除命令和应答结束标志位return 1;// 成功}}rSDICSTA=0xa00;//清除命令和应答结束标志位return 0;// 失败}int Chk_SD_OCR(void){int i;//-- SD卡识别的等待操作, 使卡处于空闲状态for(i=0;i<50;i++)// 如果这段时间太短,SD卡的初始化可能会失败{CMD55();//送CMD55,表示下个命令将是特殊功能命令acmd,而非一般命令cmdrSDICARG=0xff8000;//ACMD41(SD OCR:2.7V~3.6V) ,设置工作电压// rSDICARG=0xffc000;//ACMD41(MMC OCR:2.6V~3.6V)设置工作电压rSDICCON=(0x1<<9)|(0x1<<8)|0x69;// ACMD41为短应答并等待应答,开始发//送ACMD41,命令卡发回OCR寄存器(保存了电压参数/busy信号等等),产生//-- 检查ACMD41是否发送成功,并检查卡状态if( Chk_CMDend(41, 1)& rSDIRSP0==0x80ff8000 )//发送成功并且卡处于空闲状态{rSDICSTA=0xa00;//清除命令和应答结束标志位return 1;//成功}Delay(200);//等待卡上电后处于空闲状态}//Uart_Printf("SDIRSP0=0x%x\n",rSDIRSP0);rSDICSTA=0xa00;//清除命令和应答结束标志位return 0;// 失败}int CMD55(void){//CMD55,表示下个命令将是特殊功能acmd,而非一般命令cmdrSDICARG=RCA<<16;//CMD55(RCA,stuff bit)rSDICCON=(0x1<<9)|(0x1<<8)|0x77;//CMD55为短应答(R1)并等待应答,并开始发送CMD55//-- 检查CMD55是成功发送if(!Chk_CMDend(55, 1))return 0;//出错,返回rSDICSTA=0xa00;////清除命令和应答结束标志位return 1;}int CMD13(void)//送CMD13,命令卡的当前状态{int response0;rSDICARG=RCA<<16;// CMD13(RCA,stuff bit),高16位为RCArSDICCON=(0x1<<9)|(0x1<<8)|0x4d;//CMD13为短应答(R1)并等待应答,并开始发送CMD13//-- Check end of CMD13if(!Chk_CMDend(13, 1))//-- 检查CMD13是成功发送return 0;//出错,返回//Uart_Printf("rSDIRSP0=0x%x\n", rSDIRSP0);if(rSDIRSP0&0x100)//数据是否就绪//Uart_Printf("Ready for Data\n");// else//Uart_Printf("Not Ready\n");response0=rSDIRSP0;response0 &= 0x3c00;response0 = response0 >> 9;//Uart_Printf("Current Status=%d\n", response0);if(response0==6)//卡处于receive data stateTest_SDI();rSDICSTA=0xa00;//清除命令和应答结束标志位return 1;}int CMD9(void)//送CMD9,命令卡发回CSD寄存器(保存了读写参数/卡的容量等内容),产生RSP2{rSDICARG=RCA<<16;// CMD9参数,高16位为RCArSDICCON=(0x1<<10)|(0x1<<9)|(0x1<<8)|0x49;//CMD9为长应答并等待应答,开始发//送CMD9,产生RSP2Uart_Printf("\nCSD register :\n");//-- Check end of CMD9if(!Chk_CMDend(9, 1))// 检查命令是否成功发送return 0;//失败则返回Uart_Printf("SDIRSP0=0x%x\nSDIRSP1=0x%x\nSDIRSP2=0x%x\nSDIRSP3= 0x%x\n", rSDIRSP0,rSDIRSP1,rSDIRSP2,rSDIRSP3);return 1;}void Set_1bit_bus(void)//设置1位数据线{Wide=0;if(!MMC)SetBus();//Uart_Printf("\n****1bit bus****\n");}void Set_4bit_bus(void)//设置4位数据线{Wide=1;SetBus();//Uart_Printf("\n****4bit bus****\n");}void SetBus(void)//设置数据线宽度{SET_BUS:CMD55();//CMD55,表示下个命令将是特殊功能acmd,而非一般命令cmdrSDICARG=Wide<<1;//数据宽度00: 1bit, 10: 4bitrSDICCON=(0x1<<9)|(0x1<<8)|0x46;//ACMD6为短应答(R1)并等待应答,并开始发送// ACMD6设置数据线宽度位4bitif(!Chk_CMDend(6, 1))// 设置失败,则重新设置goto SET_BUS;rSDICSTA=0xa00;//清除命令和应答结束标志位}void Set_Prt(void)//写保护{//-- Set protection addr.0 ~ 262144(32*16*512)Uart_Printf("[Set protection(addr.0 ~ 262144) test]\n"); RECMD28://--Make ACMDrSDICARG=0;// CMD28(addr)rSDICCON=(0x1<<9)|(0x1<<8)|0x5c;//sht_resp, wait_resp, start, CMD28//-- Check end of CMD28if(!Chk_CMDend(28, 1))goto RECMD28;rSDICSTA=0xa00;// Clear cmd_end(with rsp)}void Clr_Prt(void)//清除写保护{//-- Clear protection addr.0 ~ 262144(32*16*512)//Uart_Printf("[Clear protection(addr.0 ~ 262144) test]\n");RECMD29://--Make ACMDrSDICARG=0;// CMD29(addr)rSDICCON=(0x1<<9)|(0x1<<8)|0x5d;//sht_resp, wait_resp, start, CMD29//-- Check end of CMD29。

基于ARM和SD卡的嵌入式文件系统研究与设计

基于ARM和SD卡的嵌入式文件系统研究与设计


S 卡 工 具 函数层 D
接 发送 ,所有 的 ACMD命 令 在 发 送
本 层 实现 CR C校 验 , 有 的命 前 必 须 先 发 送 C M 55 命 令 , 所 D



so s 是 令 ( mma d 和 响应 ( s o s ,R Rep n e 卡 对 命令 的 响应 ,包括 Co n) Rep n e 3
引 言

和GE P 4引 脚 。S 卡支 持 单 线 和 4 层 、 AT1 文件 系统 层 和 应 用 层 。 D F 6 其
写 前 0 D 层 随着 嵌 入 式 处理 器 计 算 机 能 力 线 读 / , 者 通 过 DAT 进 行 数 据 中 ,S 卡驱 动 层 又 分 为 4 :硬 件 的不 断 提 高 , 2 MP 3位 U已成 为 嵌 入 串行 传 输 , A 1 为 中断 口, 高 抽象 层 、S 卡 工 具 函 数层 、S 卡 D T作 最 D D
和 数 据 交 换 的 问题 ,在 A M9 入 输 ,最 高 传 输速 率 1 0 p 。 R 嵌 0 Mb s
式处 理器 和 g / — 操 作 系 统基 础 C OSI I 上 采 用 S 卡设 计 开 发 了 一 种 嵌 入 D 式 文件 系统 ,该 系 统 具 有 支 持多 操 作 系 统 、易 于 移 植 和 存 储 速度 快 的

基 于 ARM 和 S 卡 的 D

维普资讯
一 青 岛科 技 大 学 信 息科 学 技 术 学 院 李 宏 佳 徐 晓晓 魏权 利
嵌 入 式 文 件 系 统 研 究 与 设 计
摘 要 :本 文 针 对 汽 车性 能检 测 仪 对 数 据 的存 储 和 交 换 要 求 ,在 ¥ C 4 0 处 理 器 和 g O — 操 作 系统 基 础 上 3 2 1A C SI I 采用 S D卡设 计 开发 了一 种 嵌 入 式 文件 系 统 。文 章 首 先 介 绍 S D卡 的接 口 电路 ,接 着 给 出实现 本 嵌 入 式 文件 系统 的 3 结构 ,并且 对 各 层 的具 体 实 现 进行 了剖 析 。 层 关 键 词 :嵌 入 式文件 系 统 ;S 卡 ;F T 6;¥ C 4 0 D A 1 3 2 1A

基于ARM7的SD卡读写控制在数据采集系统中的应用

基于ARM7的SD卡读写控制在数据采集系统中的应用

基于ARM7的SD卡读写控制在数据采集系统中的应用张华;吴欣;王大星
【期刊名称】《电子技术应用》
【年(卷),期】2009(035)007
【摘要】一个基于ARM7的应用于便携式数据采集系统中的SD卡读写控制设计.描述了基于LPC2132、USB接12芯片D12和SD卡的硬件系统设计,软件设计主要包括D12驱动、SPI总线协议实现和SD卡接口程序设计等.
【总页数】4页(P38-41)
【作者】张华;吴欣;王大星
【作者单位】广东技术师范学院,广东,广州,510635;广东技术师范学院,广东,广州,510635;广州致远电子有限公司,广东,广州,510660
【正文语种】中文
【中图分类】TP274+.2
【相关文献】
1.PLC控制在石油天然气数据采集系统中的应用探究 [J], 车正江
2.基于FatFS的双SD卡存储器在消防自动巡检系统中的应用 [J], 梁文祯
3.基于ARM7的图像数据采集系统的研究与应用 [J], 汪晓斌
4.Windows95环境中基于端口直接读写的多通道数据采集系统及其应用 [J], 聂士忠;王玉秦
5.PLC控制在石油天然气数据采集系统中的应用探究 [J], 车正江
因版权原因,仅展示原文概要,查看原文内容请购买。

SD卡读写器制作

SD卡读写器制作

摘要随着嵌入式处理器计算机能力的不断提高,32 位MPU 已成为嵌入式系统应用的主流。

在ARM9 嵌入式处理器和mC/OS-II操作系统基础上采用SD 卡设计开发了一种嵌入式文件系统,该系统具有支持多操作系统、易于移植和存储速度快的特点。

本文在三星ARM9-S3C2440上实现了MMC /SD卡的硬件扩展, 设计了此硬件平台上的MMC /SD卡在L inux下的驱动, 并给出了相应的关键代码。

关键词: 嵌入式Linux; MMC /SD卡; Linux设备驱动; S3C2440目录1. 概述 (3)1.1 SD卡简介 (3)1.2 系统研究背景 (3)2. 方案论述 (4)2.1 SD卡工作原理 (4)2.1.1 SD 卡内部结构及引脚如下图所示 (4)2.1.2 SD卡指令数据包 (4)2.1.3 SD卡接口电路 (5)3. 芯片选择 (6)3.1 S3C2440的简介 (6)3.2 硬件资源 (6)3.3物理特性 (6)3.4 核心板展示 (7)4. 总体框图 (7)6.1 源程序代码 (9)6.2 读SD卡流程图 (10)6.3 写SD卡流程图 (11)总结 (12)参考文献 (13)附录1:SD卡命令表 (14)附录2:源代码清单 (16)附录3:原理图 (28)附录4:PCB图 (31)1.概述1.1 SD卡简介●SD卡是基于flash的存储卡。

SD卡和MMC卡的区别在于初始化过程不同。

●SD卡的通信协议包括SD和SPI两类。

●SD卡使用卡内智能控制模块进行FLASH操作控制,包括协议、安全算法、数据存取、ECC●算法、缺陷处理和分析、电源管理、时钟管理●SD卡(Secure Digital Memory Card)是一种为满足安全性、容量、性能和使用环境等各方面的需求而设计的一种新型存储器件,SD卡允许在两种模式下工作,即SD模式和SPI模式。

1.2 系统研究背景本设计旨在深入对ARM的学习,巩固大学四年所学专业知识,提升动手能力和思考问题解决问题的能力。

基于嵌入式Linux的SD卡驱动程序的设计与实现 文字版

基于嵌入式Linux的SD卡驱动程序的设计与实现 文字版
通过向卡发送不同的命令,可以将卡从一个状态转移到另 外一个状态,同时获取我们需要的数据。图 3 描述了卡初始化 的状态转移关系图。其中 C M D 0( G O _ID L E _ST A T E)没有返回 数据,A C M D 41( SD _SE N D _O P_C O N D) 会通过 R 3 回应返回 O C R 信息,C M D(2 A L L _SE N D _C ID )通过 R 2 回应来返回 C ID 信息,C M D(3 SE N D _R E L A T IV E _A D D R)则通过 R 6 回应卡的 R C(A C ard A ddress)信息。
re turn -1; // 注册块设备驱动程序 blk_init_que ue (BLK_DEFAULT_QUEUE(ma jor),s d_re que s t); blk_de v[ma jor].re que s t_que ue .re que s t_fn = s d_re que s t; // 设置块设备的请求传输函数 re a d_a he a d[ma jor] = 10; s d_s ize s = kma lloc(3*s ize of(int),GFP _KERNEL); mmc_blk_s ize s = mmc_s ize s + 1; mmc_ha rd_s e cts = mmc_s ize s + 2; *mmc_s ize s = s d_info.s ize /1024; *s d_blk_s ize s = 1024; *s d_ha rd_s e cts = s d_info.ha rd_s e ct; blk_s ize [ma jor] = s d_s ize s ; blks ize _s ize [ma jor] = s d_blk_s ize s ; ha rds e ct_s ize [ma jor] = s d_ha rd_s e cts ; // 设置设备管理的设备大小、扇区大小信息 re turn 0; } 注册的主要工作是初始化 SD 卡,向内核注册块设备以 及设置块设备的信息。注册之后,L inux 在有数据要进行读 写的时候,会调用驱动程序的 request函数。下面是该函数的 伪代码: s ta tic void mmc_re que s t(re que s t_que ue _t *q) { uns igne d long nr; int blk; while (1) { INIT_REQUES T; // 检查缓冲队列是否为空 s witch(CURRENT->cmd) { ca s e READ:

一种基于ARM和Linux的超高频读写器设计

一种基于ARM和Linux的超高频读写器设计

Vo11 NO2 .l .
J n2 1 u .0 2

种基于 A M 和 Ln x的超高频读写器设计 R iu
石瑞英 - 玉霞 2 ,王
(. 木 斯 大 学信 息 电子 技 术 学院 ,黑龙 江佳 木斯 140 ;2七 台河 市科技 局 ,黑 龙 江七 台河 140) 1 佳 07 . 5 560
11 阅读 器到 射频 卡 之 间的通 信传 递 . 阅 读 器 发 送 的 数 据 信 号 采 用 调 制 载 波 幅 度
2 频 分 多址 ( D ) F MA):利用 不 矧 的副 载 波频 牢米 区分数 据通 道 。 3 时 分 多址 ( D ) T MA):按 时 间分配 通 道 的容
ielrs l b t nte rt a rs ac n p l ain mo gRF D tc n lge , Ia fe u n y ( d a e ut oh i h oei l e er ha d a pi t .A n I e h oo is ut — q e r UHF c c o r )RI D h sma )a v na e F a n’ d a tg s
要贮存数据 的信息 ,修改 电子标签 中的数据信 息 。
者利 用 排队 论和 抗噪 声技 术 米解 决这 个 问题 。射 频 识 别 系统 同时’ 以完 成对 多个 电子标 签 的识 别 , 防 町 碰撞 技 术 的好坏 决定 了射 频识 别系统 的性 能 。 1 多址接 入 的方式 防 冲突手 段 . 4 1 空 分 多址 ( D ) S MA):利用 分 离空 间 也 就 是 利 用 电子控 制 定 向的天线 。
向 不 需要识 别 系统 特 定 的 口标 之 间 的犬 系 。射 频

基于嵌入式ARM的SD卡的读写要点

基于嵌入式ARM的SD卡的读写要点

摘要SD卡(Secure Digital Memory Card)中文翻译为安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。

本实训的作品是利用基于ARM Cotex-M3内核的嵌入式处理器STM32自带的SDIO硬件接口来驱动SD卡,并结合文件系统 FATFS R0.07C来完成一个基于嵌入式ARM的SD卡读写的作品,现实向SD 卡写入一个txt文件,并读取SD卡的文件目标并通过串口打印到PC机显示。

关键词:嵌入式;ARM;STM32;SD卡;文件系统AbstractSD Card (Secure Digital Memory Card) Chinese translation for Secure Digital Card, it is a kind of based on semiconductor flash Memory of a new generation of Memory device, it is widely used in portable devices, such as Digital cameras, personal Digital assistant (PDA) and multimedia player, etc. This training work is based on ARM Cotex - M3 kernel embedded processor STM32 own SDIO hardware interface to drive the SD card, and combined with the file system FATFS R0.07 C to complete a based on embedded ARM of the SD card, speaking, reading and writing work, reality to SD card to a TXT file, and read SD card file goals and through the serial port print to PC display.Key words:embedded;ARM;STM32; SD Card; File system目录1 前言 (1)1.1ARM应用背景 (1)1.2研究内容 (2)1.3研究成果 (3)2 STM32处理器概述 (3)2.1STM32简介 (3)2.1.1 STM32F103VET6的参数 (4)2.2内部资源 (6)2.3C ORTEX-M3内核简介 (6)2.4STM32SDIO简介 (7)2.4.1 SDIO简介 (7)2.4.2 SDIO功能特性 (8)3 SDIO的原理及实现方法 (8)3.1原理 (9)3.2SDIO适配器 (10)3.3SDIO卡识别过程 (11)3.4SDIO写数据块 (12)3.5SDIO读数据块 (13)4 FATFS文件系统 (13)4.1F A T FS文件系统简介 (13)4.2F A T FS文件系统移植 (14)4.2.1移植前工作 (14)4.2.2开始移植 (14)5 测试及结果 (15)5.1JTAG仿真器介绍 (16)5.2现象及结果 (16)6 结论 (18)致谢 (19)参考文献 (20)1 前言1.1 ARM应用背景如今,学习一种处理器的就有许多ARM内核的处理器可供使用,现在社会已步入嵌入式学习阶段。

读写SDMMC卡_SmartARM2200_

读写SDMMC卡_SmartARM2200_

ZLG/FS读写SD/MMC卡(SmartARM2200) 1.实验目的学会使用ZLG/SD软件包访问SD/MMC卡。

学会综合使用ZLG/FS软件包和ZLG/SD软件包以文件形式访问SD/MMC卡。

2.实验设备硬件:SmartARM2200开发板一套SD或MMC卡一张SD/MMC卡读卡器一个软件:Windows98/XP/2000操作系统,ADS 1.2集成开发环境µC/OS-II操作系统(V2.52)ZLG/SD软件包,ZLG/FS软件包3.实验内容综合利用ZLG/SD软件包与ZLG/FS软件包,ZLG/FS文件系统软件包通过ZLG/SD软件包以文件的形式来访问SD/MMC卡。

在SD/MMC卡上创建一个目录“ARM&FATS”和一个文本文件“单片机.txt”,并往该文件中添加内容。

4.实验预习要求仔细阅读《ARM嵌入式系统实验教程(二)》第1章的内容,了解SmartARM2200开发板的硬件结构。

仔细阅读《ARM嵌入式系统实验教程(二)》的内容,了解ADS 1.2集成开发环境、LPC2200专用工程模板、EasyJTAG仿真器的应用。

仔细阅读《ZLG_SD使用手册》(见产品光盘目录:ARM嵌入式系统实验教程(二)\第4章_基于uCOS-II的综合实验\4.4_SDMMC卡读卡器实验),理解ZLG/SD软件包的使用方法。

5.实验原理ZLG/FS是一个可移植到不同CPU上运行的文件系统管理软件包(支持FAT12、FAT16、FAT32文件系统),通过移植该软件包的读/写存储器接口函数,可以以文件的形式读/写如CF卡、SD/MMC卡、Flash芯片等存储介质。

本实验将示例用ZLG/FS文件系统读/写SD/MMC卡。

ZLG/FS读写SD/MMC卡必须移植一个函数,在本实验中,该函数为:uint16 SDCammand(uint8 Cammand, void *Parameter)下面的实验步骤将会提到该函数所在的文件。

arm与内存数据访问有关的指令

arm与内存数据访问有关的指令

arm与内存数据访问有关的指令在计算机科学中,ARM(Advanced RISC Machines)是一种广泛使用的指令集架构(ISA),它适用于各种应用,从移动设备到嵌入式系统和超级计算机。

ARM架构的突出特点之一是其能够高效地访问内存数据的能力。

在本文中,我们将探讨与ARM架构中内存数据访问相关的指令。

ARM架构中的指令具有灵活性和可扩展性,可以执行各种读取和写入内存数据的操作。

下面是一些与内存数据访问相关的指令:1. LDR(Load Register):这个指令用于将内存中的数据加载到寄存器中。

例如,LDR R0, [R1]指令将从存储在地址R1处的内存中获取数据,并将其加载到寄存器R0中。

2. STR(Store Register):这个指令用于将寄存器中的数据存储到内存中的指定位置。

例如,STR R0, [R1]指令将将寄存器R0中的数据存储在地址R1处的内存中。

3. LDM(Load Multiple):这个指令用于从内存中连续加载多个数据到多个寄存器中。

例如,LDM R0!, {R1-R3}指令将从地址R0开始的连续内存区域加载数据到R1、R2和R3寄存器中,同时更新R0的值。

4. STM(Store Multiple):这个指令用于将多个寄存器中的数据一次存储到内存中。

例如,STM R0!, {R1-R3}指令将寄存器R1、R2和R3中的数据一次性存储到地址R0开始的连续内存区域中,并更新R0的值。

5. SWP(Swap Data):这个指令用于原子地交换内存中的数据与寄存器中的数据。

例如,SWP R0, R1, [R2]指令将内存地址R2处的数据与寄存器R0的值进行交换,并将交换前的内存数据加载到R1中。

6. LDRB(Load Register Byte):这个指令用于从内存中加载一个字节大小的数据到寄存器中。

例如,LDRB R0, [R1]指令将从地址R1处的内存加载一个字节的数据,并将其加载到R0寄存器中。

基于嵌入式系统的多媒体音乐播放器

基于嵌入式系统的多媒体音乐播放器

基于嵌入式系统的多媒体音乐播放器宫鹏;宫玥;王瑞宝【摘要】为了改善音乐播放器传统界面,扩充功能,提高音质,基于ARM7嵌入式系统平台和FAT 32文件系统,设计了一款带有文本阅览功能的多媒体音乐播放器.它不仅能正确识别并显示存储在SD,MMC等存储卡内的音频文件,支持环绕立体声调节和重低音调节,还可通过液晶屏浏览存储在存储卡内的中、英文TXT文档.该播放器选用具有出色音频解码能力的VS1053解码芯片,它支持320 Kb/s的MP3或256 Kb/s的WMA音乐文件的播放.该播放器通过视听验证,实现了4种以上不同的音效,满足使用者对音效的不同喜好.实现了环绕立体声调节和真正的立体声双声道音频输出.同时在操作上简单便捷,具有友好的人机界面.%To perfect the tranditional interface, extend the functions, and improve the tone quality of music player, a multimedia music player with text readLng function was designed based on Arm7 embedded platform and FAT32 file system. It not only can recognize and display MP3 and WMA files stored in memory cards (such as SD and MMC, etc. ) , support the tuning of surround sound and mega bass, but also can read Chinese or English TXT documents stored in memory card by LCD. The vs1053 decoding chip which has a perfect voice frequency decoding ability is chosen for the player. It supports the play of 320 kbps MP3 and 253kbps WMA files. More than four sound effects of the player can meet the requirement of different users.The tuning of surround sound and the output of real stereo dual-sound channel were achieved. Moreover, this system with excellent human-machine interface is easy to operate.【期刊名称】《现代电子技术》【年(卷),期】2011(034)012【总页数】4页(P100-103)【关键词】ARM7;SD卡;多媒体播放器;VS1053【作者】宫鹏;宫玥;王瑞宝【作者单位】青岛大学自动化工程学院,山东青岛266071;青岛有线电视网络中心,山东青岛266000;青岛有线电视网络中心,山东青岛266000【正文语种】中文【中图分类】TN911-34;TP3330 引言嵌入式系统具有处理速度快、低功耗、体积小、功能强大且易于移植等优点而得到广泛的应用。

单片机读写SD卡教程

单片机读写SD卡教程

单片机读写SD卡教程引言:SD卡(Secure Digital Card)是广泛应用于各类数字设备上的一种存储介质。

它小巧轻便,可靠性高,容量大,因此在各种嵌入式系统中都广泛使用。

本教程将介绍如何使用单片机读写SD卡,包括初始化SD卡、读写数据等基本操作。

一、硬件准备在开始之前,我们需要准备以下硬件设备:1.一个支持SPI协议的单片机开发板(例如STC89C51、STM32等);2.一个SD卡插槽,或者是一个带有SD卡插槽的扩展板;3.杜邦线、面包板等连接器。

二、软件准备除了硬件设备,我们还需要准备以下软件工具:1. Keil C51、IAR、Keil MDK等单片机编译工具;2. SD卡相关的库文件,例如FatFs;3.一个用于测试的程序(可以是一个简单的读写数据的程序)。

三、连接SD卡插槽将SD卡插入到对应的插槽中,并将插槽与单片机的硬件SPI接口连接。

根据不同的开发板,连接方式可能有所不同,一般SPI接口包括SCK(时钟线)、MOSI(主机输出从机输入线)、MISO(主机输入从机输出线)和CS(片选线)等。

四、编写读写SD卡的程序在开始编写程序之前,我们需要先了解SD卡的工作原理。

SD卡通过SPI总线与单片机进行通信,通过发送特定的命令和参数实现读写操作。

以下是一个简单的读写SD卡的流程:1.初始化SD卡a.发送CMD0命令,将SD卡设置为SPI模式;b.发送CMD8命令,验证SD卡是否支持高速SPI模式;c.发送ACMD41命令,等待SD卡初始化完成。

2.读写数据a.发送CMD17命令,指定要读取的扇区地址;b.等待SD卡回应,确认读取命令执行成功;c.读取数据;d.发送CMD18命令,继续读取下一个扇区;e.重复步骤c和d,直到读取完所有数据;f.发送CMD12命令,停止读取。

g.发送CMD24命令,指定要写入的扇区地址;h.等待SD卡回应,确认写入命令执行成功;i.写入数据;j.发送CMD25命令,继续写入下一个扇区;k.重复步骤i和j,直到写入完所有数据;l.发送CMD12命令,停止写入。

MCS51 MCU读写SD卡版(单片机论文)

MCS51 MCU读写SD卡版(单片机论文)

摘要摘要近年来, SD存储卡在嵌入式产品中的应用越来越广泛, 但SD卡接口一般仅集成在32位高端处理器中, 一般51单片机则由于资源限制没有该接口。

因此,如何解决51单片机应用系统存取SD卡大容量数据就显得很有实际意义。

本系统使用MXT8051F04A作为单片机与SD卡的接口芯片, 采用SPI串行方式对SD卡的扇区进行读写,读写过程和结果通过串口调试助手在主机上显示。

本论文的核心主要从硬件设计和软件编程两个大的方面介绍了系统的实现。

硬件电路设计主要包括MXT8051F04A最小系统电路、电源电路、串口电路、SD卡接口电路。

程序采用C语言在Keil软件下进行编写、调试,程序主要包括SD卡扇区读写程序、串口程序等软件模块。

系统实现了对SD卡扇区的读写,达到了设计的要求和目的。

关键字:MXT8051F04A,SD卡,KeilIABSTRACTABSTRACTIn recent years, SD memory card applications in the embedded products more widely, but generally only the integrated SD card interface in 32-bit high-end processor, microcontroller 51 is generally not the interface due to resource constraints. Therefore, how to solve the 51 SCM applications to access data on large-capacity SD cards seem very practical.The system uses MXT8051F04A as SCM and SD card interface chip, using SPI mode on the SD card serial read and write sectors, reading and writing process and results through the serial port on the host display debugging assistant. The core of this thesis, the main hardware and software design introduces two major aspects of the system implementation. Hardware design includes MXT8051F04A minimum system circuit, power circuit, the serial port circuitry, SD card interface circuit. Program using C language under the Keil software write, debug, the program includes reading and writing SD card sector program, serial procedures of software modules. System realizes the SD card read and write sectors, meets the design requirements and objectives.Keywords: MXT8051F04A,SD Card,KeilII目录第1章引言 (1)1.1 选题背景 (1)1.2 研究目标和意义 (1)1.3 本文要完成的工作 (1)第2章单片机读写SD卡的硬件电路设计 (3)2.1 系统硬件平台组成 (3)2.2 电源模块 (3)2.3 MXT8051F04A单片机最小系统电路设计 (4)2.3.1 MXT8051F04A简介 (4)2.3.2 晶振复位电路 (8)2.4 SD卡电路设计 (8)2.4.1 通讯模式 (9)2.4.2 电平匹配 (9)2.4.3 硬件接口设计 (10)2.5 串口电路设计 (12)2.6 PCB绘制 (13)2.7 本章小结 (14)第3章单片机读写SD卡的软件设计 (14)3.1 SD卡的扇区读写 (14)3.1.1 模拟SPI协议 (14)3.1.2 SD卡命令 (15)3.1.3 SD卡的初始化 (19)3.1.4 数据块的读写 (20)3.2 串口程序 (25)第4章调试 (26)4.1 系统硬件调试 (26)4.2 软件调试 (27)4.3 软硬件的联合调试 (27)III4.4 本章小结 (29)第5章结束语 (30)5.1 总结 (30)5.2 展望 (30)参考文献 (31)致谢 (32)附录 (33)附录一:单片机读写SD卡的完整原理图 (33)附录二:单片机读写SD卡的完整程序 (36)外文资料原文 (63)译文 (64)IV第1章引言第1章引言1.1选题背景SD卡(Secure Digital Memory Card)中文翻译为安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如个人数码助理(PDA)、数码相机和多媒体播放器等。

ARM9架构下WINCE6.0 SD卡写入速度

ARM9架构下WINCE6.0 SD卡写入速度

ARM9 CE6下SD卡的写入测试结果SUNNY.MAN一.ARM架构下的WINCE 6.0 SD卡测试1.硬件结构及操作系统:CPU:ATMEL AT91SAM9G45 ARM9 处理器,主频400MHz。

SD:SD卡(4G)OS: WINCE 6.02.软件的测试过程:A:用CreateThread创建一个文件写入线程。

B:在线程的回调函数里DealThread,调用文件操作API函数。

并计算流逝的时间。

C:代码片断:CCEFileStd CEFile;//CE下文件操作类CMyCalTime Time1;//用来计算流逝的时间CEFile.SetFileName(L"T est.mhy");CEFile.FileOpen(CCEFile::OpenforCreate);Time1.Start();int nBlock=128*1024;//128K写入块大小char *buf=new char[nBlock];__int64 nT otal=nBlock*80;//循环次数for(int i=0;i<80;i++){CEFile.FileWrite(buf,nBlock);}CEFile.FileClose();delete[] buf;double ms=Time1.GetEspMS();CString str;str.Format(L"totalTime=%f,speed=%5.2f(M/S)",ms,nCount/ms);AfxMessageBox(str);D:CCEFileStd中主要使用API函数主要使用CreateFile和CloseHandle以及WriteFile和ReadFile四个API函数。

3.测试结果:4.结论:SD卡的平均写入速度大约在2MB/S左右。

并且写入的速度随着入块的变大而显著增长,但当写入块超过16K后,写入速度没有显著的变化了。

sd卡数据读写流程

sd卡数据读写流程

sd卡数据读写流程SD卡是一种常见的存储媒介,它具有轻便、易携带、容量大、存储速度快等优势。

SD卡数据读写流程是指将数据从SD卡中读取出来或将数据写入SD卡中的整个过程。

一、SD卡的物理结构SD卡主要由控制器、记忆芯片和接口组成。

控制器负责管理SD卡的读写操作;记忆芯片是存储数据的核心部件,它采用闪存技术,可存储数据并保持数据不易丢失;接口是SD卡与主控制器进行通信的桥梁,一般采用SPI(串行外设接口)或SDIO(SD输入输出)接口。

二、SD卡读写流程1.初始化SD卡当主控制器接通SD卡电源时,首先要进行初始化操作。

初始化操作主要包括向SD卡发送复位命令、读取SD卡的OCR(操作条件寄存器)以及设置SPI或SDIO接口的工作参数等操作。

2.读取SD卡信息在SD卡初始化成功后,主控制器通过SPI或SDIO接口向SD 卡发送命令,读取SD卡ID信息、SD卡容量、SD卡速度等重要参数。

这些信息将在数据读写时起到重要作用。

3.读取文件SD卡上的文件存储在文件系统中,主控制器需要先读取文件系统,找到要读取的文件所在的位置。

一般情况下,文件系统采用FAT32格式,主控制器需要读取文件系统启动区扇区信息,从而找到文件所在扇区及其起始地址。

4.读取数据在找到文件所在位置后,主控制器就可以根据文件系统的信息,向SD卡发送读操作指令,读取文件数据。

读取数据时,主控制器需要根据SD卡的速度、数据传输模式等参数设置接口波特率、时序等参数。

5.写入数据SD卡写数据流程与读数据基本相同,只是主控制器需要向SD卡发送写操作指令,将数据写入SD卡中。

写入数据时,主控制器需要根据SD卡的容量、速度等参数设置写入数据的起始位置、写入数据的长度、写入数据的校验和等参数。

6.关闭SD卡当读写操作完成后,主控制器需要向SD卡发送停止指令,将SD卡彻底关闭。

关闭SD卡可以避免SD卡数据丢失、损坏等问题。

三、SD卡的数据保护SD卡存储的数据非常重要,因此在SD卡的读写过程中,需要采取一定的措施保护数据。

(整理)stm32Fatfs读写SD卡.

(整理)stm32Fatfs读写SD卡.

stm32 Fatfs 读写SD卡读写SD是嵌入式系统中一个比较基础的功能,在很多应用中都可以用得上SD 卡。

折腾了几天,总算移植成功了最新版Fatfs(Fatfs R0.09),成功读写SD卡下文件。

FatFs (/fsw/ff/00index_e.html)是一个通用的文件系统模块,用于在小型嵌入式系统中实现FAT文件系统。

FatFs 的编写遵循ANSI C,因此不依赖于硬件平台。

它可以嵌入到便宜的微控制器中,如8051, PIC, AVR, SH, Z80, H8, ARM 等等,不需要做任何修改。

1. SD卡/TF卡硬件接口SD卡有两种操作接口,SDIO和SPI。

使用SDIO口的速度比较快,SPI的速度比较慢。

SD卡引脚描述如下: SD卡SPI接法如下:我使用的是正点原子的开发板,所以采用的是SPI接口的模式。

TF卡SDIO 模式和SPI模式引脚定义:可以发现Micro SD卡只有8个引脚是因为比SD卡少了一个Vss。

使用TF转SD的卡套套在Micro SD卡上,这样一来大小就和SD卡一样大,这时候卡套上的9个引脚就和SD卡一样了,你可以完全当做SD卡来操作。

2. SD卡底层驱动SD卡的操作比较复杂,需要多看看一些文档。

这里附上SD底层驱动代码,代码说明详见注释Sd卡SPi操作底层代码: sdcard.c sdcard.h3. Fatfs 移植FatFs 软件包中相关文件:ffconf.h FatFs 模块配置文件ff.h FatFs 和应用模块公用的包含文件ff.c FatFs 模块diskio.h FatFs and disk I/O 模块公用的包含文件integer.h 数据类型定义option 可选的外部功能diskio.c FatFs 与disk I/O 模块接口层文件(不属于FatFs 需要由用户提供)FatFs 配置,文件系统的配置项都在ffconf.h 文件之中:(1) _FS_TINY :这个选项在R0.07 版本之中开始出现,在之前的版本都是以独立的文件出现,现在通过一个宏来修改使用起来更方便;(2) _FS_MINIMIZE、_FS_READONLY、_USE_STRFUNC、_USE_MKFS、_USE_FORWARD 这些宏是用来对文件系统进行裁剪(3) _CODE_PAGE :本选项用于设置语言码的类型(4) _USE_LFN :取值为0~3,主要用于长文件名的支持及缓冲区的动态分配:0:不支持长文件名;1:支持长文件名存储的静态分配,一般是存储在BSS 段;2:支持长文件名存储的动态分配,存储在栈上;3:支持长文件名存储的动态分配,存储在堆上。

嵌入式系统开发基础——基于ARM微处理器和Linux操作系统课后习题答案

嵌入式系统开发基础——基于ARM微处理器和Linux操作系统课后习题答案
intHE=sum(array, 10);
printf(“The sum of array is %d”, HE);
}
//huibian.s
AREAASM, CODE, READONLY
EXPORTsum
sumMOVR2, #0
LOOPLDRR3, [R0], #4
ADDR2, R2, R3
SUBR1, R1, 1
2-1略。
2-2略
2-3略
2-4按照要求完成以下操作。
(1)创建文件夹test。
mkdir test
(2)进入test目录。
cd test
(3)在test目录下用Vi编辑一个新文件test.c,其内容如下:
#include <stdio.h>
intmain()
{
int a,i=0;
a=0;
while(i<20)
}
(1)如果上述文件在同一个目录,请编写Makefile文件。
(2)如果按照下面的目录结构存放文件,请编写Makefile文件。
|---bin存放生成的可执行文件
|---obj存放.o文件
|---include存放display1.h和display2.h文件
|---src存放main.c、display1.c、display2.c和Makefile
(3)将内核映像和根文件系统映像从Flash存储器上读到RAM空间中。
(4)为内核设置启动参数。
(5)调用内核。
3-3答:
1.数据结构file_operations
2.设备注册:驱动程序模块通过函数register_chrdev来完成内核的注册。
3.设备卸载:驱动程序模块通过函数unregister_chrdev来完成内核的卸载。

SD卡读写操作详细说明

SD卡读写操作详细说明

SD卡读写操作详细说明SD卡(Secure Digital Card)是一种常见的存储设备,广泛应用于各种数码设备,如相机、手机、音乐播放器等。

SD卡读写操作是指对SD卡进行数据的读取和写入操作。

本文将详细介绍SD卡的读写操作流程和相关细节。

一、SD卡读写操作的基本原理SD卡采用了Flash存储技术,数据的读写是通过对存储芯片中的电荷进行控制实现的。

每个存储单元可以存储一个位(0或1),多个存储单元可以组成字节、块等不同大小的数据单元。

二、SD卡的初始化在进行SD卡的读写操作之前,首先需要对SD卡进行初始化。

SD卡的初始化包括以下几个步骤:1.插入SD卡:将SD卡插入到SD卡插槽中。

2.电源供给:给SD卡供电,使其可以正常工作。

3.寻卡:通过命令与SD卡进行通信,找到SD卡并识别其属性和参数。

三、SD卡的读操作SD卡的读操作是指从SD卡中读取数据。

SD卡的读操作流程如下:1.发送读命令:通过控制器向SD卡发送读命令,告知SD卡要读取的数据的起始地址和长度。

2.接收应答:SD卡接收到读命令后,会返回一个应答信号,确认是否接收到了读命令。

3.读取数据:当SD卡接收到读命令后,在指定的地址范围内读取数据,并将数据传输给控制器。

4.数据传输:控制器接收到SD卡传输的数据后,将数据转发给主机或其他设备进行处理。

四、SD卡的写操作SD卡的写操作是指向SD卡中写入数据。

SD卡的写操作流程如下:1.发送写命令:通过控制器向SD卡发送写命令,告知SD卡要写入的数据的起始地址和长度。

2.接收应答:SD卡接收到写命令后,会返回一个应答信号,确认是否接收到了写命令。

3.写入数据:当SD卡接收到写命令后,在指定的地址范围内写入数据。

4.数据传输:控制器向SD卡传输要写入的数据,SD卡接收到数据后进行存储。

五、SD卡的块操作SD卡的读写操作是以块为单位进行的,一个块的大小一般为512字节。

SD卡的块操作流程如下:1.发送块命令:通过控制器向SD卡发送块命令,告知SD卡要进行块操作的起始块号和块数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

摘要SD卡(Secure Digital Memory Card)中文翻译为安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。

本实训的作品是利用基于ARM Cotex-M3内核的嵌入式处理器STM32自带的SDIO硬件接口来驱动SD卡,并结合文件系统 FATFS R0.07C来完成一个基于嵌入式ARM的SD卡读写的作品,现实向SD 卡写入一个txt文件,并读取SD卡的文件目标并通过串口打印到PC机显示。

关键词:嵌入式;ARM;STM32;SD卡;文件系统AbstractSD Card (Secure Digital Memory Card) Chinese translation for Secure Digital Card, it is a kind of based on semiconductor flash Memory of a new generation of Memory device, it is widely used in portable devices, such as Digital cameras, personal Digital assistant (PDA) and multimedia player, etc. This training work is based on ARM Cotex - M3 kernel embedded processor STM32 own SDIO hardware interface to drive the SD card, and combined with the file system FATFS R0.07 C to complete a based on embedded ARM of the SD card, speaking, reading and writing work, reality to SD card to a TXT file, and read SD card file goals and through the serial port print to PC display.Key words:embedded;ARM;STM32; SD Card; File system目录1 前言 (1)1.1ARM应用背景 (1)1.2研究内容 (2)1.3研究成果 (3)2 STM32处理器概述 (3)2.1STM32简介 (3)2.1.1 STM32F103VET6的参数 (4)2.2内部资源 (6)2.3C ORTEX-M3内核简介 (6)2.4STM32SDIO简介 (7)2.4.1 SDIO简介 (7)2.4.2 SDIO功能特性 (8)3 SDIO的原理及实现方法 (8)3.1原理 (9)3.2SDIO适配器 (10)3.3SDIO卡识别过程 (11)3.4SDIO写数据块 (12)3.5SDIO读数据块 (13)4 FATFS文件系统 (13)4.1F A T FS文件系统简介 (13)4.2F A T FS文件系统移植 (14)4.2.1移植前工作 (14)4.2.2开始移植 (14)5 测试及结果 (15)5.1JTAG仿真器介绍 (16)5.2现象及结果 (16)6 结论 (18)致谢 (19)参考文献 (20)1 前言1.1 ARM应用背景如今,学习一种处理器的就有许多ARM内核的处理器可供使用,现在社会已步入嵌入式学习阶段。

在嵌入式领域,8位处理器已经不再胜任一些复杂的应用,比如GUI,TCP/IP,FILESYSTEM等,而ARM芯片凭借强大的处理能力和极低的功耗,非常适合这些场合。

现在越来越多的产品在选型的时候考虑到使用ARM处理器,ARM的应用是相当的广泛。

ARM的嵌入式控制应用如:汽车、电子设备、保安设备、大容量存储器、调制解调器、打印机等。

一个典型的ARM嵌入式工业控制系统的功能模块如图1-1所示。

图1-1 ARM嵌入式工业控制系统的功能模块目前已有超过85%的无线通信设备采用了ARM技术,ARM以其高性能和低成本,在该领域的地位日益巩固。

ARM在此方面的应用如:手提式计算机、移动电话、PDA等。

随着宽带技术的推广,采用ARM技术的ADSL芯片正逐步获得竞争优势。

此外,ARM在语音及视频处理上进行了优化,并获得广泛支持。

ARM技术在目前流行的数字音频播放器、数字机顶盒、游戏机、数码相机、数字式电视机、GPS、机顶盒中得到广泛采用。

现在流行的数码相机和打印机中绝大部分采用ARM技术,手机中的32位SIM智能卡也采用了ARM技术。

如图1-2所示是基于ARM技术的数码相机的功能模块[9]。

1.2 研究内容本设计旨在加深对ARM的学习,巩固大学四年所学专业知识,提升动手能力和思考问题解决问题的能力。

本设计选择意法半导体的STM32F103系列处理器,通过自制STM32开发板的过程,和对STM32F103C8T6芯片的研究学习,掌握其各种外设功能。

STM32F103VET6具有一个SDIO接口。

SD/SDIO/MMC主机接口可以支持MMC卡系统规范4.2版中的3个不同的数据总线模式:1位(默认)、4位和8位。

在8位模式下,该接口可以使数据传输速率达到48MHz,该接口兼容SD存储卡规范2.0版。

SDIO 存储卡规范2.0版支持两种数据总线模式:1位(默认)和4位。

目前的芯片版本只能一次支持一个SD/SDIO/MMC 4.2版的卡,但可以同时支持多个MMC 4.1版或之前版本的卡。

除了SD/SDIO/MMC,这个接口完全与CE-ATA 数字协议版本1.1兼容。

本实训的作品是利用基于ARM Cotex-M3内核的嵌入式处理器STM32自带的SDIO硬件接口来驱动SD卡,并结合文件系统 FATFS R0.07C来完成一个基于嵌入式ARM的SD卡读写的作品,现实向SD卡写入一个txt文件,并读取SD卡的文件目标并通过串口打印到PC机显示。

本文第一章讲述了该论文写作背景,主要阐述了ARM应用范畴,以及该论文研究的内容;第二章讲述了该研究课题使用的核心芯片STM32F103VET6的各项参数;第三章着重介绍了SDIO的原理及实现方法;第四章着重介绍了FAT文件系统的原理;第五章介绍了测试方法和结果。

1.3 研究成果给硬件系统供电(5V),插上JLINK,插上串口线(两头都是母的交叉线),插上MicroSD卡,打开超级终端,配置超级终端为115200 8-N-1,将编译好的程序下载到硬件平台,即可看到超级终端打印出如下信息:图1-3 显示结果图2 STM32处理器概述2.1 STM32简介STM32F103xx增强型系列使用高性能的ARM/Cortex-M3/32位的RISC内核,工作频率为72MHz,内置高速存储器(高达128K字节的闪存和20K字节的SRAM),丰富的增强I/O端口和联接到两条APB总线的外设。

所有型号的器件都包含2个12位的ADC 、3个通用16位定时器和一个PWM定时器,还包含标准和先进的通信接口:多达2个I2C和SPI、3个USART、一个USB和一个CAN。

STM32F103xx增强型系列工作于-40℃至+105 ℃的温度范围,供电电压2.0V至3.6V,一系列的省电模式保证低功耗应用的要求。

完整的STM32F103xx增强型系列产品包括从36脚至100脚的五种不同封装形式;根据不同的封装形式,器件中的外设配置不尽相同。

下面给出了该系列产品中所有外设的基本介绍。

这些丰富的外设配置,使得STM32F103xx增强型微控制器适合于多种应用场合:·电机驱动和应用控制;·医疗和手持设备;·PC外设和GPS平台;·工业应用:可编程控制器、变频器、打印机和扫描仪;·警报系统,视频对讲,和暖气通风空调系统;2.1.1 STM32F103VET6的参数STM32F103VET6芯片的参数如表2-1表2-1 器件功能和配置(STM32F103xx 增强型)芯片引脚图如图2-2:图2-2 STM32F103xx增强型LQPFP100管脚图2.2 内部资源STM32有丰富的内部资源,如下所示:·RealView MDK(Miertocontroller Development Kit)基于ARM微控制器的专业嵌入式开发工具;·内置闪存存储器;·内置SRAM;·嵌套的向量式中断控制器(NVIC);·外部中断/事件控制器(EXTI);·时钟和启动;·自举模式;·DMA ;·RTC(实时时钟)和后备寄存器;·窗口看门狗;·I2C总线;·通用同步/异步接受发送器(USART);·串行外设接口(SPI);·控制器区域网络(CAN) ;·通用串行总线(USB);·通用输入输出接口(GPIO);·ADC(模拟/数字转换器) ;·温度传感器;·串行线JTAG调试口(SWJ-DP)。

2.3 Cortex-M3内核简介Cortex-M3内核包含一个适用于传统Thumb和新型Thumb-2指令的译码器、一个支持硬件乘法和硬件除法的先进ALU、控制逻辑和用于连接处理器其他部件的接口。

Cortex-M3处理器是首款基于ARMv7-M架构的ARM处理器。

中央Cortex-M3内核使用3级流水线哈佛架构,运用分支预测、单周期乘法和硬件除法功能实现了出色的效率(1.25DMIPS/MHz)。

Cortex-M3处理器是一个32位处理器,带有32位宽的数据路径、寄存器库和基于传统ARM7处理器的系统只支持访问对齐的数据,沿着对齐的字边界即可对数据进行访问和存储。

Cortex-M3处理器采用非对齐数据访问方式,使非对齐数据可以在单核访问中进行传输。

Cortex-M3处理器是专为那些对成本和功耗非常敏感但同时对性能要求又相当高的应用而设计的。

凭借缩小的内核尺寸和出色的中断延迟性能、集成的系统部件、灵活的配置、简单的高级编程和强大的软件系统,Cortex-M3处理器将成为从复杂的芯片系统到低端微控制器等各种系统的理想解决方案。

表2-3为Cortex-M3处理器与ARM7作比较。

表2-3 Cortex-M3与ARM7相比较2.4 STM32 SDIO简介2.4.1 SDIO简介STM32F103VET6具有一个SDIO接口。

SD/SDIO/MMC主机接口可以支持MMC卡系统规范4.2版中的3个不同的数据总线模式:1位(默认)、4位和8位。

相关文档
最新文档