2016-10-26 54 views
0

我是新來的嵌入式系統,並試圖通過MP3轉換程序移植到基於ARM的STM32L476G-DISCO開發板。我還使用基於Eclipse的免費System Workbench軟件。我已經成功地達到了編寫該程序並將其閃存在板上的程度。它甚至可以運行到程序要求輸入文件(.wav)的程度。嵌入文件在STM32 ARM平臺的閃存

我的問題是如何實現文件處理部分?以前,當運行原始的Windows控制檯應用程序時,我只需發送一個命令行參數,如「'> C:\ file.wav < C:\ file.mp3」。

該主板配備128Mbit閃存,利用QSPI進行通信以及內部閃存。我需要一個文件系統來讀/寫一個文件到我的程序中嗎?我正在考慮開始簡單,只是嵌入文件,但我不知道如何在我的代碼中調用它。我可以通過編程軟件手動編程內存,但是我所知道的只是閃存數據的地址。

+0

不適合我。您的應用程序是否應該始終播放相同的文件,或者您必須一次發送不同的文件?您的嵌入式平臺的可用空間是否足以存儲要播放的文件? – LPs

+0

最後,我會每次發送一個不同的文件,但要開始我只想在同一個文件中讀取並轉換它。該板有1MB的內部閃存,其中只有80KB正在被應用程序代碼使用。 .mp3文件本身是148KB。 – sam

+0

因此,正如@Clifford答案所描述的,您可以將其視爲「大量字節」並將wav文件鏈接到您的應用程序代碼。爲了將來的使用,您將在閃存中預留空間(例如使用liker腳本),您將存儲要轉換和播放的wav文件的「字節」。 – LPs

回答

0

如果您已經將數據寫入到內部閃存中,則您所需要的只是其地址 - 它不再是一個「文件」,它可以視爲您將文件中的數據讀入該位置。而不是從你的應用程序中的數據單獨編程,你可以寫一個代碼生成工具,讀取格蘭開發主機上德FIKE,並將其轉換爲C代碼數據數組這樣的:

static const uint8_t wav_file[] = { '\x00, `\x55` ... 
            ... 
            ... } ; 

你然後編譯和鏈接到您的應用代碼。

這將允許鏈接程序找到您的數據,並避免任何應用程序代碼和數據互相侵入的問題。此外,它給玩具數據一個象徵性的開始地址和大小,可以由sizeof(wav_file)確定。

但是,如果數據存儲在外部閃存中,則不能使用此方法,因爲該數據不是內存映射的。在這種情況下,需要將數據讀入RAM中進行處理。

如果你的音頻庫需要一個文件,但你不想修改它,那麼你需要一個文件系統。在任何情況下,文件系統可能是管理外部閃存的最簡單和最安全的方式。

+0

如果我的文件聲明如下: '/ *一些全局變量。 */ char * infname,* outfname; FILE * infile,* outfile;' 和後來調用像這樣...: 'int main(void) { \t wave_t wave; \t int寫入; \t unsigned char * data; \t time(&start_time); \t/*打開輸入文件,並填寫在配置shine_wave_t頭*/ \t如果 \t錯誤( 「無法打開WAVE文件」)(wave_open(infname,和波,和配置,安靜)!); \t infile = wave.file; \t ...' 我該如何指定只讀文件在我已經閃存到(0x08020000)的位置? – sam

+0

@sam解決方案取決於平臺,編譯器和鏈接器。你應該發佈一個新的問題與詳細信息 – LPs

+0

@sam:評論不適合發佈其他問題或澄清,特別是包括代碼。更新您的問題或發佈新問題。你需要的不是使用'wave_open()'或任何文件I/O API。您不需要「打開」文件,因爲沒有文件 - wav數據已經作爲完整的數據陣列存在。如果你指定了你正在使用的wav庫,可能會有幫助 - 再次通過更新問題而不是在註釋中, – Clifford