在實際的工程運用中,大多數都需要將獲取的資料進行存盤,防止資料的丟失以及后期的資料驗證。
一、主要任務
1 配置FATFS實作在SD卡中創建TXT檔案;
2 將資料分行寫入SD卡的TXT檔案中;
3 將寫入的資料讀出,并通過串口1列印出來。
二、執行步驟
1 選擇芯片型號STM32F407ZG,可直接搜索,點擊即可。

2 基本配置,設定RCC為外部時鐘。

3 配置SYS。

4 STM32F407ZG的SD卡通過SDIO接入芯片,故需要配置SDIO。

5.1 配置FATFS,勾遠SD Card;在Set Defines中進行如下修改。
5.2 配置Platform Solutions,設定PE2為輸入模式-->點擊System View-->點擊GPIO,進行設定。

進入FATFS配置配置Platform Solutions。

6 配置串口1。

7 配置時鐘樹。

8 設定工程基本資訊:工程名、工程位置 4、IDE、Linker Setting,并建議將.c和.h分開。


9 配置完成,生成代碼,創建工程。
三、代碼實作
1 配置串口1printf列印。在usart.c中添加如下代碼:
#include <stdio.h>
struct __FILE
{
int handle;
};
FILE __stdout;
void _sys_exit(int x)
{
x = x;
}
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);
USART1->DR=(uint8_t)ch;
return ch;
}
2 通過fatfs函式進行檔案創建、打開、寫入、讀取關閉等操作。
2.1創建變數
/*xxxxxxxxxxxxxxxxxxxxxxxx存盤變數xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
FATFS fs; //作業空間
FIL fil; // 檔案專案
uint32_t byteswritten; // 寫檔案計數
uint32_t bytesread; // 讀檔案計數
uint8_t wtext[10]; // 寫的內容
uint8_t rtext[1024]; // 讀取的buff
char filename[] = "溫度.txt"; // 檔案名
const uint8_t newline[]={0X0D,0X0A};//換行
/*xxxxxxxxxxxxxxxxxxxxxxxxDS18B20變數xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
2.2掛載檔案系統并創建檔案
void InitFatFas(void)
{
/*-1- 掛載檔案系統*/
retSD = f_mount(&fs, "", 0);
if(retSD)
{
printf("mount error : %d \r\n",retSD);
Error_Handler();
}
else
printf("mount sucess!!! \r\n");
/*-2-創建新的檔案*/
retSD = f_open(&fil, filename, FA_CREATE_ALWAYS | FA_WRITE); //打開檔案,權限包括創建、寫(如果沒有該檔案,會創建該檔案)
if(retSD==FR_OK) printf("\r\ncreater file sucess!!! \r\n");
else printf("\r\ncreater file error : %d\r\n",retSD);
f_close(&fil); //關閉該檔案
HAL_Delay(100);
}
2.3 寫入資料與讀出,并通過printf列印、同時多行存入,避免資料覆寫。
此處存入檔案資料來自于DS18B20的采集。
void FatFsTest(void)
{
HAL_Delay(1);
//周期性讀取資料并存盤
if(t%1000==0)//每1000ms讀取一次
{
temperature=DS18B20_Get_Temp();
if(temperature<0)
{
temperature=-temperature; //轉為正數
}
wtext[0]=' ';
wtext[1]=(temperature/100)+48;
wtext[2]=((temperature%100)/10)+48;
wtext[3]='.';
wtext[4]=((temperature%100)%10)+48;
wtext[5]='C';
/*-2-創建新的檔案并寫入資料*/
retSD = f_open(&fil, filename,FA_WRITE); //打開檔案,權限包括創建、寫(如果沒有該檔案,會創建該檔案)
if(retSD==FR_OK) //回傳值不為0(出現問題)
{
f_lseek(&fil,f_size(&fil));//將指標指向檔案末尾
retSD=f_write(&fil,wtext, sizeof(wtext), (void *)&byteswritten); //寫資料
if(retSD) printf("\r\nwrite file error : %d\r\n",retSD); //列印問題代碼
else
{
printf("\r\nwrite file sucess!!! \r\n");
printf("\r\nwrite Data : %s\r\n",wtext); //列印寫入的內容
}
f_write(&fil, newline,2, (void *)&byteswritten); //換行
f_close(&fil);
}
else printf("open file error : %d\r\n",retSD); //列印問題代碼
}
}
四、下載驗證
1 串口查看列印

2 SD卡查看

uj5u.com熱心網友回復:
內容很詳細,邏輯嚴密,受用了uj5u.com熱心網友回復:
博主寫的很詳細,真的很棒,感謝!uj5u.com熱心網友回復:
很棒的資源。uj5u.com熱心網友回復:
思路清晰,博主人長的又帥!多多支持uj5u.com熱心網友回復:
受教了,思路清晰,技術性強??轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/23820.html
標籤:硬件使用
上一篇:編制程式,使甲、乙單片機能夠進行通信。要求:甲機發送資料1,2,3,4,5,6,7至乙機;乙機接收后,采用LED燈(發光二極管)實時顯示接收到的資料,低電平驅動
