参考基于stm32的fat32文件系统Word文件下载.docx

上传人:b****6 文档编号:20625598 上传时间:2023-01-24 格式:DOCX 页数:61 大小:41.50KB
下载 相关 举报
参考基于stm32的fat32文件系统Word文件下载.docx_第1页
第1页 / 共61页
参考基于stm32的fat32文件系统Word文件下载.docx_第2页
第2页 / 共61页
参考基于stm32的fat32文件系统Word文件下载.docx_第3页
第3页 / 共61页
参考基于stm32的fat32文件系统Word文件下载.docx_第4页
第4页 / 共61页
参考基于stm32的fat32文件系统Word文件下载.docx_第5页
第5页 / 共61页
点击查看更多>>
下载资源
资源描述

参考基于stm32的fat32文件系统Word文件下载.docx

《参考基于stm32的fat32文件系统Word文件下载.docx》由会员分享,可在线阅读,更多相关《参考基于stm32的fat32文件系统Word文件下载.docx(61页珍藏版)》请在冰豆网上搜索。

参考基于stm32的fat32文件系统Word文件下载.docx

2))<

5)|(((uint)b)>

3))//r红色分量

0~31g绿色分量0~63b蓝色分量0~31

LCD.c"

/********************************变量定义

---------------------------------------------------------*/GPIO_InitTypeDefGPIO_InitStructure;

ErrorStatusHSEStartUpStatus;

unsignedcharcsd_data[16];

unsignedcharcid_data[16];

unsignedcharby;

unsignedintc_size,c_size_mult,read_bl_len;

unsignedlongdrive_size;

unsignedlongsize_mb;

/*********************************声明函数-----------------------------------------------*/

voidRCC_Configuration(void);

voidNVIC_Configuration(void);

voidDelay(vu32nCount);

/******************************************************************************

*

主函数

*******************************************************************************

/

intmain(void)

{

ucharitem;

RCC_Configuration();

//系统时钟配置函数

NVIC_Configuration();

//NVIC配置函数

//启动GPIO模块时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|

RCC_APB2Periph_AFIO,ENABLE);

//把调试设置普通IO口

GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;

//所有GPIO为同一类型端口

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

//推挽输出

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

//输出的最大频率为50HZ

GPIO_Init(GPIOA,&

GPIO_InitStructure);

//初始化GPIOA端口

GPIO_Init(GPIOB,&

//初始化GPIOB端口

GPIO_Write(GPIOA,0xffff);

//将GPIOA16个端口全部置为高电平

GPIO_Write(GPIOB,0xffff);

//将GPIOB16个端口全部置为高电平

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;

LCD_Init();

LCD_clear

(2);

//这句是显示背景颜色。

T_CS

(1);

//SD卡初始化

MMC_Reset();

MMC_Init();

if(Init_Flag==0)LCD_ShowString(20,5,colors[0],colors[7],"

SDSUCCESS"

);

elseLCD_ShowString(20,5,colors[0],colors[7],"

SDFAILURE"

pArg=&

Init_Arg_SD;

//pArg是znFAT的“初始参数结构指针”,它所指向的结构体中记录了存储器及其文件系统的重要参数信息

//在切换存储设备时,不光要更改设备号,还要将pArg指向相应存储设备的“初始参数结构”

Dev_No=SDCARD;

//设备号为SDCARD,znFAT中将其宏定义为0

FAT32_Init();

//文件系统初始化,使用znFAT前必须进行初始化,初始化过程中将所使用的存储设备的文件系统的一些重要参数

//记录到了pArg所指向的结构中,以备后面使用

item=0;

while

(1)

{UINT8rRe;

rRe=FAT32_Open_File(&

FileInfo,"

\\*.bmp"

item);

if(rRe==0)//打开成功,则显示图像

display_pic();

item++;

}

elseitem=0;

*配置RCC

voidRCC_Configuration(void)

//复位RCC外部设备寄存器到默认值

RCC_DeInit();

//打开外部高速晶振

RCC_HSEConfig(RCC_HSE_ON);

//等待外部高速时钟准备好

HSEStartUpStatus=RCC_WaitForHSEStartUp();

if(HSEStartUpStatus==SUCCESS)//外部高速时钟已经准别好

//开启FLASH的预取功能

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

//FLASH延迟2个周期

FLASH_SetLatency(FLASH_Latency_2);

//配置AHB(HCLK)时钟=SYSCLK

RCC_HCLKConfig(RCC_SYSCLK_Div1);

//配置APB2(PCLK2)钟=AHB时钟

RCC_PCLK2Config(RCC_HCLK_Div1);

//配置APB1(PCLK1)钟=AHB1/2时钟

RCC_PCLK1Config(RCC_HCLK_Div2);

//配置PLL时钟==外部高速晶体时钟*9PLLCLK=8MHz*9=72MHz

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);

//使能PLL时钟

RCC_PLLCmd(ENABLE);

//等待PLL时钟就绪

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)

//配置系统时钟=PLL时钟

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

//检查PLL时钟是否作为系统时钟

while(RCC_GetSYSCLKSource()!

=0x08)

/*******************************************************************************

*NVIC配置函数

*******************************************************************************/

voidNVIC_Configuration(void)

#ifdefVECT_TAB_RAM

/*SettheVectorTablebaselocationat0x20000000*/

NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);

#else/*VECT_TAB_FLASH*/

/*SettheVectorTablebaselocationat0x08000000*/

NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);

#endif

*延时函数

voidDelay(vu32nCount)

for(;

nCount!

=0;

nCount--);

#ifdefDEBUG

*FunctionName:

assert_failed

*Description:

Reportsthenameofthesourcefileandthesourcelinenumber*wheretheassert_paramerrorhasoccurred.

*Input:

-file:

pointertothesourcefilename

*-line:

assert_paramerrorlinesourcenumber*Output:

None

*Return:

voidassert_failed(u8*file,u32line)

/*Usercanaddhisownimplementationtoreportthefilenameandlinenumber,

ex:

printf("

Wrongparametersvalue:

file%sonline%d\r\n"

file,line)*/

/*Infiniteloop*/

while

(1)

mmc.c

unsignedcharInit_Flag;

//Setitto1whenInitisprocessing.unsignedcharcard_type;

voidNOP(void);

unsignedcharCMD[]={0x40,0x00,0x00,0x00,0x00,0x95};

//CMD0

/**********************************************************

延时子函数

**********************************************************/voiddelay(unsignedinttime)

while(time--);

us延时子程序(4.34us)

**********************************************************/voiddelayNOP()

NOP();

延时程序

**********************************************************/voidNOP()

{vu16i;

for(i=0;

i<

10;

i++);

/************************************************************

卡端口初始化

************************************************************/

voidMMC_Port_Init()

//SPI_CLK=1;

GPIO_SetBits(GPIOA,SPI_CLK);

//置位LCD_RS

//SPI_DO=1;

GPIO_SetBits(GPIOA,SPI_DO);

//SPI_CS=1;

GPIO_SetBits(GPIOA,SPI_CS);

}

/******************************************************************

-功能描述:

IO模拟SPI,发送一个字节

-隶属模块:

SD卡模块

-函数属性:

内部

-参数说明:

x是要发送的字节

-返回说明:

无返回

-注:

其中is_init为1时,写的速度放慢,初始化SD卡SPI速度不能太高

******************************************************************/

voidWrite_Byte_MMC(ucharvalue){

unsignedchari;

for(i=0;

i<

8;

i++)

if(value&

0x80)

//SPI_DI=1;

//Sendbitbybit(MSBFirst)

GPIO_SetBits(GPIOA,SPI_DI);

else

//SPI_DI=0;

GPIO_ResetBits(GPIOA,SPI_DI);

//SPI_CLK=0;

//Clocklow

GPIO_ResetBits(GPIOA,SPI_CLK);

if(Init_Flag)

delayNOP();

//SPI_CLK=1;

//ClockHigh

value<

=1;

IO模拟SPI,读取一个字节

返回读到的字节

unsignedcharRead_Byte_MMC()

unsignedchartemp=0;

//SPI_DO=1;

i++)//MSBFirst

//SPI_CLK=0;

//ClockLow

temp=(temp<

1)|GPIO_ReadInputDataBit(GPIOA,SPI_DO);

//readmmcdataout

pin

return(temp);

向SD卡写命令

SD卡的命令是6个字节,pcmd是指向命令字节序列的指针

命令写入后,SD卡的回应值,调用不成功,将返回0xff

unsignedcharWrite_Command_MMC(unsignedchar*CMD)

unsignedchartmp;

Write_Byte_MMC(0xFF);

//提高兼容性,如果没有这里,有些SD卡可能不支持

GPIO_ResetBits(GPIOA,SPI_CS);

//send6ByteCommandtoMMC/SD-Card

0x06;

Write_Byte_MMC(*CMD++);

i=0;

//get16bitresponse

Read_Byte_MMC();

//readthefirstbyte,ignoreit.

do

{//Onlylast8bitisusedhere.Readitout.

tmp=Read_Byte_MMC();

i++;

while((tmp==0xff)&

&

(i<

100));

return(tmp);

复位SD卡,用到CMD0,使用SD卡切换到SPI模式

调用成功,返回0x00,否则返回INIT_CMD0_ERROR(sd.h中有定义)

unsignedcharMMC_Reset(void)//SD卡复位,进入SPI模式,使用CMD0(0号命令){

uchartime,temp,i;

ucharpcmd[]={0x40,0x00,0x00,0x00,0x00,0x95};

//SD_SCL=1;

//SD_SO=1;

//SD_CS=1;

Init_Flag=1;

//Settheinitflag

0x0f;

i++)//初始时,首先要发送最少74个时钟信号,这是必须的~~~

Write_Byte_MMC(0xff);

//120clk

//SD_CS=0;

time=0;

temp=Write_Command_MMC(pcmd);

//写入CMD0

time++;

if(time>

=TRY_TIME)

return(INIT_CMD0_ERROR);

//CMD0写入失败

}while(temp!

=0x01);

//SD_spi_write(0xff);

//按照SD卡的操作时序在这里补8个时钟

return0;

//返回0,说明复位操作成功

初始化SD卡,使用CMD1

调用成功,返回0x00,否则返回INIT_CMD1_ERROR(sd.h中有定义)

***********

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1