atk-vs1053 mp3模塊錄音功能使用說明mini v3_an1402_W.docx 免費下載
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、ALIENTEK STM32開發(fā)板AN1402AN1402 ATK-VS1053 MP3 模塊錄音功能使用說明本應(yīng)用文檔(AN1402,對應(yīng) ALIENTEK MiniSTM32 開發(fā)板(V3.0)擴展實驗 5)將教大家如何通過ALIENTEK STM32 開發(fā)板和 ATK-VS1053 MP3 模塊實現(xiàn)一個錄音機的功能。本文檔我們將使用ATK-VS1053 MP3 模塊實現(xiàn) WAV 錄音,設(shè)計一個簡單的錄音機! 本文檔分為如下幾部分: 1, WAV 簡介 2, 硬件設(shè)計 3, 軟件實現(xiàn) 4, 驗證 1、WAV 簡介 WAV 即 WAVE 文件,WAV 是計算機
2、領(lǐng)域最常用的數(shù)字化聲音文件格式之一,它是微軟專門為 Windows 系統(tǒng)定義的波形文件格式(Waveform Audio),由于其擴展名為*.wav。它符合 RIFF(Resource Interchange File Format)文件規(guī)范,用于保存Windows 平臺的音頻信息資源,被Windows 平臺及其應(yīng)用程序所廣泛支持,該格式也支持MSADPCM, CCITT A LAW 等多種壓縮運算法,支持多種音頻數(shù)字,取樣頻率和聲道,標準格式化的WAV 文件和 CD 格式一樣,也是 44.1K 的取樣頻率,16 位量化數(shù)字,因此在聲音文件質(zhì)量和 CD 相差無幾! ATK-VS1053 MP3
3、 模塊支持 2 種格式的WAV 錄音:PCM 格式或者 IMA ADPCM 格式, 其中PCM(脈沖編碼調(diào)制)是最基本的 WAVE 文件格式,這種文件直接存儲采樣的聲音數(shù)據(jù)沒有經(jīng)過任何的壓縮。而 IAM ADPCM 則是使用了壓縮算法,壓縮比率為 4:1。 這里,我們主要討論 PCM,因為這個最簡單。我們將利用 VS1053 實現(xiàn) 16 位,8Khz 采樣率的單聲道WAV 錄音(PCM 格式)。要想實現(xiàn) WAV 錄音得先了解一下WAV 文件的格式,WAVE 文件是由若干個 Chunk 組成的。按照在文件中的出現(xiàn)位置包括:RIFF WAVE Chunk、 Format Chunk、 Fact C
4、hunk(可選)和 Data Chunk。每個 Chunk 由塊標識符、 數(shù)據(jù)大小和數(shù)據(jù)三部分組成,如圖 1.1 所示: 圖 1.1 Chunk 結(jié)構(gòu)示意圖 其中塊標識符由 4 個 ASCII 碼構(gòu)成,數(shù)據(jù)大小則標出緊跟其后的數(shù)據(jù)的長度(單位為字節(jié)),注意這個長度不包含塊標識符和數(shù)據(jù)大小的長度,即不包含最前面的 8 個字節(jié)。所以實際 Chunk 的大小為數(shù)據(jù)大小加 8。 首先,我們來看看 RIFF 塊(RIFF WAVE Chunk),該塊以“RIFF”作為標示,緊跟 wav 文件大?。ㄔ摯笮∈?wav 文件的總大小-8),然后數(shù)據(jù)段為“WAVE”,表示是
5、開源電子網(wǎng)2014-03-26ALIENTEK STM32開發(fā)板AN1402文件。RIFF 塊的 Chunk 結(jié)構(gòu)如下:接著,我們看看 Format 塊(Format Chunk),該塊以“fmt ”作為標示(注意有個空 格?。?,一般情況下,該段的大小為 16 個字節(jié),但是有些軟件生成的 wav 格式,該部分可能有 18 個字節(jié),含有 2 個字節(jié)的附加信息。Format 塊的Chunk 結(jié)構(gòu)如下: 接下來,我們再看看 Fact 塊(Fact Chunk),該塊為可選塊,以“fact”作為標示, 不是每個 WAV 文件都有,在非 PCM 格式的文件中,一般會在 F
6、ormat 結(jié)構(gòu)后面加入一個 Fact 塊,該塊Chunk 結(jié)構(gòu)如下: DataFactSize 是這個Chunk 中最重要的數(shù)據(jù),如果這是某種壓縮格式的聲音文件,那么從這里就可以知道他解壓縮后的大小。對于解壓時的計算會有很大的好處!不過本文檔我們使用的是PCM 格式,所以不存在這個塊。 最后,我們來看看數(shù)據(jù)塊(Data Chunk),該塊是真正保存 wav 數(shù)據(jù)的地方,以“data” 作為該 Chunk 的標示。然后是數(shù)據(jù)的大小。緊接著就是 wav 數(shù)據(jù)。根據(jù) Format Chunk 中的聲道數(shù)以及采樣bit 數(shù),wav 數(shù)據(jù)的 bit 位置可以分成如表 1.1 所示的幾種形式: www.
7、開源電子網(wǎng)2014-03-26單聲道 取樣 1 取樣 2 取樣 3 取樣 4 8 位量化 聲道 0 聲道 0 聲道 0 聲道 0 雙聲道 取樣 1 取樣 2 8 位量化 聲道 0(左) 聲道 1(右) 聲道 0(左) 聲道 1(右) 單聲道 取樣 1 取樣 2 /fact 塊 typedef packed structu32 ChunkID;/chunk id;這里固定為fact,即 0X74636166; u32 ChunkSize ;/子集合大小(不包括 ID 和Size);這里為:4. u32 DataFactSize;/數(shù)據(jù)轉(zhuǎn)換為 PCM 格式后的大小 Chunk
8、FACT;/fmt 塊 typedef packed structu32 ChunkID;/chunk id;這里固定為fmt ,即 0X20746D66 u32 ChunkSize ;/子集合大小(不包括 ID 和Size);這里為:20.u16 AudioFormat;/音頻格式;0X10,表示線性 PCM;0X11 表示 IMA ADPCM u16 NumOfChannels;/通道數(shù)量;1,表示單聲道;2,表示雙聲道;u32 SampleRate;/采樣率;0X1F40,表示 8Khz u32 ByteRate;/字節(jié)速率;u16 BlockAlign;/塊對齊(字節(jié));u16 Bit
9、sPerSample;/單個采樣數(shù)據(jù)大小;4 位ADPCM,設(shè)置為 4ChunkFMT;/RIFF 塊 typedef packed structu32 ChunkID;/chunk id;這里固定為RIFF,即 0X46464952 u32 ChunkSize ;/集合大小;文件總大小-8u32 Format;/格式;WAVE,即 0X45564157ChunkRIFF ;ALIENTEK STM32開發(fā)板AN1402表 1.1 WAVE 文件數(shù)據(jù)采樣格式 本文檔,我們采用的是 16 位,單聲道,所以每個取樣為 2 個字節(jié),低字節(jié)在前,高字節(jié)在后。數(shù)據(jù)塊的Ch
10、unk 結(jié)構(gòu)如下: 通過以上學(xué)習(xí),我們對 WAVE 文件有了個大概了解。接下來,我們看看如何使用 VS1053 實現(xiàn)WAV(PCM 格式)錄音。激活 PCM 錄音 VS1053 激活PCM 錄音需要設(shè)置的寄存器和相關(guān)位如表 1.2 所示: 表 1.2 VS1053 激活PCM 錄音相關(guān)寄存器 通過設(shè)置 SCI_MODE 寄存器的 2、12、14 位,來激活 PCM 錄音,SCI_MODE 的各位描述見 VS1053 的數(shù)據(jù)手冊。SCI_AICTRL0 寄存器用于設(shè)置采樣率,我們本文檔用的是 8K 的采樣率,所以設(shè)置這個值為 8000 即可。SCI_AICTRL1 寄存器用于設(shè)置AGC,1024
11、 相當(dāng)于數(shù)字增加 1,這里建議大家設(shè)置 AGC 在 4(4*1024)左右比較合適。SCI_AICTRL2 用于設(shè)置自動AGC 的時候的最大值,當(dāng)設(shè)置為 0 的時候表示最大 64(65536),這個大家按自己的需要設(shè)置即可。最后,SCI_AICTRL3,我們本文檔用到的是咪頭線性 PCM 單聲道錄音,所以設(shè)置該寄存器值為 6。 通過這幾個寄存器的設(shè)置,我們就激活 VS1053 的PCM 錄音了。不過,VS1053 的PCM 錄音有一個小BUG,必須通過加載 patch 才能解決,如果不加載 patch,那么 VS1053 是不輸出PCM 數(shù)據(jù)的,VLSI 提供了我們這個 patch,只需要通過
12、軟件加載即可。 讀取 PCM 數(shù)據(jù) 在激活了PCM 錄音之后,SCI_HDAT0 和 SCI_HDAT1 有了新的功能。VS1053 的PCM 采樣緩沖區(qū)由 1024 個 16 位數(shù)據(jù)組成,如果 SCI_HDAT1 大于 0,則說明可以從 SCI_HDAT0 讀取至少 SCI_HDAT1 個 16 位數(shù)據(jù),如果數(shù)據(jù)沒有被及時讀取,那么將溢出,并返回空的狀態(tài)。 注意,如果 SCI_HDAT1896,最好等待緩沖區(qū)溢出,以免數(shù)據(jù)混疊。所以,對我們來說,只需要判斷SCI_HDAT1 的值非零,然后從 SCI_HDAT0 讀取對應(yīng)長度的數(shù)據(jù),即完 開源電子網(wǎng)2014-03
13、-26/data 塊 typedef packed structu32 ChunkID;/chunk id;這里固定為data,即 0X61746164 u32 ChunkSize ;/子集合大小(不包括 ID 和Size);文件大小-60.ChunkDATA;16 位量化 聲道 0(低字節(jié)) 聲道 0(高字節(jié)) 聲道 0(低字節(jié)) 聲道 0(高字節(jié)) 雙聲道 取樣 1 16 位量化 聲道 0 (左,低字節(jié)) 聲道 0 (左,高字節(jié)) 聲道 1 (右,低字節(jié)) 聲道 1 (右,高字節(jié)) ALIENTEK STM32開發(fā)板AN1402成一次數(shù)據(jù)讀取,以此循環(huán),即可
14、實現(xiàn) PCM 數(shù)據(jù)的持續(xù)采集。最后,我們看看本文檔實現(xiàn) WAV 錄音需要經(jīng)過哪些步驟: 1) 設(shè)置 VS1053 PCM 采樣參數(shù) 這一步,我們要設(shè)置 PCM 的格式(線性 PCM)、采樣率(8K)、位數(shù)(16 位)、通道數(shù)(單聲道)等重要參數(shù),同時還要選擇采樣通道(咪頭),還包括AGC 設(shè)置等??梢哉f這里的設(shè)置直接決定了我們 wav 文件的性質(zhì)。 2) 激活 VS1053 的 PCM 模式,加載 patch 通過激活VS1053 的PCM 格式,讓其開始 PCM 數(shù)據(jù)采集,同時,由于 VS1053 的 BUG, 我們需要加載patch,以實現(xiàn)正常的PCM 數(shù)據(jù)接收。 3) 創(chuàng)建 WAV 文件
15、,并保存 wav 頭 在前兩部設(shè)置成功之后,我們即可正常的從 SCI_HDAT0 讀取我們需要的PCM 數(shù)據(jù)了, 不過在這之前,我們需要先在創(chuàng)建一個新的文件,并寫入 wav 頭,然后才能開始寫入我們的PCM 數(shù)據(jù)。 4) 讀取 PCM 數(shù)據(jù) 經(jīng)過前面幾步的處理,這一步就比較簡單了,只需要不停的從 SCI_HDAT0 讀取數(shù)據(jù), 然后存入 wav 文件即可,不過這里我們還需要做文件大小統(tǒng)計,在最后的時候?qū)懭?wav 頭里面。 5) 計算整個文件大小,重新保存 wav 頭并關(guān)閉文件 在結(jié)束錄音的時候,我們必須知道本次錄音的大小(數(shù)據(jù)大小和整個文件大?。缓蟾?wav 頭,重新寫入文件,最后因為
16、 FATFS,在文件創(chuàng)建之后,必須調(diào)用 f_close,文件才會真正體現(xiàn)在文件系統(tǒng)里面,否則是不會寫入的!所以最后還需要調(diào)用 f_close,以保存 文件。 2、硬件設(shè)計 本文檔實驗功能簡介:開機的時候先檢測 SD 卡和字庫,然后測試 VS1053(正弦測試與寄存器測試),之后,檢測 SD 卡根目錄是否存在RECORDER 文件夾,如果不存在則創(chuàng)建, 如果創(chuàng)建失敗,則報錯。在找到 SD 卡的 RECORDER 文件夾后,即設(shè)置 VS1053 進入錄音模式,此時可以在耳機聽到VS1053 采集的音頻。KEY0 用于停止錄音并保存;KEY1 用于開始/暫停錄音;WK_UP 用于播放最近一次的錄音。
17、 當(dāng)我們按下 KEY1 的時候,可以在屏幕上看到錄音文件的名字,以及錄音時間,然后通過KEY0 可以停止錄音并保存該文件(文件名和時間也都將清零),在完成一個錄音后, 我們可以通過按WK_UP 按鍵,來試聽剛剛的錄音。DS1 用于提示程序正在運行。 本實驗用到的資源如下: 1) ALIENTEK MiniSTM32 開發(fā)板V3.02) TFTLCD 液晶模塊 3) ATK-VS1053 MP3 模塊 4) SD 卡 5) 耳機(非必須) ALIENTEK MiniSTM32 開發(fā)板與 ATK-VS1053 MP3 模塊的連接關(guān)系如圖 2.1 所示: 開源電子網(wǎng)20
18、14-03-26ALIENTEK STM32開發(fā)板AN1402GNDALIENTEKMiniSTM32開發(fā)板 5VPA8PA4PA5STM32F103RCT6PA7PA6PA12PA11圖 2.1 ATK-VS1053 MP3 模塊與 MiniSTM32 開發(fā)板連接關(guān)系圖 上表中,就是ALIENTEK MiniSTM32開發(fā)板與ATK-VS1053 MP3模塊的連接示意圖。實際連接如圖2.2所示: 圖 2.2 模塊與 STM32 開發(fā)板連接實物圖 圖中,我們總共用了 9 個杜邦線連接 ATK-VS1053 MP3 模塊與MiniSTM32 開發(fā)板,供電采用 5V
19、(開發(fā)板的 VOUT2)直接供電,完全與圖 2.1 所示的關(guān)系圖一致。 本實驗,大家需要準備 1 個 SD 卡和一個耳機,分別插入 SD 卡接口和耳機接口,然后 下載本實驗就可以實現(xiàn)一個簡單的錄音機了。 3、軟件實現(xiàn) 本文檔,我們在 MiniSTM32 開發(fā)板 V3.0 的擴展例程 4 的基礎(chǔ)上修改,先打開擴展例程4 的工程,首先在 APP 文件夾下面新建 recorder.c 和 recorder.h 兩個文件,然后將 recorder.c 加入到工程的APP 組下。 因為 recorder.c 代碼比較多,我們這里僅介紹其中的三個函數(shù),首先是設(shè)置 VS1053 進 www.openedv.
20、com開源電子網(wǎng)2014-03-26ATK-VS1053MP3模塊 GND5VXCSXDCSSCKSISODREQRSTALIENTEK STM32開發(fā)板AN1402入PCM 模式的函數(shù):recoder_enter_rec_mode,該函數(shù)代碼如下: 該函數(shù)就是用我們前面介紹的方法,激活 VS1053 的 PCM 模式,本章,我們使用的是8Khz 采樣率,16 位單聲道線性 PCM 模式,AGC 通過函數(shù)參數(shù)設(shè)置。最后加載 patch(用于修復(fù) VS1053 錄音 BUG)。 第二個函數(shù)是初始化 wav 頭的函數(shù):recoder_wav_init,該函數(shù)代碼如下
21、: 該函數(shù)初始化 wav 頭的絕大部分數(shù)據(jù),這里我們設(shè)置了該 wav 文件為 8Khz 采樣率,16位線性PCM 格式,另外由于錄音還未真正開始,所以文件大小和數(shù)據(jù)大小都還是未知的,開源電子網(wǎng)2014-03-26/初始化 WAV 頭.void recoder_wav_init( WaveHeader* wavhead) /初始化 WAV頭 wavhead-riff.ChunkID=0X46464952; /RIFFwavhead-riff.ChunkSize=0;/還未確定,最后需要計算wavhead-riff.Format=0X45564157;/WAVEwav
22、head-fmt.ChunkID=0X20746D66; /fmt wavhead-fmt.ChunkSize=16;/大小為 16 個字節(jié) wavhead-fmt.AudioFormat=0X01;/0X01,表示PCM;0X01,表示 IMA ADPCM wavhead-fmt.NumOfChannels=1;/單聲道 wavhead-fmt.SampleRate=8000;/8Khz 采樣率 采樣速率wavhead-fmt.ByteRate=wavhead-fmt.SampleRate*2;/16 位,即 2 個字節(jié)wavhead-fmt.BlockAlign=2;/塊大小,2 個字節(jié)為
23、一個塊wavhead-fmt.BitsPerSample=16;/16 位PCMwavhead-data.ChunkID=0X61746164;/datawavhead-data.ChunkSize=0;/數(shù)據(jù)大小,還需要計算 /進入 PCM 錄音模式 /agc:0,自動增益.1024 相當(dāng)于 1 倍,512 相當(dāng)于 0.5 倍,最大值 65535=64 倍 void recoder_enter_rec_mode(u16 agc)/如果是 IMA ADPCM,采樣率計算公式如下:/采樣率=CLKI/256*d;/假設(shè) d=0,并 2 倍頻,外部晶振為 12.288M.那么 Fc=(2*1228
24、8000)/256*6=16Khz/如果是線性 PCM,采樣率直接就寫采樣值VS_WR_Cmd(SPI_BASS,0x0000);VS_WR_Cmd(SPI_AICTRL0,8000); /設(shè)置采樣率,設(shè)置為 8Khz VS_WR_Cmd(SPI_AICTRL1,agc);/設(shè)置增益,0,自動增益.1024 相當(dāng)于 1 倍,512 相當(dāng)于 0.5 倍,最大值 65535=64 倍VS_WR_Cmd(SPI_AICTRL2,0);/設(shè)置增益最大值,0,代表最大值 65536=64X VS_WR_Cmd(SPI_AICTRL3,6);/ 左 通 道 (MIC 單 聲 道 輸 入 ) VS_WR_C
25、md(SPI_CLOCKF,0X2000);/設(shè)置 VS10XX 的時鐘,MULT:2 倍頻;ADD:不允許;CLK:12.288Mhz VS_WR_Cmd(SPI_MODE,0x1804);/MIC, 錄 音 激 活 delay_ms(5);/ 等 待 至 少 1.35msVS_Load_Patch(u16*)wav_plugin,40);/VS1053 的 WAV 錄音需要 ALIENTEK STM32開發(fā)板AN1402要等錄音結(jié)束才能知道。該函數(shù) WaveHeader 結(jié)構(gòu)體就是由前面介紹的三個Chunk 組成, 結(jié)構(gòu)為: 最后,我們介紹reco
26、der_play 函數(shù),是錄音機實現(xiàn)的主循環(huán)函數(shù),該函數(shù)代碼如下: 開源電子網(wǎng)2014-03-26/錄音機 /所有錄音文件,均保存在 SD 卡 RECORDER 文件夾內(nèi). u8 recoder_play(void)u8 res; u8 key; u8 rval=0; WaveHeader *wavhead=0;u32 sectorsize=0; u16 w; u16 idx=0;FIL* f_rec=0;/文件 DIR recdir;/目錄 u8 *recbuf;/數(shù)據(jù)內(nèi)存 u8 rec_sta=0;/錄音狀態(tài) /7:0,沒有錄音;1,有錄音;/6:1:保留 /
27、0:0,正在錄音;1,暫停錄音;u8 *pname=0;u8 timecnt=0;/計時器 u32 recsec=0;/錄音時間 u8 recagc=4;/默認增益為 4u8 playFlag=0;/播放標志while(f_opendir(&recdir,0:/RECORDER)/打開錄音文件夾 Show_Str(60,230,240,16,RECORDER 文件夾錯誤!,16,0); delay_ms(200); 、LCD_Fill(60,230,240,246,WHITE); delay_ms(200); /清除顯示f_mkdir(0:/RECORDER);/創(chuàng)建該目錄 f_rec=(FI
28、L *)mymalloc(sizeof(FIL);/開辟 FIL 字節(jié)的內(nèi)存區(qū)域 if(f_rec=NULL)rval=1;/申請失敗 wavhead=( WaveHeader*)mymalloc(sizeof( WaveHeader);/申請內(nèi)存if(wavhead=NULL)rval=1;recbuf=mymalloc(512); if(recbuf=NULL)rval=1;pname=mymalloc(30);/申請 30 個字節(jié)內(nèi)存,類似0:RECORDER/REC00001.wavif(pname=NULL)rval=1;/wav 頭 typedef packed structChu
29、nkRIFF riff;/riff 塊 ChunkFMT fmt;/fmt 塊 /ChunkFACT fact; /fact 塊 線性PCM,沒有這個結(jié)構(gòu)體ChunkDATA data; /data 塊 WaveHeader;ALIENTEK STM32開發(fā)板AN1402開源電子網(wǎng)2014-03-26if(rval=0)/內(nèi)存申請 OKrecoder_enter_rec_mode(1024*recagc); while(VS_RD_Reg(SPI_HDAT1)8);/等到 buf 較為空閑再開始recoder_show_time(r
30、ecsec);/顯示時間 recoder_show_agc(recagc);/顯示 agcpname0=0;/pname 沒有任何文件名 while(rval=0)key=KEY_Scan(0); switch(key)case KEY0_PRES: /STOP&SAVE if(rec_sta&0X80)/有錄音 wavhead-riff.ChunkSize=sectorsize*512+36;/文件的大小-8; wavhead-data.ChunkSize=sectorsize*512; /數(shù)據(jù)大小f_lseek(f_rec,0);/偏移到文件頭. f_write(f_rec,(const
31、void*)wavhead,sizeof( WaveHeader),&bw);/寫入頭數(shù)據(jù)f_close(f_rec);sectorsize=0;rec_sta=0; recsec=0;LED1=1;/關(guān)閉 DS1LCD_Fill(60,230,240,246,WHITE);/清除之前顯示的文件名recoder_show_time(recsec);/顯示時間 break;case KEY1_PRES: /REC/PAUSE if(rec_sta&0X01)/原來是暫停,繼續(xù)錄音 rec_sta&=0XFE;/取消暫停 else if(rec_sta&0X80)/已經(jīng)在錄音了,暫停 rec_st
32、a|=0X01;/暫停 else/還沒開始錄音 rec_sta|=0X80;/開始錄音recoder_new_pathname(pname);/得到新的名字Show_Str(60,230,240,16,pname+11,16,0); /顯示文件名字recoder_wav_init(wavhead); /初始化 wav 數(shù)據(jù)res=f_open(f_rec,(const TCHAR*)pname,FA_CREATE_ALWAYS|FA_WRITE);ALIENTEK STM32開發(fā)板AN1402開源電子網(wǎng)2014-03-26if(re
33、s)/文件創(chuàng)建失敗 rec_sta=0;/創(chuàng)建文件失敗,不能錄音rval=0XFE;/提示是否存在 SD 卡 else res=f_write(f_rec,(const void*)wavhead, sizeof( WaveHeader),&bw);/寫入頭數(shù)據(jù) break;case WKUP_PRES:/播放錄音(僅在非錄音狀態(tài)下有效) if(rec_sta=0)playFlag=1;if(rec_sta=0X80)/已經(jīng)在錄音了 w=VS_RD_Reg(SPI_HDAT1); if(w=256)&(w896)idx=0;while(idx8;res=f_write(f_rec,recbuf
34、,512,&bw);/寫入文件if(res)printf(err:%drn,res); printf(bw:%drn,bw); break;/寫入出錯.sectorsize+;/扇區(qū)數(shù)增加 1,約為 32mselse/沒有開始錄音,則檢測KEY1 按鍵,播放最近的錄音 if(playFlag&pname0)/如果 wk_up 按鍵被按下,且 pname 不為空 Show_Str(60,230,240,16,播放:,16,0);Show_Str(60+40,230,240,16,pname+11,16,0);/顯示當(dāng)播放的名字rec_play_wav(pname);/ 播 放 pname LCD
35、_Fill(60,230,240,246,WHITE);/清除顯示 recoder_enter_rec_mode(1024*recagc);/重新進入錄音模式while(VS_RD_Reg(SPI_HDAT1)8); /等到buf 較為空閑再開始recoder_show_time(recsec);/顯示時間 recoder_show_agc(recagc);/顯示 ALIENTEK STM32開發(fā)板AN1402該函數(shù)實現(xiàn)了我們在硬件設(shè)計時介紹的功能,我們就不詳細介紹了,請大家自己分析代碼。recorder.c 的其他代碼和 recorder.h 的代碼我們
36、這里就不再貼出了,請大家參考本例程源碼(擴展實驗 5)。保存 recorder.c,最后,我們在 test.c 里面修改 main 函數(shù)如下: 開源電子網(wǎng)2014-03-26int main(void)u8 key,fontok=0;Stm32_Clock_Init(9);/系統(tǒng)時鐘設(shè)置delay_init(72);/延時初始化uart_init(72,9600);/串口 1 初始化LCD_Init();/初始化液晶 LED_Init();/LED 初始化 KEY_Init();/按鍵初始化 VS_Init();/初始化 VS1053 usmart_dev.ini
37、t(72);/usmart 初始化mem_init();/初始化內(nèi)存池 exfuns_init();/為 fatfs 相關(guān)變量申請內(nèi)存 f_mount(fs0,0:,1);/掛載 SD 卡 f_mount(fs1,1:,1);/掛載 FLASH. RST:POINT_COLOR=RED;/設(shè)置字體為紅色LCD_ShowString(60,30,200,16,16,Mini STM32); LCD_ShowString(60,50,200,16,16,RECORDER TEST); LCD_ShowString(60,70,200,16,16,ATOMALIENTEK); LCD_ShowStr
38、ing(60,90,200,16,16,KEY0:STOP&SAVE);LCD_ShowString(60,110,200,16,16,KEY1:REC/PAUSE);playFlag = 0;delay_ms(5); timecnt+; if(timecnt%20)=0)LED1=!LED1;/DS1 閃爍 if(recsec!=(sectorsize*4/125)/錄音時間顯示 LED1=!LED1;/DS1 閃爍 recsec=sectorsize*4/125; recoder_show_time(recsec); /顯示時間 myfree(wavhead); myfree(recbuf
39、); myfree(f_rec); myfree(pname); return rval;ALIENTEK STM32開發(fā)板AN1402該函數(shù)先檢測SD卡是不是在位(初始化SD卡),存在則繼續(xù),不存在在報錯,然后檢測外部flash是否存在字庫,如果不存在字庫,則更新字庫,如果存在則繼續(xù)下面的操作:對VS1053進行正弦測試和寄存器測試,隨后調(diào)用錄音機測試函數(shù):recoder_play,開始錄音測試,此時可以在耳機聽到MIC的采集的聲音了。 最后,我們將VS_WR_Cmd,這個函數(shù)加入usmart控制,這樣我們就可以利用usmart來設(shè)置VS1053的一些參數(shù)了,
40、這里主要是設(shè)置AGC,比如通過發(fā)送:VS_WR_Cmd(0X0D,4096),將設(shè)置AGC的放大倍數(shù)為4。 軟件部分就介紹到這里。 開源電子網(wǎng)2014-03-26LCD_ShowString(60,130,200,16,16,WK_UP:PLAY ); LCD_ShowString(60,150,200,16,16,2014/3/26);while(SD_Initialize()LCD_ShowString(60,170,200,16,16,SD Card Error); delay_ms(200); LCD_Fill(20,170,200+20,170+16,WHITE); delay_ms(200);fontok=font_init();/檢查字庫是否 OK if(fontok)/需要更新字庫 LCD_Clear(WHITE);/清屏 POINT_COLOR=RED;/設(shè)置字體為紅色LCD_ShowString(60,50,200,16,16,ALIENTEK STM32); LCD_ShowString(60,70,200,16,16,SD Card OK);L
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 貴州大學(xué)《圖像處理技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 貴州財經(jīng)職業(yè)學(xué)院《古生物及地史學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025陜西建筑安全員知識題庫
- 2025年江蘇省建筑安全員-B證考試題庫附答案
- 貴陽信息科技學(xué)院《中外城市發(fā)展與規(guī)劃史》2023-2024學(xué)年第一學(xué)期期末試卷
- 硅湖職業(yè)技術(shù)學(xué)院《英語寫作1》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025甘肅省建筑安全員知識題庫附答案
- 廣州新華學(xué)院《智能感知與移動計算》2023-2024學(xué)年第一學(xué)期期末試卷
- 期貨交易知識入門-理論與實務(wù)課件(考試參考)
- 稅金分析課件
- 四川省成都市2021-2022學(xué)年高一(上)期末調(diào)研考試物理試題 Word版
- 2023-2024江蘇小高考思想政治試卷及答案
- OFM軟件的一些使用技巧
- 2023-2024學(xué)年四川省樂山市小學(xué)數(shù)學(xué)四年級上冊期末??伎荚囶}
- 工程進度管理制度
- GB/T 34370.1-2017游樂設(shè)施無損檢測第1部分:總則
- GB/T 15924-1995錫礦石化學(xué)分析方法碘量法測定錫量
- GB/T 13914-2013沖壓件尺寸公差
- 貝利尤單抗Belimumab詳細說明書與重點
- 《信息檢索實驗》課程教學(xué)大綱
- 連退生產(chǎn)過程操作優(yōu)化-質(zhì)量預(yù)報監(jiān)測及診斷
評論
0/150
提交評論