RT-Thread 学习笔记(九)---开启基于SD卡中的 Elm FatFS 文件系统

软件环境:Win7,Keil MDK 4.72a, IAR EWARM 7.2, GCC 4.2,Python 2.7 ,SCons 2.3.2

硬件环境:Armfly STM32F103ZE-EK v3.0开发板

参考文章:RT-Thread编程指南

由于SD卡可插拔的便捷性,使得其在嵌入式中的应用中广泛使用。

【1】修改底层驱动接口

(1)打开Armfly STM32F103ZE-EK v3.0开发板找到SD卡硬件接口部分,如下图:

从硬件接口可以看到,SD是SDIO的接口类型,amobbs论坛上给出官方范例及此驱动的区别,我们这个开发分支driver目录下就有现成的sdcard.c文件,sdio接口类型。下面打开文件sdcard.c,定位到2901行,对应上面硬件接口确认和下面代码一致:

static void GPIO_Configuration(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;

    /* GPIOC and GPIOD Periph clock enable */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);

    /* Configure PC.08, PC.09, PC.10, PC.11, PC.12 pin: D0, D1, D2, D3, CLK pin */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    /* Configure PD.02 CMD line */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
}

(2)然后定位到3168和3172行,这里PC7为插卡检测,所以要修改过来:

int rt_hw_sdcard_init(void)
{
    /* SDIO POWER */
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOC,&GPIO_InitStructure);
    GPIO_ResetBits(GPIOC,GPIO_Pin_7); /* SD card power up */
    // delay same time for SD card power up

(3)然后定位到int rt_hw_sdcard_init(void)末尾处3237行GPIO_Pin_6改成GPIO_Pin_7,然后定位3241行附近,打开INIT_DEVICE_EXPORT宏前面注释,修改如下:

__return:
    rt_kprintf("sdcard init failed\n");
    GPIO_SetBits(GPIOC,GPIO_Pin_7); /* SD card power down */

    return 0;
}
INIT_DEVICE_EXPORT(rt_hw_sdcard_init);

修改完成后保存。

(4)打开application.c文件,定位到114行附近,加入下面代码:

/* mount SD Card as /dev/sd directory */
    if (dfs_mount("sd0", "/dev", "elm", 0, 0) == 0)
    {
        rt_kprintf("sd0 mount to /dev.\n");
    }
    else
        rt_kprintf("sd0 mount to /dev failed.\n");

(5)打开drivers目录下Sconscript文件,定位到21行,修改如下:

# add DFS drvers.

if GetDepend(‘RT_USING_DFS‘):

src += [‘rt_spi_device.c‘,‘rt_stm32f10x_spi.c‘,‘spi_flash_w25qxx.c‘,‘fs_test.c‘,‘sdcard.c‘]

然后保存并重新编译,如果SD卡没有问题,在终端中看到如下信息:

sd0 mount to /dev failed.

finsh />list_device()

device type

-------- ----------

flash0 Block Device

spi12 SPI Device

spi11 SPI Device

spi1 SPI Bus

sd0 Block Device

uart3 Character Device

uart2 Character Device

uart1 Character Device

0, 0x00000000

finsh />

sd卡在系统中已经成功注册。但还不挂载成功,因为不能识别文件系统,需要重新格式化:

finsh />mkfs("elm","sd0")

0, 0x00000000

finsh />

格式化成功。

然后复位一次,终端显示如下:

\ | /

- RT - Thread Operating System

/ | \ 1.2.2 build Mar 31 2015

2006 - 2013 Copyright by rt-thread team

found part[0], begin: 219152384, size: 1.690GB

W25Q64BV or W25Q64CV detection

finsh />flash0 mount to /.

sd0 mount to /dev.

finsh />

可以看到sd卡的容量信息,并且已经成功挂载的/dev。

时间: 2024-12-14 18:09:44

RT-Thread 学习笔记(九)---开启基于SD卡中的 Elm FatFS 文件系统的相关文章

如何使用CubeMx制作一个基于SD卡的文件系统工程(2)

本文是原文http://blog.csdn.net/flydream0/article/details/52777923的补充. 原文并没有考虑SD卡拔插问题,且SDIO没有使用DMA,本文作为补充,将示例如何改善这两方面的问题. 1 SD卡拔插检测 FATFS文件系统初始化得修改下: void MX_FATFS_Init(void) { /*## FatFS: Link the SD driver ###########################*/ retSD = FATFS_Link

Linux System Programming 学习笔记(九) 内存管理

1. 进程地址空间 Linux中,进程并不是直接操作物理内存地址,而是每个进程关联一个虚拟地址空间 内存页是memory management unit (MMU) 可以管理的最小地址单元 机器的体系结构决定了内存页大小,32位系统通常是 4KB, 64位系统通常是 8KB 内存页分为 valid or invalid: A valid page is associated with an actual page of data,例如RAM或者磁盘上的文件 An invalid page is

Boost Thread学习笔记三

下面先对condition_impl进行简要分析.condition_impl在其构造函数中会创建两个Semaphore(信号量):m_gate.m_queue,及一个Mutex(互斥体,跟boost::mutex类似,但boost::mutex是基于CriticalSection<临界区>的):m_mutex,其中:m_queue相当于当前所有等待线程的等待队列,构造函数中调用CreateSemaphore来创建Semaphore时,lMaximumCount参数被指定为(std::nume

APUE 学习笔记(九) 高级I/O

1. 非阻塞I/O 低速系统调用时可能会使进程永远阻塞的一类系统调用,包括以下调用: (1)某些文件类型你(网络socket套接字.终端设备.管道)暂无可使用数据,则读操作可能会使调用者永远阻塞 (2)如果数据不能立即被(1)中文件类型接受,则写操作会使调用者永远阻塞 (3)某些进程间通信函数 非阻塞I/O使我们可以调用open.read.write这样的I/O操作,并使这些操作不会永远阻塞,如果这种操作不能完成,则调用立即出错返回 对于一个给定的文件有两种方法对其指定非阻塞I/O: (1)调用

python学习笔记九——文件与目录

1.python进行文件读写的函数是open或file类 mode:r  只读 r+   读写 w  写入,先删除原文件,再重新写入,如果文件没有则创建 w+  读写,先删除原文件,再重新写入,如果文件没有则创建(可写入和输出) a  写入,在文件末尾追加新的内容,文件不存在则创建 a+  读写,在文件末尾追加新的内容,文件不存在则创建 b  打开二进制文件,可与r,w,a,+结合使用 U  支持所有的换行符号,"\r","\n","\r\n"

angular学习笔记(九)-css类和样式3

再来看一个选择li列表的例子: 点击li中的任意项,被点击的li高亮显示: <!DOCTYPE html> <html ng-app> <head> <title>6.3css类和样式</title> <meta charset="utf-8"> <script src="../angular.js"></script> <script src="scri

angular学习笔记(九)-css类和样式2

在上一个例子中,元素的类名使用拼接的方法,这样,类名中就不得不带有true或false,并且不易维护,所以,angular使用ng-class属性来控制元素的类名: 我们来看一个小例子,点击error按钮,顶部提示错误框,点击warning按钮,顶部提示警告框. 错误框的类名是.err,警告框的类名是.warn: <!DOCTYPE html> <html ng-app> <head> <title>6.2css类和样式</title> <

虚拟机VMWare学习笔记九 - 物理机上的文件挂载到虚拟机上

物理机上的文件夹或盘符直接挂载到虚拟机上使用. VM -- Settings Options -- Shared Folders -- 勾选Always enabled , 勾选Map as a network drive in Windows guests 在点击下面的添加来添加共享的文件夹 选择路径 可以看到虚拟机中的共享文件夹已经出现在Windows 中了 虚拟机VMWare学习笔记九 - 物理机上的文件挂载到虚拟机上

Boost Thread学习笔记二

除了thread,boost::thread另一个重要组成部分是mutex,以及工作在mutex上的boost::mutex::scoped_lock.condition和barrier,这些都是为实现线程同步提供的. mutexboost提供的mutex有6种:boost::mutexboost::try_mutexboost::timed_mutexboost::recursive_mutexboost::recursive_try_mutexboost::recursive_timed_m