你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM8入门资料】第60讲 SD卡FATFS文件系统实验

[复制链接]
稻草人405 发布时间:2016-11-2 13:14
【剑齿虎】STM8开发板学习笔记
60讲   SDFATFS文件系统实验
60.1 实验目的
移植FATFS文件系统,并且通过FATFS文件系统读写SD卡数据。
60.2 FATFS开放函数
f_mount - 注册/注销一个工作区域(Work Area)
f_open - 打开/创建一个文件
f_close - 关闭一个文件
f_read - 读文件
f_write - 写文件
f_lseek - 移动文件读/写指针
f_truncate -截断文件
f_sync -  冲洗缓冲数据 Flush Cached Data
f_forward - 直接转移文件数据到一个数据流
f_stat - 获取文件状态
f_opendir - 打开一个目录
f_closedir -关闭一个已经打开的目录
f_readdir - 读取目录条目
f_mkdir - 创建一个目录
f_unlink -删除一个文件或目录
f_chmod -  改变属性(Attribute)
f_utime -改变时间戳(Timestamp)
f_rename - 重命名/移动一个文件或文件夹
f_chdir - 改变当前目录
f_chdrive - 改变当前驱动器
f_getcwd -  获取当前工作目录
f_getfree - 获取空闲簇 Get Free Clusters
f_getlabel - Get volume label
f_setlabel - Set volume label
f_mkfs - 在驱动器上创建一个文件系统
f_fdisk - Divide a physical drive
f_gets - 读一个字符串
f_putc - 写一个字符
f_puts - 写一个字符串
f_printf - 写一个格式化的字符串
f_tell - 获取当前读/写指针
f_eof - 测试文件结束
f_size - 获取文件大小
f_error - 测试文件上的错误
60.3 底层驱动函数使用      
SD文件夹是我公司在官方的“ff12b”文件的基础上整理完成的,主要是增加了一些底层驱动和一些顶层应用的函数,做成的一个安装包。初学者可以直接调用和引用我们整理出来的这个安装包就可以。可以省去下载官方的“ff12b”文件。
SD文件中夹有两个文件夹,“BSP”文件夹中是文件是SD卡的应用程序,我们可以把他保存到我们这个工程中的“BSP”文件夹中。
SD文件夹中有两个文件夹,“ff”文件夹中的全部文件直接拷贝到我们这个工程的根目录中。在我们的IAR工程中我们新建“ff”文件夹,把“ff.c”、“diskio.c”、“cc936.c”三个文件引入到工程中。“ff.c”文件是文件系统的底层执行程序;“diskio.c”文件是文件系统的接口程序;“cc936.c”文件是文件系统的字库程序;
引入完成文件后我们还要进行相关的一些配置。
图片1.png
图60.1  Options”配置操作方法
     如上图所示,选中工程项目文件名,单击右键,弹出对话框,光标移动到Options”选型单击鼠标。弹出配置对话框,如“60.2  Options”配置界面”。
图片2.png
图60.2  Options”配置界面一
图片3.png
图60.3  Options”配置界面二
    在下拉框中新增加一条路径,选中现有的的路径复制,把光标移动到最末端,粘贴后修改路径名称,如右图所示 图片4.png
60.4 程序文件设计      60.4.1  main.c文件中的程序
主程序就实现初始化和调用驱动程序,这样主程序控制思路清晰,流程简单。要想了解全面详实的程序,请大家参考光盘(网盘)中程序及程序注释。
/***********************************************************************
*   说    明: SD卡FATFS文件系统实验
*   开发平台: 剑齿虎STM8开发板        
*   作    者: 刘洋 张殿东
*   版    本: V1.0
*   日    期: 2016-05-03   
*
*   IAR开发环境    版本 V2.20.1
*   ST库函数       版本 V2.2.0
***********************************************************************/
#include "pbdata.h"//引入自定义公共头文件
void BSP_Configuration(void);//硬件初始化函数声明
void SD_Demo(void);
/***********************************************************************
*   函 数 名: main
*   功能说明: c程序入口
*   形    参:无
*   返 回 值: 错误代码(无需处理)
***********************************************************************/
int main(void)
{
  BSP_Configuration();//硬件驱动初始化函数
  SD_Demo();
  while(1)//主程序循环,反复执行循环体里的语句
  {
  }
}
FATFS fs;
FIL fdst;
FRESULT res;
UINT brw;
u8 Buf[]="LY-STM8 主讲人:刘洋 视频教程下载地址 www.zxkjmcu.com";
void SD_Demo(void)
{
    if(SD_Init()==SD_RESPONSE_NO_ERROR)
    {
        printf("SD 卡初始化成功!\r\n");
    }
    else
    {
        printf("SD 卡初始化失败!\r\n");
        return;
    }
   
    f_mount(&fs,"0:",1);
    res=f_open(&fdst,"STM8_01.txt",FA_CREATE_NEW|FA_WRITE);
    if(res==FR_OK)      
    {
        res=f_write(&fdst,Buf,sizeof(Buf),&brw);
        f_close(&fdst);
        printf("文件创建成功\r\n");
        res=f_open(&fdst,"STM8_01.txt",FA_OPEN_EXISTING|FA_READ);
        while(1)
        {
            brw=0;
            memset(Buf,0,sizeof(Buf));            
            res=f_read(&fdst,Buf,sizeof(Buf),&brw);            
            printf("%s\r\n",Buf);            
            if(res||brw==0) break;            
        }
        f_close(&fdst);               
    }
    else
    {
        printf("文件已经存在\r\n");
    }
}
/***********************************************************************
*   函 数 名: BSP_Configuration
*   功能说明: 初始化硬件设备。只需要调用一次。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。
*   形    参:无
*   返 回 值: 无
***********************************************************************/
void BSP_Configuration(void)
{  
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//时钟速度为内部16M,1分频,
  UART1_Congfiguration();//调用RS232串口1初始化函数
  LED_Init();//调用LED初始化函数
  SPI_Configuration();
  SD_GPIO();
  rim();//打开总中断
}
/*断言函数:它的作用是在编程的过程中为程序提供参数检查*/
#ifdef USE_FULL_ASSERT
void assert_failed(u8* file,u32 line)
{
  while(1)
  {
  }
}
    #endif
60.4.2  pbdata.c文件中的程序
#include "pbdata.h"   //引入自定义公共头文件
/***************************************************************************
*   函 数 名: delay_us
*   功能说明: 微秒延时程序,注意此函数的运行环境为(16M时钟速度)
*   形    参:nCount要延时的微秒数,输入nCount=1微妙
*   返 回 值: 无
***************************************************************************/
void delay_us(u16 nCount)   //16M 晶振时  延时 1个微妙
{
    nCount*=3;//等同于 nCount=nCount*3  相当于把nCount变量扩大3倍
    while(--nCount);//nCount变量数值先减一,再判断nCount的数值是否大于0,大于0循环减一,等于0退出循环。
}
/***************************************************************************
*   函 数 名: delay_ms
*   功能说明: 毫秒延时程序,注意此函数的运行环境为(16M时钟速度)
*   形    参:nCount要延时的毫秒数,输入nCount=1毫秒
*   返 回 值: 无
***************************************************************************/
void delay_ms(u16 nCount)  //16M 晶振时  延时 1个毫秒
{
    while(nCount--)//先判断while()循环体里的nCount数值是否大于0,大于0循环,减一执行循环体,等于0退出循环。
    {
        delay_us(1000);//调用微妙延时函数,输入1000等译演示1毫秒。
    }
}
/***************************************************************************
*   函 数 名: Get_decimal
*   功能说明: 获得数值小数部分
*   形    参:dt输入数据 deci小数位数,最多保留4位小数
*   返 回 值: 放大后的小数部分
***************************************************************************/
u16 Get_decimal(double dt,u8 deci)   //获得数值小数部分
{
    long x1=0;
    u16 x2=0,x3=0;
    if(deci>4) deci=4;
    if(deci<1) deci=1;
    x3=(u16)pow(10, deci);
    x1=(long)(dt*x3);
    x2=(u16)(x1%x3);
    return x2;
}
60.4.3  pbdata.h文件中的程序
#ifndef _PBDATA_H//宏定义,定义文件名称
#define _PBDATA_H
#include "stm8s.h"//引入STM8的头文件
#include <stdio.h>//需要引用这个头文件才能实现
#include "math.h"//需要引用这个头文件才能实现
#include "string.h"
#include "led.h"  //引用LED头文件
#include "uart1.h"//引用RS232头文件
#include "spi.h"
#include "sd.h"
#include "diskio.h"
#include "ffconf.h"
#include "ff.h"
void delay_us(u16 nCount); //微秒延时程序
void delay_ms(u16 nCount); //毫秒延时程序
u16 Get_decimal(double dt,u8 deci);   //获得数值小数部分
#endif //定义文件名称结束
60.4.4  sd.c文件中的程序
底层驱动程序,直接加入到工程中即可。……详细程序请参考程序例程。}
60.4.5  sd.h文件中的程序
底层驱动程序,直接加入到工程中即可。……详细程序请参考程序例程。
60.4.6  spi.c文件中的程序
#include "pbdata.h"
void SPI_Configuration(void)
{    SPI_Init(SPI_FIRSTBIT_MSB,SPI_BAUDRATEPRESCALER_4,SPI_MODE_MASTER,SPI_CLOCKPOLARITY_LOW,SPI_CLOCKPHASE_1EDGE,SPI_DATADIRECTION_2LINES_FULLDUPLEX,SPI_NSS_SOFT,0x07);
    SPI_Cmd(ENABLE);
}
u8 SPI_SendByte(u8 byte)
{
    while(SPI_GetFlagStatus(SPI_FLAG_TXE)==RESET);
    SPI_SendData(byte);
   
    while(SPI_GetFlagStatus(SPI_FLAG_RXNE)==RESET);
    return SPI_ReceiveData();
}
60.4.7  spi.h文件中的程序
#ifndef _SPI_H  //宏定义,定义文件名称
#define _SPI_H
#include "stm8s.h"//引用STM8头文件
void SPI_Configuration(void);
u8 SPI_SendByte(u8 byte);
#endif  
60.4.8  uart1.c文件中的程序
……详细程序请参考程序例程。
60.4.9  uart1.h文件中的程序
……详细程序请参考程序例程。
60.5 实验效果      
复位后,程序创建一个新的文件,文件名为“LY-STM8 主讲人:刘洋 视频教程下载地址 www.zxkjmcu.com”,如果SD卡中已经有这个文件了,就会提示“文件已经存在”。
图片5.png
图60.4  SD卡读写实验效果

视频教程共64讲,81课时,2350分钟

收藏 3 评论4 发布时间:2016-11-2 13:14

举报

4个回答
高二毛 回答时间:2016-11-2 13:39:11
感谢分享。
peter001 回答时间:2016-11-3 00:23:33
这绝对是好东西
黑皮男 回答时间:2016-11-3 08:51:48
多谢分享
vtdz 回答时间:2018-2-9 11:53:29
多谢分享

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版