zoukankan      html  css  js  c++  java
  • 移植Fatfs文件系统到工程中

    下载Fatfs文件管理系统:http://elm-chan.org/fsw/ff/archives.html

    下载最新版本

    在工程中新建Fatfs文件夹,把fatfs文件中的全部复制过来

    由于Fatfs需要底层驱动文件,stm32就需要自行提供驱动SD卡的接口函数,也就是提供SDIO的驱动文件

    去st官网下载对应自己板子的standard peripheral library,下载方法:进官网直接搜STM32F103ZE,然后找到software


    打开下载的STM32 官方库3.5版本stm32f10x_stdperiph_lib35STM32F10x_StdPeriph_Lib_V3.5.0UtilitiesSTM32_EVALCommon下的stm32_eval_sdio_sd.c.h

    复制这两个文件到自己的工程中,并common下的文件只是用于他们的测试版,因此需要修改stm32_eval_sdio_sd.h中的include,由原来的#include "stm32_eval.h"改为#include "stm32f10x.h"

    在stm32_eval_sdio_sd.c添加SD_LowLevel_Init()函数,从而适配自己板子,需要适配SDIO管脚GPIO_Configuration(),SDIO优先级NVIC_Configuration(),SD_LowLevel_DMA_RxConfig()和SD_LowLevel_DMA_TxConfig();

    新建SD_Adaptive_firmware.c和SD_Adaptive_firmware.h,

    根据自己板子完善SD_DeInit();复位SDIO端口功能

    在SD_Adaptive_firmware.h头文件中添加宏定义

    /*宏定义*/
    #define SDIO_FIFO_ADDRESS                ((uint32_t)0x40018080)	 //SDIO_FIOF地址=SDIO地址+0x80至 sdio地址+0xfc
    /** 
      * @brief  SDIO Intialization Frequency (400KHz max)
      */
    #define SDIO_INIT_CLK_DIV                ((uint8_t)0xB2)
    /** 
      * @brief  SDIO Data Transfer Frequency (25MHz max) 
      */
    /*!< SDIOCLK = HCLK, SDIO_CK = HCLK/(2 + SDIO_TRANSFER_CLK_DIV) */
    #define SDIO_TRANSFER_CLK_DIV            ((uint8_t)0x01) 
    
    

    我的板子是没有使用sd-detect引脚的,所以把get state(void)函数中去掉SD_Detect()检测,

    FatFs 文件系统与存储设备的连接函数在 diskio.c 文件中,主要有 5 个函数需要我们编写的,基于原来程序逻辑改就可以了

    添加到keil项目工程中

    修改Fatfs配置宏定义,我们用到GPK936和f_mkfs函数创建系统逻辑分区


    在stm32f103it.c中添加SDIO中断,

    void SDIO_IRQHandler(void) 
    {
      /* Process All SDIO Interrupt Sources */
      SD_ProcessIRQSrc();
    }
    

    测试用例

    FATFS fs;													/* FatFs文件系统对象 */
    FIL fnew;													/* 文件对象 */
    FRESULT res_sd;                /* 文件操作结果 */
    UINT fnum;            					  /* 文件成功读写数量 */
    BYTE ReadBuffer[1024]={0};        /* 读缓冲区 */
    BYTE WriteBuffer[] =              /* 写缓冲区*/
    "欢迎使用野火STM32 开发板 今天是个好日子,新建文件系统测试文件
    ";  
    BYTE work[FF_MAX_SS] = {0};
    
    
    int FatfsSD(void)
    {
    		LED_BLUE;
    	
      printf("
    ****** 这是一个SD卡 文件系统实验 ******
    ");
      
    	//在外部SD卡挂载文件系统,文件系统挂载时会对SDIO设备初始化
    	res_sd = f_mount(&fs,"0:",0);
    	
    /*----------------------- 格式化测试 ---------------------------*/  
    	/* 如果没有文件系统就格式化创建创建文件系统 */
    	if(res_sd != FR_NO_FILESYSTEM)
    	{
    		printf("》SD卡还没有文件系统,即将进行格式化...
    ");
        /* 格式化 */
    //    The latest version of Fatfs USES the f_mkfs formatting function parameter, which requires passing an array, and the size of the array,
    //		to format the size of each sector and the initial value (the array initializes to all zeros or not initializes).
    		 res_sd=f_mkfs("0:",0,work, sizeof(work));//							
    		 
    		if(res_sd == FR_OK)
    		{
    			printf("》SD卡已成功格式化文件系统。
    ");
          /* 格式化后,先取消挂载 */
    			res_sd = f_mount(NULL,"0:",1);			
          /* 重新挂载	*/			
    			res_sd = f_mount(&fs,"0:",1);
    		}
    		else
    		{
    			LED_RED;
    			printf("《《格式化失败。》》
    ");
    			while(1);
    		}
    	}
      else if(res_sd!=FR_OK)
      {
        printf("!!SD卡挂载文件系统失败。(%d)
    ",res_sd);
        printf("!!可能原因:SD卡初始化不成功。
    ");
    		while(1);
      }
      else
      {
        printf("》文件系统挂载成功,可以进行读写测试
    ");
      }
      
    /*----------------------- 文件系统测试:写测试 -----------------------------*/
    	/* 打开文件,如果文件不存在则创建它 */
    	printf("
    ****** 即将进行文件写入测试... ******
    ");	
    	res_sd = f_open(&fnew, "0:FatFs读写测试文件.txt",FA_CREATE_ALWAYS | FA_WRITE );
    	if ( res_sd == FR_OK )
    	{
    		printf("》打开/创建FatFs读写测试文件.txt文件成功,向文件写入数据。
    ");
        /* 将指定存储区内容写入到文件内 */
    		res_sd=f_write(&fnew,WriteBuffer,sizeof(WriteBuffer),&fnum);
        if(res_sd==FR_OK)
        {
          printf("》文件写入成功,写入字节数据:%d
    ",fnum);
          printf("》向文件写入的数据为:
    %s
    ",WriteBuffer);
        }
        else
        {
          printf("!!文件写入失败:(%d)
    ",res_sd);
        }    
    		/* 不再读写,关闭文件 */
        f_close(&fnew);
    	}
    	else
    	{	
    		LED_RED;
    		printf("!!打开/创建文件失败。
    ");
    	}
    	
    /*------------------- 文件系统测试:读测试 ------------------------------------*/
    	printf("****** 即将进行文件读取测试... ******
    ");
    	res_sd = f_open(&fnew, "0:FatFs读写测试文件.txt", FA_OPEN_EXISTING | FA_READ); 	 
    	if(res_sd == FR_OK)
    	{
    		LED_GREEN;
    		printf("》打开文件成功。
    ");
    		res_sd = f_read(&fnew, ReadBuffer, sizeof(ReadBuffer), &fnum); 
        if(res_sd==FR_OK)
        {
          printf("》文件读取成功,读到字节数据:%d
    ",fnum);
          printf("》读取得的文件数据为:
    %s 
    ", ReadBuffer);	
        }
        else
        {
          printf("!!文件读取失败:(%d)
    ",res_sd);
        }		
    	}
    	else
    	{
    		LED_RED;
    		printf("!!打开文件失败。
    ");
    	}
    	/* 不再读写,关闭文件 */
    	f_close(&fnew);	
      
    	/* 不再使用文件系统,取消挂载文件系统 */
    	f_mount(NULL,"0:",1);
      
      /* 操作完成,停机 */
    	while(1)
    	{}
    

    链接:https://pan.baidu.com/s/1diqW5wIYEFwqnBJxyRaNhw
    提取码:0gh0

  • 相关阅读:
    Dynamics AX 2012 R2 在增强入站端口中找不到自定义服务操作
    Dynamics AX 2012 R2 切换环境后项目导入报错
    win8以上版本离线安装.NET
    Pro ASP.NET MVC 5 Framework.学习笔记.6.4.MVC的必备工具
    Pro ASP.NET MVC 5 Framework.学习笔记.6.3.MVC的必备工具
    vs2010 仿XCode风格的头注释宏
    [转]微软SerialPort秘籍[SerialPort为什么死锁程序的分析]
    jqGrid中选择的行的数据[转]
    【JQGRID DOCUMENTATION】.学习笔记.6.Editing:Common Rules
    【JQGRID DOCUMENTATION】.学习笔记.5.Form Editing
  • 原文地址:https://www.cnblogs.com/guguobao/p/12014272.html
Copyright © 2011-2022 走看看