工程代码:
3_fatfs.rar 参考资料:
http://blog.ednchina.com/nthq2004/307859/message.aspx智林STM32开发板上移植FatFs移植
http://blog.ednchina.com/jjldc/190753/message.aspx 九九 FatFs文件系统移植
经过半天的学习,终于将 fatfs 移植到了stm32上,我这次移植的fatfs是最新版本 ff8b在这个网站下载 。
移植过程介绍下:
其中的 diskio.c 是我自己新建的。从 前几个版本 如 ff7c 中复制过来的。 diskio.c 实现的 低级io操作的, 我们移植,也就是针对这个 文件进行修改, 将 sd_spi.h 中实现的sd卡 初始化、 read write 函数功能 在 diskio.c 中实现
- /*-----------------------------------------------------------------------*/
-
/* Low level disk I/O module skeleton for FatFs (C)ChaN, 2007 */
-
/*-----------------------------------------------------------------------*/
-
/* This is a stub disk I/O module that acts as front end of the existing */
-
/* disk I/O modules and attach it to FatFs module with common interface. */
-
/*-----------------------------------------------------------------------*/
-
-
#include "diskio.h"
-
#include "..\User\sd_spi.h"
-
-
-
-
/*-----------------------------------------------------------------------*/
-
/* Inidialize a Drive */
-
-
DSTATUS disk_initialize (
-
BYTE drv /* Physical drive nmuber (0..) */
-
)
-
{
-
u8 state;
-
-
if(drv)
-
{
-
return STA_NOINIT; //仅支持磁盘0的操作
-
}
-
-
state = SD_Init();
-
if(state == STA_NODISK)
-
{
-
return STA_NODISK;
-
}
-
else if(state != 0)
-
{
-
return STA_NOINIT; //其他错误:初始化失败
-
}
-
else
-
{
-
return 0; //初始化成功
-
}
-
}
-
-
-
-
/*-----------------------------------------------------------------------*/
-
/* Return Disk Status */
-
-
DSTATUS disk_status (
-
BYTE drv /* Physical drive nmuber (0..) */
-
)
-
{
-
if(drv)
-
{
-
return STA_NOINIT; //仅支持磁盘0操作
-
}
-
-
//检查SD卡是否插入
-
// if(!SD_DET())
-
// {
-
// return STA_NODISK;
-
// }
-
return 0;
-
}
-
-
-
-
/*-----------------------------------------------------------------------*/
-
/* Read Sector(s) */
-
-
DRESULT disk_read (
-
BYTE drv, /* Physical drive nmuber (0..) */
-
BYTE *buff, /* Data buffer to store read data */
-
DWORD sector, /* Sector address (LBA) */
-
BYTE count /* Number of sectors to read (1..255) */
-
)
-
{
-
u8 res=0;
-
if (drv || !count)
-
{
-
return RES_PARERR; //仅支持单磁盘操作,count不能等于0,否则返回参数错误
-
}
-
// if(!SD_DET())
-
// {
-
// return RES_NOTRDY; //没有检测到SD卡,报NOT READY错误
-
// }
-
-
-
-
if(count==1) //1个sector的读操作
-
{
-
res = SD_ReadSingleBlock(sector, buff);
-
}
-
else //多个sector的读操作
-
{
-
res = SD_ReadMultiBlock(sector, buff, count);
-
}
-
/*
-
do
-
{
-
if(SD_ReadSingleBlock(sector, buff)!=0)
-
{
-
res = 1;
-
break;
-
}
-
buff+=512;
-
}while(--count);
-
*/
-
//处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值
-
if(res == 0x00)
-
{
-
return RES_OK;
-
}
-
else
-
{
-
return RES_ERROR;
-
}
-
}
-
-
-
-
/*-----------------------------------------------------------------------*/
-
/* Write Sector(s) */
-
-
#if _READONLY == 0
-
DRESULT disk_write (
-
BYTE drv, /* Physical drive nmuber (0..) */
-
const BYTE *buff, /* Data to be written */
-
DWORD sector, /* Sector address (LBA) */
-
BYTE count /* Number of sectors to write (1..255) */
-
)
-
{
-
u8 res;
-
-
if (drv || !count)
-
{
-
return RES_PARERR; //仅支持单磁盘操作,count不能等于0,否则返回参数错误
-
}
-
// if(!SD_DET())
-
// {
-
// return RES_NOTRDY; //没有检测到SD卡,报NOT READY错误
-
// }
-
-
// 读写操作
-
if(count == 1)
-
{
-
res = SD_WriteSingleBlock(sector, buff);
-
}
-
else
-
{
-
res = SD_WriteMultiBlock(sector, buff, count);
-
}
-
// 返回值转换
-
if(res == 0)
-
{
-
return RES_OK;
-
}
-
else
-
{
-
return RES_ERROR;
-
}
-
}
-
#endif /* _READONLY */
-
-
-
-
/*-----------------------------------------------------------------------*/
-
/* Miscellaneous Functions */
-
-
DRESULT disk_ioctl (
-
BYTE drv, /* Physical drive nmuber (0..) */
-
BYTE ctrl, /* Control code */
-
void *buff /* Buffer to send/receive control data */
-
)
-
{
-
DRESULT res;
-
-
-
if (drv)
-
{
-
return RES_PARERR; //仅支持单磁盘操作,否则返回参数错误
-
}
-
-
//FATFS目前版本仅需处理CTRL_SYNC,GET_SECTOR_COUNT,GET_BLOCK_SIZ三个命令
-
switch(ctrl)
-
{
-
case CTRL_SYNC:
-
SD_CS_ENABLE();
-
if(SD_WaitReady()==0)
-
{
-
res = RES_OK;
-
}
-
else
-
{
-
res = RES_ERROR;
-
}
-
SD_CS_DISABLE();
-
break;
-
-
case GET_BLOCK_SIZE:
-
*(WORD*)buff = 512;
-
res = RES_OK;
-
break;
-
-
case GET_SECTOR_COUNT:
-
*(DWORD*)buff = SD_GetCapacity();
-
res = RES_OK;
-
break;
-
default:
-
res = RES_PARERR;
-
break;
-
}
-
-
return res;
-
}
-
-
-
/*-----------------------------------------------------------------------*/
-
/* User defined function to give a current time to fatfs module */
-
/* 31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */
-
/* 15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */
-
DWORD get_fattime (void)
-
{
-
// struct tm t;
-
// DWORD date;
-
// t = Time_GetCalendarTime();
-
// t.tm_year -= 1980; //年份改为1980年起
-
// t.tm_mon++; //0-11月改为1-12月
-
// t.tm_sec /= 2; //将秒数改为0-29
-
-
// date = 0;
-
// date = (t.tm_year << 25)|(t.tm_mon<<21)|(t.tm_mday<<16)|\
-
// (t.tm_hour<<11)|(t.tm_min<<5)|(t.tm_sec);
-
-
// return date;
-
return 0;
-
}
程序的测试代码: - /*
-
* Author : 余威先
-
* Date: 2011.6.19
-
* 开发板上:PD2 ~ LED2
-
* PA8 ~ LED0
-
* PA15 ~ KEY1
-
* PA13 ~ KEY2
-
* 修改Date: 2011.6.30 19:20
-
* rcc时钟配置: SYSCLK = 16MHZ
-
* AHB = 16MHZ
-
* APB1 = 8 MHZ // TIM2 TIM3 TIM4
-
* APB2 = 16 MHZ //GPIO A B C D
-
* 修改Date:2011.7.3 21:00
-
简单描述:
-
移植 fatfs 成功 ff8b
-
-
*/
-
#include "stm32f10x.h"
-
#include "rcc.h"
-
#include "systick.h"
-
#include "led.h"
-
#include "delay.h"
-
//#include "key.h"
-
#include "tim3.h"
-
#include "usart1.h"
-
#include "lcd.h"
-
#include "rtc.h"
-
#include "flash.h"
-
#include "sd_spi.h"
-
#include "..\FATS\ff.h"
-
#include "..\FATS\integer.h"
-
#include "..\FATS\ffconf.h"
-
#include "..\FATS\diskio.h"
-
-
volatile u8 sec = 0; // 全局变量 秒 时 小时
-
volatile u8 min = 0;
-
volatile u8 hour = 0;
-
-
FATFS fs;
-
FRESULT res;
-
FIL file;
-
-
u8 send_buffer[512] = {97,6};
-
u8 receiv_buffer[512] = {0,0};
-
u32 capacity = 0;
-
void write_file(void);
-
-
int main(void)
-
{
-
u16 i = 0;//
-
-
RCC_Configuration(); //系统时钟配置
-
delay_init(); // 延时 初始化
-
-
// RTC_Configuration(); //RTC系统 配置
-
// RTC_NVIC_Configuration(); //RTC中断配置
-
// RTC_Init();// RTC 时钟初始化
-
-
SPI1_Configuration(); //SPI1 初始化
-
// SD_Init(); //SD卡 初始化
-
-
LCD_Init(); //LCD 彩屏初始化
-
-
write_cmd(0x2C); //LCD 写数据命令
-
DrawFull_single_colour(0xff, 0xff); //显示 纯白色
-
-
capacity = SD_GetCapacity(); //获取 容量
-
LCD_show_number(48,128,capacity); //打印低16位
-
LCD_show_number(0,128,capacity>>16); //打印高16位
-
-
LCD_PutString(0,0, "start to write file..");
-
write_file();
-
#if 0
-
for(i = 0; i < 256; i++) //发送数据填充
-
send_buffer[i] = i;
-
-
for(i = 0; i < 256; i++) //发送数据填充
-
send_buffer[i + 256] = i;
-
-
SD_WriteSingleBlock(0, send_buffer); //写数据到 块 中
-
SD_ReadSingleBlock(0, receiv_buffer); //从 块 中 读数据
-
-
for(i = 0; i < 512; i++) // 显示从块中读取到的数据, 一个字节最大255
-
{
-
LCD_show_number(8,32,receiv_buffer[i]);
-
delay_s(1);
-
}
-
#endif
-
-
while(1) //无限循环, 中断中 显示 秒时钟
-
{
-
#if 0
-
LCD_show_number_2(40,16,hour);
-
LCD_show_number_2(64,16,min);
-
LCD_show_number_2(88,16,sec);
-
#endif
-
}
-
return 0;
-
}
-
-
-
void write_file(void)
-
{
-
UINT br;
-
u16 i;
-
s8 data[512];
-
for(i=0;i<10;i++)
-
{
-
data[i] = 'o';
-
}
-
for(i=10;i<20;i++)
-
{
-
data[i] = 'p';
-
}
-
for(i=20;i<30;i++)
-
{
-
data[i] = 'q';
-
}
-
data[30]='\n';
-
-
res = f_mount(0, &fs);
-
if(res != 0)
-
LCD_PutString(0,16, "f_mount failed.");
-
else
-
LCD_PutString(0,16, "f_mount successed.");
-
-
res = f_open(&file, "test.txt", FA_CREATE_ALWAYS | FA_WRITE);
-
if(res != 0)
-
LCD_PutString(0,32, "f_open failed.");
-
else
-
LCD_PutString(0,32, "f_open successed.");
-
-
res = f_write(&file, data, 512, &br);
-
if(res != 0)
-
LCD_PutString(0,48, "f_write failed.");
-
else
-
LCD_PutString(0,48, "f_write successed.");
-
-
f_close(&file);
-
LCD_PutString(0,64, "f_close successed.");
-
}
-
-
void RTC_IRQHandler(void) //中断函数
-
{
-
if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
-
{
-
RTC_ClearITPendingBit(RTC_IT_SEC);//清除 RTC秒中断标志
-
sec ++;// 定义的全局变量
-
if(sec ==60)
-
{
-
sec = 0;
-
min ++;
-
if(min == 60)
-
{
-
min = 0;
-
hour++;
-
if(hour==12)
-
hour = 0;
-
}
-
}
-
RTC_WaitForLastTask();//等待就绪
-
}
-
}
-
SD卡写入后 的文件
在 winhex 下 显示
阅读(2029) | 评论(0) | 转发(0) |