概述
移植fatfs文件系统成功 3
分类: 嵌入式
2011-07-03 20:49:02
工程代码: 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 中实现
程序的测试代码:
SD卡写入后 的文件
在 winhex 下 显示
参考资料: 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 "..Usersd_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 "..FATSff.h"
- #include "..FATSinteger.h"
- #include "..FATSffconf.h"
- #include "..FATSdiskio.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 下 显示
最后
以上就是魁梧大叔为你收集整理的移植fatfs文件系统成功 3的全部内容,希望文章能够帮你解决移植fatfs文件系统成功 3所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复