|
【剑齿虎】STM8开发板学习笔记 第60讲 SD卡FATFS文件系统实验 目 录 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”文件是文件系统的字库程序; 引入完成文件后我们还要进行相关的一些配置。
图60.1 “Options”配置操作方法 如上图所示,选中工程项目文件名,单击右键,弹出对话框,光标移动到“Options”选型单击鼠标。弹出配置对话框,如图“60.2 “Options”配置界面”。
图60.2 “Options”配置界面一
图60.3 “Options”配置界面二 在下拉框中新增加一条路径,选中现有的的路径复制,把光标移动到最末端,粘贴后修改路径名称,如右图所示
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卡中已经有这个文件了,就会提示“文件已经存在”。
图60.4 SD卡读写实验效果 视频教程共64讲,81课时,2350分钟 |
| 感谢分享。 |
| 这绝对是好东西 |
| 多谢分享 |
| 多谢分享 |
STM8 的MCU有四个供电单元
【STM8-SO8】08-STM8L001J3的点灯
STM8单片机如何实现Bootloader
基于STM8的DALI (数字可寻址调光协议)
开源基于STM32的STM8脱机编程器
【ST MCU实战经验】之STM8中UART奇偶校验的使用方法
【思修电子STM8集合贴】龙顺宇STM8理论/实战视频/书籍/软件/
初次尝试STM8S001J3
分享STM8 风驰光盘的资料,是完整的(包括原理图+例程+PDF注释)
基于STM8的实验代码汇总分享
微信公众号
手机版