?? main.c
字號:
/*
*********************************************************************************************************
*
* 模塊名稱 : 主程序模塊。
* 文件名稱 : main.c
* 版 本 : V2.0
* 說 明 : 該例程實現(xiàn)讀寫SD卡文件的功能。移植了FatFS文件系統(tǒng)。
* 修改記錄 :
* 版本號 日期 作者 說明
* v1.0 2011-08-27 armfly ST固件庫V3.5.0版本。
* v2.0 2011-10-16 armfly 優(yōu)化工程結構。
*
* Copyright (C), 2010-2011, 安富萊電子 www.armfly.com
*
*********************************************************************************************************
*/
/*
!!!注意:該例程可以在CPU Flash和CPU RAM中調試,暫時不支持在外部RAM調試。
這個例程中的函數(shù)用到了較多的局部變量,因此缺省的堆棧不夠用。
需要調整大一些。
修改 startup_stm32f10x_hd.s 文件
以前為 :Stack_Size EQU 0x00000400
現(xiàn)在為 :Stack_Size EQU 0x00001000
*/
/*
操作說明:
(1) 請接上串口線,打開windows的串口工具,比如超級終端。
(2) 輸入字符1,打印SD根目錄下的文件和文件夾列表。
(3) 輸入字符2,在SD卡根目錄下創(chuàng)建一個文件,文件名為 armfly.txt
并且向該文件寫入一個字符串。
(4) 輸入字符3,打開SD卡根目錄下的armfly.txt文件,讀出其內容,打印到串口。
(5) 輸入字符4,創(chuàng)建打開SD卡根目錄下的armfly.txt文件,讀出其內容,打印到串口。
(6) 輸入字符5,寫文件和讀文件速度測試
*/
#include "stm32f10x.h" /* 如果要用ST的固件庫,必須包含這個文件 */
#include <stdio.h> /* 因為用到了printf函數(shù),所以必須包含這個文件 */
#include <string.h> /* 因為用到了字符串操作函數(shù),所以必須包含這個文件 */
#include "bsp_usart.h" /* printf函數(shù)定向輸出到串口,所以必須包含這個文件 */
#include "bsp_led.h" /* LED指示燈驅動模塊 */
#include "bsp_button.h" /* 按鍵驅動模塊 */
#include "bsp_timer.h" /* systick定時器模塊 */
#include "bsp_sdio_sd.h" /* SD卡驅動模塊 */
#include "ff.h" /* FatFS文件系統(tǒng)模塊*/
/* 定義例程名和例程發(fā)布日期 */
#define EXAMPLE_NAME "SDIO+FatFs文件系統(tǒng)例程"
#define EXAMPLE_DATE "2011-10-16"
#define DEMO_VER "2.0"
/* 用于測試讀寫速度 */
#define TEST_FILE_LEN 1000 /* (2*1024*1024) 用于測試的文件長度 */
#define BUF_SIZE 50 /* 每次讀寫SD卡的最大數(shù)據(jù)長度 */
uint8_t g_TestBuf[BUF_SIZE];
unsigned char str[9]; //全局
unsigned int receivedtxt[30];
/* 僅允許本文件內調用的函數(shù)聲明 */
static void InitBoard(void);
static void PrintfLogo(void);
static void DispMenu(void);
static void ViewRootDir(void);
static void CreateNewFile(void);
static void ReadFileData(void);
static void CreateDir(void);
static void WriteFileTest(void);
unsigned int format_data(char *s, unsigned int adc) //////將常數(shù)合成字符串
{
int pos=0,i=0;
static char temp_str[8]={'\0','\0','\0','\0','\0','\0','\0','\0'};
u32tostr(adc,temp_str); //////整形變字符串
while(temp_str[i]) //do
{
s[pos]=temp_str[i];
i++;pos++;
} //;
i=0;
//pos++;
s[pos]=0x0D;pos++;
s[pos]=0x0A;//pos++;
pos=0;
//s[pos]=0;
return pos;
}
void ascii_int(char *file_buf) //////將常數(shù)合成字符串
{
uint32_t i;
uint16_t begin, end;
char Line1[8];
char Line2[8];
char Line3[8];
//1002 回車換行 i==4
//0 回車換行
//2009 回車換行
// 搜索第1行
begin = 0;
for (i = 0; i < 80; i++)
{
if (file_buf[i] == 0x0D)
{
end = i - 1; ////end=3
break;
}
}
// 保存第1行 開始處,結束處
memcpy(Line1, &file_buf[begin], end);
// 搜索第2行
begin = end + 2;
for (i = begin; i < 80; i++)
{
if (file_buf[i] == 0x0D)
{
end = i - 1;
break;
}
}
// 保存第2行
memcpy(Line2, &file_buf[begin], end);
// 搜索第3行
begin = end + 2;
for (i = begin; i < 80; i++)
{
if (file_buf[i] == 0x0D)
{
end = i - 1;
break;
}
}
// 保存第3行
memcpy(Line3, &file_buf[begin], end);
receivedtxt[0]=strtou32(Line1);
receivedtxt[1]=strtou32(Line2);
receivedtxt[2]=strtou32(Line3);
}
/*
*********************************************************************************************************
* 函 數(shù) 名: main
* 功能說明: c程序入口
* 形 參:無
* 返 回 值: 錯誤代碼(無需處理)
*********************************************************************************************************
*/
int main(void)
{
char cmd;
uint8_t KeyCode;
/*
由于ST固件庫的啟動文件已經執(zhí)行了CPU系統(tǒng)時鐘的初始化,所以不必再次重復配置系統(tǒng)時鐘。
啟動文件配置了CPU主時鐘頻率、內部Flash訪問速度和可選的外部SRAM FSMC初始化。
系統(tǒng)時鐘缺省配置為72MHz,如果需要更改,可以修改:
\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.c
中配置系統(tǒng)時鐘的宏。
*/
InitBoard(); /* 為了是main函數(shù)看起來更簡潔些,我們將硬件初始化的代碼封裝到這個函數(shù) */
PrintfLogo(); /* 打印例程Logo到串口1 */
SDIO_Interrupts_Config(); /* 配置SDIO中斷, 此函數(shù)在bsp_sdio_sd.c */
/* 打印命令列表,用戶可以通過串口操作指令 */
DispMenu();
while(1)
{
cmd = getchar();
/* 讀取按鍵,大于0表示有鍵按下 */
KeyCode = bsp_GetKey();
if (KeyCode > 0)
{
/* 有鍵按下 */
switch (KeyCode)
{
case KEY_DOWN_JOY_LEFT: /* 搖桿LEFT鍵按下 */
CreateNewFile();
ReadFileData(); /* 讀取根目錄下armfly.txt的內容 */
break;
case KEY_DOWN_JOY_RIGHT: /* 搖桿RIGHT鍵按下 */
WriteFileTest(); /* 速度測試 */
break;
default:
break;
}
}
cmd = getchar();
switch (cmd)
{
case '1':
printf("【1 - ViewRootDir】\r\n");
ViewRootDir(); /* 顯示SD卡根目錄下的文件名 */
break;
case '2':
printf("【2 - CreateNewFile】\r\n");
CreateNewFile(); /* 創(chuàng)建一個新文件,寫入一個字符串 */
break;
case '3':
printf("【3 - ReadFileData】\r\n");
ReadFileData(); /* 讀取根目錄下armfly.txt的內容 */
break;
case '4':
printf("【4 - CreateDir】\r\n");
CreateDir(); /* 創(chuàng)建目錄 */
break;
case '5':
printf("【5 - TestSpeed】\r\n");
WriteFileTest(); /* 速度測試 */
break;
default:
DispMenu();
break;
}
}
}
/*
*********************************************************************************************************
* 函 數(shù) 名: DispMenu
* 功能說明: 顯示操作提示菜單
* 形 參:無
* 返 回 值: 無
*********************************************************************************************************
*/
static void DispMenu(void)
{
printf("\r\n*******************************************\r\n");
printf("請選擇操作命令:\r\n");
printf("1 - 顯示SD卡根目錄下的文件列表\r\n");
printf("2 - 創(chuàng)建一個新文件\r\n");
printf("3 - 讀文件數(shù)據(jù)\r\n");
printf("4 - 創(chuàng)建目錄\r\n");
printf("5 - 讀寫文件速度測試\r\n");
}
/*
*********************************************************************************************************
* 函 數(shù) 名: ViewRootDir
* 功能說明: 顯示SD卡根目錄下的文件名
* 形 參:無
* 返 回 值: 無
*********************************************************************************************************
*/
static void ViewRootDir(void)
{
/* 本函數(shù)使用的局部變量占用較多,請修改啟動文件,保證堆棧空間夠用 */
FRESULT result;
FATFS fs;
DIR DirInf;
FILINFO FileInf;
uint8_t tmpStr[20];
uint32_t cnt = 0;
/* 掛載文件系統(tǒng) */
result = f_mount(0, &fs); /* Mount a logical drive */
if (result != FR_OK)
{
printf("掛載文件系統(tǒng)失敗 (%d)\r\n", result);
}
/* 打開根文件夾 */
result = f_opendir(&DirInf, "/"); /* 如果不帶參數(shù),則從當前目錄開始 */
if (result != FR_OK)
{
printf("打開根目錄失敗 (%d)\r\n", result);
return;
}
/* 讀取當前文件夾下的文件和目錄 */
printf("Name\t\tTyepe\t\tSize\r\n");
for (cnt = 0; ;cnt++)
{
result = f_readdir(&DirInf,&FileInf); /* 讀取目錄項,索引會自動下移 */
if (result != FR_OK || FileInf.fname[0] == 0)
{
break;
}
if (FileInf.fname[0] == '.')
{
continue;
}
printf("%s", FileInf.fname);
if (strlen(FileInf.fname) < 8) /* 對齊 */
{
printf("\t\t");
}
else
{
printf("\t");
}
if (FileInf.fattrib == AM_DIR)
{
printf("目錄\t\t");
}
else
{
printf("文件\t\t");
}
printf("%d\r\n", FileInf.fsize);
sprintf((char *)tmpStr, "%d", FileInf.fsize);
}
/* 卸載文件系統(tǒng) */
f_mount(0, NULL);
}
/*
*********************************************************************************************************
* 函 數(shù) 名: CreateNewFile
* 功能說明: 在SD卡創(chuàng)建一個新文件,文件內容填寫“www.armfly.com”
* 形 參:無
* 返 回 值: 無
*********************************************************************************************************
*/
static void CreateNewFile(void)
{
/* 本函數(shù)使用的局部變量占用較多,請修改啟動文件,保證堆棧空間夠用 */
FRESULT result;
FATFS fs;
FIL file;
DIR DirInf;
uint32_t bw;
/* 掛載文件系統(tǒng) */
result = f_mount(0, &fs); /* Mount a logical drive */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -