“线程:controlSUITE,, 测试”中讨论的其它部件
大家好,
我正在尝试刷新 TMS320F28069M 上位于“C:\ti\controlSUITE\device_support\F2837xS\V200\F2837xS_Examples_CPU1\SD_card\cpu01”的 SD 卡的代码。 但在调试代码时,我遇到了以下错误(图 1)

如图2所示,我已包括所有必要的路径:

请帮助我解决此错误。
提前非常感谢!!
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好,
我正在尝试刷新 TMS320F28069M 上位于“C:\ti\controlSUITE\device_support\F2837xS\V200\F2837xS_Examples_CPU1\SD_card\cpu01”的 SD 卡的代码。 但在调试代码时,我遇到了以下错误(图 1)

如图2所示,我已包括所有必要的路径:

请帮助我解决此错误。
提前非常感谢!!
您好,
下面是代码:
\\
#include "DSP28x_Project.h"(#include "DSP28x_Project.h")
#include <string.h>
#include "inc/HW_ints.h"
#include "inc/HW_memmap.h"(#include "inc/HW_memmap.h")
#include "inc/HW_types.h"
#include "driverlib/interrupe.h"
#include "driverlib/sysctl.h"
#include "driverlib/Systick.h"
#include "utils/cmdline.h"
#include "utils/uartstdi.h"(#include "utils/uartstdi.h")
#include "utils/ustdlib.h"
#include "thire_part/fatfs/src/ff.h"
#include "thire_part/fatfs/src/diskio.h"
//定义
#define path_BUF_size 80 //定义了容纳的缓冲区的大小
//路径,或 SD 卡的临时数据。
//有两个为此大小分配的缓冲区。
//缓冲区大小必须足够大才能容纳
//预期最长的完整路径名,
//包括文件名和后缀 null
//字符。
#define CMD_BUF_SIZE 64 //定义缓冲区的大小
//命令行。
#define FRESULT_Entry(f){(f),(# f)}//宏,使其易于使用
//将结果代码添加到表中
#define name_To_Long_error 1//返回错误原因
#define opendir_error 2// by ChangeDirectory()。
#define NUM_FRESULT_CODES (sizeof (g_sfresultStrings)/ sizeof (tFresultString))
#define ticks_per _second 100
#define NUM_LIST_STICES 48.
#define MAX_FILENAME_STRING_LEN (4 + 8 + 1 + 3 + 1)
#define NUM_STATUS_strings 6.
#define MAX_STATUS_STRING_LEN (36 + 1)
//
//全球
//
静态字符 g_cCwdBuf[path_BUF_size]="/";//此缓冲区保留完整路径
//为当前工作状态
//目录。 最初是这样
// root ("/")。
静态字符 g_cTmpbuf[path_BUF_size];//使用的临时数据缓冲区
//操作文件路径时,或
//从 SD 卡读取数据。
静态字符 g_cCmdbf[CMD_BUF_size];//保存的缓冲区
//命令行。
静态 FATFS g_sFatf;
静态 DIR g_sDirObject;
静态 FILINFO g_sFileInfo;
静态 FIL g_sFileObject;
//
//在 FRESULT 数字代码之间保存映射的结构,
//和字符串表示。 FRESULT 代码从 FatF 返回
// FAT 文件系统驱动程序。
//
typedef 结构
{
FRESULT 结果;
字符*pcResultStr;
}
tFresultString;
//
//一个表,其中包含数字 FRESULT 代码和之间的映射
//它的名称是字符串。 这用于查找的错误代码
//打印到控制台。
//
tfresultString g_sfresultString[]=
{
FRESULT_Entry (FR_OK),
FRESULT_Entry (FR_NOT_READY),
FRESULT_Entry (FR_NO_FILE),
FRESULT_Entry (FR_NO_PATH),
FRESULT_Entry (FR_INVALID_NAME),
FRESULT_Entry (FR_INVALID_DRIVE),
FRESULT_Entry (FR_DENIED),
FRESULT_Entry (FR_exist),
FRESULT_Entry (FR_RW_ERROR),
FRESULT_Entry (FR_WRITE 保护),
FRESULT_Entry (FR_NOT_ENABLED),
FRESULT_Entry (FR_NO_Filesystem),
FRESULT_Entry (FR_INVALID_OBJECT),
FRESULT_Entry (FR_mkfs_aborted)
};
const char *g_ppcDirListStrings[NUM_LIST_STRINS];//文件名的存储
//列表框小工具字符串
//表。
//
//存储当前目录中的文件名。 文件名
//以“(D) filename.ext”格式存储,用于目录或
//“(F) filename.ext”作为文件。
//
char g_pcFilename[NUM_LIST_STRING][MAX_FILE_STRING_LEN];
//
//存储显示在底部状态框中的字符串
//显示。
//
char G_pcStatus[NUM_STATUS_STRING][MAX_STATUS_STRING_LEN];
//
//状态列表框小工具字符串表的存储。
//
const char *g_ppcStatusStrings[NUM_STATUS_STRINS]=
{
G_pcStatus[0],
G_pcStatus[1],
G_pcStatus[2],
G_pcStatus[3],
G_pcStatus[4],
pcStatus[5]
};
无符号长格_ulStatusStringIndex =0;
//
//转发用户中使用的小部件所调用函数的声明
//接口。
//
静态 FRESULT ChangeToDirectory(CHAR *pcDirectory, unsigned long *pulReason);
静态 const char *StringFromResult (FRESULT fresult);
//
//函数原型
//
extern void UARTStdioIntHandler (void);
//
// StringFromResult -此函数返回的字符串表示
//从函数调用返回的错误代码
// Fatfs。 它可用于打印人类可读的内容
//错误消息。
//
静态 const char *
StringFromResult (FRESULT 结果)
{
未签名的 int uIdx;
//
//输入循环以搜索错误代码表中的匹配项
//错误代码。
//
对于(uIdx = 0;uIdx < NUM_FRESULT_CODES;uIdx++)
{
//
//如果找到匹配项,则返回的字符串名称
//错误代码。
//
IF (g_sfresultString[uIdx]。fresult == fresult)
{
return(g_sfresultString[uIdx].pcResultStr);
}
}
//
//此时未找到匹配的代码,因此返回
//字符串表示未知错误。
//
return (“未知错误代码”);
}
// SysTickHandler -这是此 Systick 中断的处理程序。 Fatfs
//内部计时需要每10 ms 执行一次计时器嘀嗒声
//目的。
中断无效
SysTickHandler (void)
{
//
//调用 FatF tick 计时器。
//
disk_timerproc ();
PieCtrlRegs.PIEACK.ALL |= 1;
}
//
// Cmd_ls -此函数实现“ls”命令。 它打开电流
//目录并枚举内容,并打印一行
//找到的每个项目。 它显示文件属性,
//时间和日期,文件大小以及名称。 它显示 A
//文件大小的摘要和可用空间。
//
int Cmd_ls (int argc,char *argv[])
{
无符号长 ulTotalSize,ulItemCount,ulFileCount,ulDirCount;
FRESULT 结果;
FATFS * pFatF;
//
//打开当前目录进行访问。
//
fresult = f_opendir (&g_sDirObject,g_cCwdBuf);
//
//检查错误,如果有问题,返回。
//
IF (fresult!= FR_OK)
{
返回(fresult);
}
ulTotalSize = 0;
ulFileCount = 0;
ulDirCount = 0;
ulItemCount = 0;
//
//在商品信息发布前再加一个空白行。
//
UART printf("\n");
//
//输入循环以枚举所有目录项。
//
for (;;)
{
//
//从目录中读取一个条目。
//
fresult = f_readdir(&G_sDirObject,&g_sFileInfo);
//
//检查错误,如果有问题,返回。
//
IF (fresult!= FR_OK)
{
返回(fresult);
}
//
//如果文件名为空,则此为的末尾
//列表。
//
IF (!g_sFileInfo.fname[0])
{
休息;
}
//
//使用格式在单行上打印条目信息
//显示属性,日期,时间,大小和名称。
//
UARTprintf("%c%c%c%c%c%c %u/%02u/%02u %02u:%02u %9U %s\n",
(G_sFileInfo.fattrib & AM_DIR)? (UINT32_t)D':(UINT32_t)'-',
(G_sFileInfo.fattrib & AM_RDO)? (UINT32_t)'R':(UINT32_t)'-',
(G_sFileInfo.fattrib & AM_HID)? (UINT32_t)'H':(UINT32_t)'-',
(G_sFileInfo.Fattrib&AM_SYS)? (UINT32_t)'s':(UINT32_t)'-',
(G_sFileInfo.fattrib & AM_ARC)? (UINT32_t)'A':(UINT32_t)'-',
(UINT32_t)(((g_sFileInfo.fdate >> 9)+ 1980),
(UINT32_t)(((g_sFileInfo.fdate >>>5)和15),
(UINT32_t)(g_sFileInfo.fdate & 31),
(UINT32_t)(((g_sFileInfo.ftime >> 11)),
(UINT32_t)(((g_sFileInfo.ftime >> 5)和63),
(UINT32_t)(g_sFileInfo.fsize),
g_sFileInfo.fname);
//
//在列表框小部件中将信息添加为一行。
//
IF (ulItemCount < NUM_LIST_SITES)
{
usprintf(g_pcFilames[ulItemCount],“(%c)%12s”,
(G_sFileInfo.fattrib & AM_DIR)? “D”:“F”,
g_sFileInfo.fname);
}
//
//如果属性是目录,则增加目录计数。
//
IF (G_sFileInfo.Fattribb & AM_DIR)
{
ulDirCount++;
}
//
//否则,它是一个文件。 增加文件计数,和
//将文件大小添加到总数中。
//
否则
{
ulFileCount++;
ulTotalSize += g_sFileInfo.fsize;
}
//
//移至我们用于填充的条目数组中的下一个条目
//列表框。
//
ulItemCount++;
//
//等待 UART 传输缓冲区清空。
//
// UARTFlushTx (假);
}
//
//打印显示文件,目录和大小总计的汇总行。
//
UARTprintf ("\n%4U 文件,共%10U 字节\n%4U 目录",
ulFileCount,ulTotalSize,ulDirCount);
//
//获得可用空间。
//
fresult = f_getfree ("/",&ulTotalSize,&pFatf);
//
//检查错误,如果有问题,返回。
//
IF (fresult!= FR_OK)
{
返回(fresult);
}
//
//显示计算得出的可用空间量。
//
UARTprintf (",%10uK 字节空闲\n",ulTotalSize * pFatfs-> sipuls_clust / 2);
//
//等待 UART 传输缓冲区清空。
//
// UARTFlushTx (假);
//
//来到这里,返回时没有任何错误。
//
返回(0);
}
//
// ChangeToDirectory -此函数实现“CD”命令。 这需要一个
//参数,用于指定要创建的目录
//当前工作目录。 路径分隔符必须使用
//正斜杠"/"。 CD 的参数可以是其中之一
//如下:
//* root ("/")
//*完全指定的路径("/my/path/path/t/mydir")
//*当前的单个目录名
//目录("mydir")
//*父目录(".")
//它不理解相对路径,所以不要尝试
//类似的内容:("./my/new/path")
//指定新目录后,它将尝试打开
//目录以确保它存在。 如果是新路径
//成功打开,然后打开当前工作状态
//目录(cwd)更改为新路径。 在的情况下
//错误,pulRefason 参数将使用一个
//以下值:
//
静态 FRESULT
ChangeToDirectory(字符*pcDirectory,无符号长*pulRefason )
{
未签名的 int uIdx;
FRESULT 结果;
//
//将当前工作路径复制到临时缓冲区中,以此类推
//它可以被操纵。
//
strcpy (g_cTmpbuf,g_cCwdBuf);
//
//如果第一个字符是/,则该字符是完全指定的
//路径,它应该按目前的方式使用。
//
IF (pcDirectory[0]=='/')
{
//
//确保新路径不大于 cwd 缓冲区。
//
IF (strlen(pcDirectory)+1 > sizeof (g_cCwdBuf))
{
*pulRefason = name_To_Long_error;
退货(FR_OK);
}
//
//如果新路径名(在 argv[1]中)不是太长,那么
//将其复制到临时缓冲区,以便对其进行检查。
//
否则
{
strncpy (g_cTmpbuf,pcDirectory,sizeof (g_cTmpbuf));
}
}
//
//如果参数为...,则尝试删除最低级别
//在 CWD 上。
//
否则,如果(!strcmp(pcDirectory,“..”))
{
//
//获取当前路径中最后一个字符的索引。
//
uIdx = strlen (g_cTmpbuf)- 1;
//
//从路径名末尾备份到分隔符(/)
//发现了,或者直到我们开始前进。
//
While (((g_cTmpbuf[uIdx]!='/')&&(uIdx > 1))
{
//
//备份一个字符。
//
uIdx--;
}
//
//现在,我们处于中的最低级别分隔符
//当前路径,或字符串开头(根)。
//因此,请在此处设置字符串的新结尾,从而有效地删除
//路径的最后一部分。
//
G_cTmpbuf[uIdx]= 0;
}
//
//否则,这只是当前路径的正常路径名
//目录,需要将其附加到当前路径中。
//
否则
{
//
//测试以确保新的附加路径是何时
//添加到当前路径中,缓冲区中有空间
//作为完整的新路径。 它需要包括一个新的分隔符,
//和后缀空字符。
//
IF (strlen(g_cTmpbuf)+ strlen(pcDirectory)+1 > sizeof (g_cCwdBuf))
{
*pulRefason = name_To_Long_error;
返回(FR_INVALID_OBJECT);
}
//
//新路径正常,请添加分隔符,然后追加
//路径的新目录。
//
否则
{
//
//如果尚未在根级别,则附加 a /
//
IF (strcmp (g_cTmpbuf,"/"))
{
strcat (g_cTmpbuf,"/");
}
//
//将新目录附加到路径中。
//
strcat (g_cTmpbuf,pcDirectory);
}
}
//
//此时,候选新目录路径位于 chTmpBuf 中。
//尝试打开它以确保它有效。
//
fresult = f_opendir (&g_sDirObject,g_cTmpbuf);
//
//如果无法打开,则是一条错误的路径。 通知
//用户和退货。
//
IF (fresult!= FR_OK)
{
*pulReason = opendir_error;
返回(fresult);
}
//
//否则,它是一个有效的新路径,因此请将其复制到 CWD 中并进行更新
//屏幕。
//
否则
{
strncpy (g_cCwdBuf,g_cTmpBuf,sizeof (g_cCwdBuf));
}
//
//成功返回。
//
退货(FR_OK);
}
//
// Cmd_cd -此函数实现"cd"命令。 这需要争论
//,指定要创建当前工作目录的目录。
//路径分隔符必须使用正斜杠"/"。 CD 的参数
//可以是以下之一:
//* root ("/")
//*完全指定的路径("/my/path/path/t/mydir")
//*当前目录中的单个目录名("mydir")
//*父目录(".")
//它不理解相对路径,所以不要尝试类似的方法
//这:("./my/new/path")
//指定新目录后,它会尝试打开
//目录以确保它存在。 如果新路径已打开
//成功更改了当前的工作目录(cwd)
//到新路径。
//
Int Cmd_CD (int argc,char *argv[])
{
无符号长 ulReason;
FRESULT 结果;
//
//尝试更改为命令行中提供的目录。
//
fresult = ChangeToDirectory(argv[1],&ulRefason );
//
//如果报告了错误,请尝试提供一些有用的信息。
//
IF (fresult!= FR_OK)
{
开关(ulReason)
{
案例 opendir_error:
UARTprintf("打开新目录时出错.\n");
休息;
案例名称太长错误:
UART printf("生成的路径名太长。\n");
休息;
默认值:
UARTprintf("报告了无法识别的错误。\n");
休息;
}
}
//
//返回相应的错误代码。
//
返回(fresult);
}
//
// Cmd_pwd -此函数实现"pwd"命令。 只需打印
//当前工作目录。
//
内部 Cmd_pwd (int argc,char *argv[])
{
//
//将 CWD 打印到控制台。
//
UARTprintf("%s\n",g_cCwdBuf);
//
//等待 UART 传输缓冲区清空。
//
// UARTFlushTx (假);
//
//成功返回。
//
返回(0);
}
//
// Cmd_cat -此函数实现"cat"命令。 它读取内容
//并将其打印到控制台。 这只能使用
//在文本文件上。 如果它用于二进制文件,则会有一堆
//垃圾可能会打印在控制台上。
//
内部 Cmd_cat (int argc,char *argv[])
{
FRESULT 结果;
无符号短 usBytesRead;
//
//首先,检查以确保当前路径(CWD),以及
//文件名加上一个分隔符并以 null 结尾,将全部包含
//适合用于容纳的临时缓冲区
//文件名。 文件名必须完全指定,并带有路径,
//法特基金。
//
IF (strlen (g_cCwdBuf)+ strlen (argv[1])+ 1 + 1 > sizeof (g_cTmpbuf))
{
UARTprintf("生成的路径名太长\n");
返回(0);
}
//
//将当前路径复制到临时缓冲区,以便对其进行操作。
//
strcpy (g_cTmpbuf,g_cCwdBuf);
//
//如果尚未位于根级别,则附加一个分隔符。
//
IF (strcmp("/",g_cCwdBuf))
{
strcat (g_cTmpbuf,"/");
}
//
//最后,添加文件名以生成完全指定的文件。
//
strcat (g_cTmpbuf,argv[1]);
//
//打开文件进行阅读。
//
fresult = f_open (&g_sFileObject,g_cTmpbuf,fa_read);
//
//如果打开文件时出现问题,请返回
//错误。
//
IF (fresult!= FR_OK)
{
返回(fresult);
}
//
//输入循环以重复读取文件中的数据并显示该数据,
//直到文件结尾。
//
行动
{
//
//从文件中读取数据块。 阅读尽可能多的内容
//在临时缓冲区中,包括后向空的空格。
//
fresult = f_read (&g_sFileObject,g_cTmpbuf,sizeof (g_cTmpbuf)- 1,
&usBytesRead);
//
//如果读取时出错,请打印新行和
//将错误返回给用户。
//
IF (fresult!= FR_OK)
{
UART printf("\n");
返回(fresult);
}
//
// Null 终止为使其成为 A 而读取的最后一个块
//可以与 printf 一起使用的空终止字符串。
//
G_cTmpbuf[usBytesRead]= 0;
//
//打印收到的文件的最后一个块。
//
UART printf("%s",g_cTmpbuf);
//
//继续读取,直到小于完整字节数
//读。 这意味着缓冲区已到达终点。
//
}
While (usBytesRead == sizeof (g_cTmpBuf)-1);
//
//成功返回。
//
返回(0);
}
//*************************************************
//
//此函数实现“write”命令。 它写入的内容
//第一个参数指定的文件中的第二个参数。 如果是文件
//不存在,它将使用给定的文件名创建一个新文件。
//
//*************************************************
int Cmd_write (int argc,char *argv[])
{
FRESULT 结果;
无符号短 usBytesWritten;
无符号 int i = 2;
字符写入 Buff[CMD_BUF_SIZE]={0};
//
//首先,检查以确保当前路径(CWD)加上文件
//名称加上一个分隔符并结尾为空,都适合临时
//将用于保存文件名的缓冲区。 文件名必须为
//完全指定,带路径,到 FatF。
//
IF (strlen (g_cCwdBuf)+ strlen (argv[1])+ 1 + 1 > sizeof (g_cTmpbuf))
{
UARTprintf("生成的路径名太长\n");
返回(0);
}
//
//将当前路径复制到临时缓冲区,以便对其进行操作。
//
strcpy (g_cTmpbuf,g_cCwdBuf);
//
//如果尚未位于根级别,则附加一个分隔符。
//
IF (strcmp("/",g_cCwdBuf))
{
strcat (g_cTmpbuf,"/");
}
//
//附加文件名以创建完整的文件路径。
//
strcat (g_cTmpbuf,argv[1]);
//
//打开文件进行写入。
//
fresult = f_open (&g_sFileObject,g_cTmpbuf,fa_write | fa_create_always);
//
//检查错误,如果有问题,返回。
//
IF (fresult!= FR_OK)
{
返回(fresult);
}
//
//创建要写入文件的字符串。
//
当时(i < argc)
{
strcat (writeBuff,argv[i]);
//
//必要时添加一个空格。
//
IF (I < argc-1)
{
strcat (writeBuff,“”);
}
I++;
}
//
//将字符串写入 arg[1]中的给定文件。如果文件不存在,
//它会创建一个新文件。
//
fresult = f_write(&G_sFileObject, writeBuff, CMD_BUF_SIZE-1,&usBytesWritten);
//
//检查错误,如果有问题,返回。
//
IF (fresult!= FR_OK)
{
返回(fresult);
}
//
//完成后关闭文件。
//
F_CLOSE (&g_sFileObject);
返回(0);
}
//*************************************************
//
//此函数实现“mkdir”命令。 它会创建一个新目录
//使用参数中给出的名称。
//
//*************************************************
内部
cmd_mkdir (int argc,char *argv[])
{
FRESULT 结果;
//
//首先,检查以确保当前路径(CWD)加上文件
//名称加上一个分隔符并结尾为空,都适合临时
//将用于保存文件名的缓冲区。 文件名必须为
//完全指定,带路径,到 FatF。
//
IF (strlen (g_cCwdBuf)+ strlen (argv[1])+ 1 + 1 > sizeof (g_cTmpbuf))
{
UARTprintf("生成的路径名太长\n");
返回(0);
}
//
//将当前路径复制到临时缓冲区,以便对其进行操作。
//
strcpy (g_cTmpbuf,g_cCwdBuf);
//
//如果尚未位于根级别,则附加一个分隔符。
//
IF (strcmp("/",g_cCwdBuf))
{
strcat (g_cTmpbuf,"/");
}
//
//添加目录名以创建新的完整文件路径
//目录。
//
strcat (g_cTmpbuf,argv[1]);
//
//创建一个具有新文件路径的目录。
//
fresult = f_mkdir (g_cTmpbuf);
//
//检查错误,如果有问题,返回。
//
IF (fresult!= FR_OK)
{
返回(fresult);
}
返回(0);
}
//*************************************************
//
//此函数实现“rm”命令。 它会删除文件或
//参数指定的子目录。
//
//*************************************************
内部
cmd_rm (int argc,char *argv[])
{
FRESULT 结果;
//
//首先,检查以确保当前路径(CWD)加上文件
//名称加上一个分隔符并结尾为空,都适合临时
//将用于保存文件名的缓冲区。 文件名必须为
//完全指定,带路径,到 FatF。
//
IF (strlen (g_cCwdBuf)+ strlen (argv[1])+ 1 + 1 > sizeof (g_cTmpbuf))
{
UARTprintf("生成的路径名太长\n");
返回(0);
}
//
//将当前路径复制到临时缓冲区,以便对其进行操作。
//
strcpy (g_cTmpbuf,g_cCwdBuf);
//
//如果尚未位于根级别,则附加一个分隔符。
//
IF (strcmp("/",g_cCwdBuf))
{
strcat (g_cTmpbuf,"/");
}
//
//附加文件/子目录名称以生成完全指定的路径。
//
strcat (g_cTmpbuf,argv[1]);
//
//取消要删除的文件或子目录的链接。
//
fresult = f_unlink (g_cTmpbuf);
//
//检查错误,如果有问题,返回。
//
IF (fresult!= FR_OK)
{
返回(fresult);
}
//
//成功返回。
//
返回(0);
}
//
// Cmd_help -此函数实现“帮助”命令。 它打印出一个简单的
//可用命令的列表,并附有简要说明。
//
内部
cmd_help (int argc,char *argv[])
{
tCmdlinEntry *倒数;
//
//打印一些标题文本。
//
UART printf("\n 可用命令\n");
UARTprintf("------------ \n");
//
//指向命令表的开头。
//
pentrry =&g_psCmd 表[0];
//
//输入循环以读取命令表中的每个条目。 。
//命令名称为 NULL 时,已到达表的末尾。
//
While (pentry->pcCmd)(倒数第二次)
{
//
//打印命令名称和简短说明。
//
UART printf("%s%s\n",pentry->pcCmd,pentry->pcHelp);
//
//前进到表中的下一个条目。
//
槟城++;
}
//
//成功返回。
//
返回(0);
}
//
//这是包含命令名称,实现函数,
//和简要说明。
//
tCmdline 环境 g_psCmdlet[]=
{
{“帮助”,Cmd_help,“:显示命令列表”},
{"h",Cmd_help,“:帮助别名”},
{“?”,Cmd_help,“:帮助别名”},
{“ls”,Cmd_ls,“:显示文件列表”},
{"chdir",Cmd_cd,“:更改目录”},
{“CD”,Cmd_cd,“:chdir 的别名”},
{“pwd”,Cmd_pwd,“:显示当前工作目录”},
{“cat”,Cmd_cat,“:显示文本文件的内容”},
{"write",Cmd_write,“:写入文件。 如果文件不存在,则创建一个",
{"mkdir",Cmd_mkdir,":创建新的文件目录"},
{"rm",Cmd_rm,":删除文件或目录"},
{ 0,0,0}
};
//
//__error__-驱动程序库中调用的错误例程
//遇到错误。
//
#ifdef 调试
无效
__error__(字符*pcFilename,无符号长 ulLine)
{
}
#endif
//
//配置 UART -配置 UART 及其引脚。 这必须被称为
//在 UARTprintf()之前。
//
无效
配置 UART (void)
{
//
//启用 UART0
//
SysPeripheralEnable (sysctl_Periph_SCI1);
//
//为 UART 模式配置 GPIO 引脚。
//
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0;
GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;
GpioCtrlRegs.GPADIR.bit.GPIO28 = 0;
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO29 = 1;
EDIS;
//
//初始化控制台 I/O 的 UART
//
UART 标准配置(0,115200,SystlLowSpeedClockGet (SYSTEM_CLOCK_SPEED));
}
//
// Main -执行初始化,然后向运行命令处理循环
//从控制台读取命令。
//
内部
主(无效)
{
内部状态;
FRESULT 结果;
//
//初始化系统控制
//
InitSysCtrl();
#ifdef 闪烁
//
//将时间关键代码和闪存设置代码复制到 RAM
//这包括以下函数:InitFlash();
//函数 LoadStart,RamfunctsLoadSize 和 RamfunctsRunStart
//符号由链接器创建。 请参阅设备的.cmd 文件。
//
Memcpy (&RamfunctsRunStart,&RamfunctsLoadStart,(size_t)&RamfunctsLoadSize);
//
//调用闪存初始化以设置闪存等待状态
//此函数必须驻留在 RAM 中
//
InitFlash();
#endif
//
//初始化中断控制器和矢量表
//
InitPieCtrl();
InitPieVectTable();
//
//将系统刻度设置为每秒触发100次。
//
SysTickInit();
SysTickPeriodSet (SysCTLClockGet (SYSTEM_CLOCK_SPEED)/100);
SysTickIntRegister (SysTickHandler);
SysTickIntEnable();
SysTickEnable();
//
//启用中断
//
IntMasterEnable();
//
//为调试输出配置 UART0。
//
配置 UART();
//
//向用户打印问候语。
//
UARTprintf("\n\nSD 卡示例程序\n");
UARTprintf("类型\'帮助\'以获得帮助。\n");
//
//使用逻辑磁盘0装载文件系统。
//
fresult = f_mount (0,&g_sFatf);
IF (fresult!= FR_OK)
{
UARTprintf("f_mount error:%s\n", StringFromResult (fresult ));
退货(1);
}
//
//输入一个(几乎)无限循环,用于读取和处理来自的命令
//用户。
//
While (1)(同时)
{
//
//向控制台打印提示。 显示 CWD。
//
UARTprintf("\n%s>",g_cCwdBuf);
//
//从用户处获取一行文本。
//
UART (g_cCmdbf,sizeof (g_cCmdbf));
//
//将命令行从用户传递到命令处理器。
//它将被解析并执行有效的命令。
//
nStatus = CmdLineProcess (g_cCmdbf);
//
//处理错误命令的情况。
//
IF (nStatus = CMDLINE_BID_CMD)
{
UARTprintf("错误的命令!\n");
}
//
//处理过多参数的情况。
//
否则,如果(nStatus == CMDLINE_To_many_args)
{
UARTprintf("命令处理器的参数太多!\n");
}
//
//否则该命令被执行。 打印错误
//如果返回了一个代码。
//
否则,如果(nStatus!= 0)
{
UART printf("命令返回错误代码%s\n",
StringFromResult ((FRESULT) nStatus);
}
}
}
//
//文件结尾
//