版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
基于STM32單片機(jī)的音樂播放器設(shè)計(jì)目錄摘要 2第1章緒論 41.1本課題的背景及意義 41.2研究現(xiàn)狀 4第2章硬件設(shè)計(jì) 52.1整體方案 52.2系統(tǒng)架構(gòu)圖 52.3硬件模塊 52.3.1單片機(jī) 52.3.2SD卡模塊 82.3.3LCD顯示模塊 82.3.4VS1053模塊 8第3章軟件設(shè)計(jì) 103.1FATFS文件系統(tǒng) 103.2UCGUI圖形用戶界面 103.3操作系統(tǒng)移植 103.4底層驅(qū)動(dòng)程序設(shè)計(jì) 113.4.1TFTLCD顯示驅(qū)動(dòng)程序設(shè)計(jì) 113.4.2VS1053驅(qū)動(dòng)程序設(shè)計(jì) 123.4.3SD卡的驅(qū)動(dòng) 13第4章 系統(tǒng)調(diào)試與分析 144.1硬件調(diào)試 144.2軟件調(diào)試 144.3功能模塊的介紹 144.3.1電子書功能 154.3.2相冊(cè)功能 164.3.3時(shí)鐘與鬧鐘功能 164.3.4MP3功能 174.3.5畫板功能 174.3.6設(shè)置功能 18總結(jié) 19參考文獻(xiàn) 20附錄 21摘要本設(shè)計(jì)介紹了如何在使用STM32單片機(jī)的基礎(chǔ)上設(shè)計(jì)一個(gè)音頻播放器的方法,以及實(shí)現(xiàn)了將存儲(chǔ)在SD卡中的音樂文件讀取出來,再對(duì)讀取出來的音樂文件進(jìn)行解碼操作,最后通過對(duì)文件解碼得到的音頻信號(hào)輸出用來驅(qū)動(dòng)耳機(jī)從而實(shí)現(xiàn)播放音樂的功能。并且將音樂的名稱和實(shí)時(shí)的播放狀態(tài)在液晶顯示屏上顯示出來,實(shí)現(xiàn)實(shí)時(shí)的控制音樂的播放狀態(tài)以及上一曲下一曲?;旧蠈?shí)現(xiàn)了一個(gè)MP3播放器的功能。關(guān)鍵詞:音樂播放器STM32單片機(jī)TFTLCD觸摸屏第1章緒論1.1本課題的背景及意義在上個(gè)世紀(jì)人們獲取音樂的來源非常的簡單和單一,只能從光盤、收音機(jī)和電視里來獲取音樂。正因?yàn)橐魳返膩碓磫我?,也使得人們不能隨時(shí)隨地都可以聽到音樂。直到MP3的出現(xiàn)為廣大喜愛音樂的人帶來了無盡的方便甚至可以說是一種享受,人們?cè)谌魏螘r(shí)間任何地點(diǎn)都能聽見自己喜愛的音樂和歌曲。也正是因?yàn)槿绱薓P3可以說是非常經(jīng)典的嵌入式設(shè)備之一了,而在MP3最早出現(xiàn)的時(shí)候,它都是以閃存式存在于市場中。因而存儲(chǔ)空間就成了早期MP3的最大的弊端,存儲(chǔ)空間過于有限更是使得MP3不能擁有更多的功能,大大限制了MP3的用途。硬盤式MP3的橫空出世使MP3的發(fā)展更進(jìn)一步,更大的存儲(chǔ)空間以及更多的功能,必將受到消費(fèi)者的青睞。一個(gè)最普通的MP3大體上是由三個(gè)部分組成,第一部分也是最主要的部分就是一個(gè)處理器,其次是一個(gè)解碼器,第三部分就是一個(gè)存儲(chǔ)器。MP3有兩個(gè)問題一直以來都被人們非常的看重,不論是使用者還是生產(chǎn)商,那就是如何才能使MP3有更好的工作效率,還有就是怎樣能讓MP3擁有更好的音質(zhì)給用戶帶來更好的體驗(yàn)。自從MP3的出現(xiàn),人們傳統(tǒng)的獲取音樂的方式幾乎都得到了終結(jié),例如電視、光盤、和隨身聽以及收音機(jī)使用的人越來越少。MP3也成為了我們?nèi)粘3耸謾C(jī)以外被使用的最多的電子產(chǎn)品了。因此我抱著對(duì)此學(xué)習(xí)的態(tài)度,我將仔細(xì)認(rèn)真的完成此次播放器的設(shè)計(jì)。1.2研究現(xiàn)狀在二十一世紀(jì)這個(gè)互聯(lián)網(wǎng)廣泛普及的時(shí)代,MP3音樂作為一種占用空間較小和近乎完美的音質(zhì)已經(jīng)成為了電腦和互聯(lián)網(wǎng)上最主流的音樂格式了。如果說同一首音樂MP3格式要比普通的CD格式小了十幾倍但音效音質(zhì)上卻相差無幾。MP3全稱就是MpegLayer3,意思為用這個(gè)標(biāo)準(zhǔn)來對(duì)音樂文件進(jìn)行壓縮和編碼。自韓國世韓公司在1998年生產(chǎn)出了世界上第一部MP3隨身聽以來,MP3播放器被越來越多的人所喜愛。這要?dú)w功于它擁有著小巧的外形,便于攜帶,良好的音質(zhì)和擁有著更多的便捷功能等優(yōu)點(diǎn)。因此業(yè)界和大眾媒體也聚焦于此,使其成為了熱門話題。由于MP3將音樂文件徹底的脫離了光盤和磁帶的限制,也大大的提升了MP3自身的抗震性。在發(fā)覺了MP3廣闊的市場后各大公司企業(yè)也開始紛紛的設(shè)計(jì)和推出了自己品牌的MP3產(chǎn)品。就是在這樣的競爭下使的MP3的設(shè)計(jì)和生產(chǎn)變得越來越方便,性價(jià)比越來越高,功能也越來越強(qiáng)大,成本更是大大的降低,市場也變得越來越廣闊。第2章硬件設(shè)計(jì)2.1整體方案本設(shè)計(jì)主要器件如下:一個(gè)STM32微控制器、一個(gè)SD卡的讀取模塊、程序下載器、一塊TFT-LCD觸摸屏幕、VS1053模塊等組成。將要解決以下的這些問題:SD卡中的音樂文件將以怎樣的方式讀取出來,如何用FAT文件系統(tǒng)來對(duì)SD卡進(jìn)行操作,觸摸液晶屏的精準(zhǔn)控制以及MP3的界面等問題。系統(tǒng)的架構(gòu)如下圖2-1所示。本設(shè)計(jì)是將存儲(chǔ)在SD卡中的音樂文件通過FATFS文件系統(tǒng)讀取出來,再由STM32微控制器接收讀出的文件,由控制器的CPU芯片進(jìn)行軟件解碼,將已經(jīng)解碼的音頻文件傳送到VS1053模塊上再由模塊由耳機(jī)接口輸出音頻,這樣我們就能在耳機(jī)中聽見動(dòng)聽的音樂了。與此同時(shí)液晶顯示屏也將實(shí)時(shí)的顯示所播放的歌曲的狀態(tài)和名字,并可以通過點(diǎn)擊屏幕上相應(yīng)的按鈕來控制音樂的播放和暫停以及音量的調(diào)高調(diào)低。2.2系統(tǒng)架構(gòu)圖圖2-1系統(tǒng)架構(gòu)圖2.3硬件模塊2.3.1單片機(jī)1.單片機(jī)的選擇首先在設(shè)計(jì)的最開始來選擇要使用哪種單片機(jī)來作為本設(shè)計(jì)的控制器,經(jīng)過了一些研究后AT89351和STM32成為了候選的兩個(gè)單片機(jī)。接下來我們就對(duì)兩款單片機(jī)做一下簡單的對(duì)比。STM32就是指意法半導(dǎo)體公司推出的的32位微控制器,在現(xiàn)在的諸多32位控制器當(dāng)中來說使最閃耀的一顆新星。STM32系列的設(shè)計(jì)理念就是本著追求卓越的性能、低廉的成本和最少的功耗。截止到現(xiàn)在意法半導(dǎo)體公司已經(jīng)推出了4大系列的微型控制器,分別是基本型、增強(qiáng)型、USB基本型和互補(bǔ)型。STM32有著眾多的優(yōu)點(diǎn):超低的價(jià)錢,一個(gè)32位的單片機(jī)價(jià)格和8位單片機(jī)幾乎持平,這也是STM32最有優(yōu)勢的方面。外設(shè)的增多和集成度的進(jìn)一步提高,STM32上擁有著非常多的外設(shè)以及功能。超低的開發(fā)成本使得STM32只需要一個(gè)普通的串口就能下載代碼不需要再額外準(zhǔn)備一個(gè)高價(jià)格的仿真器。以及擁有著對(duì)功耗精準(zhǔn)的控制,從而降低了功耗。STM32控制器以最小的硬件變化滿足眾多的個(gè)性化需求。AT89S51是一款低功耗,高性能的單片機(jī),它自帶了一個(gè)可重復(fù)擦寫一千次的4KBytes閃存式只讀程序存儲(chǔ)器。在器件的選擇上,它采用了高密度,非易式性的存儲(chǔ)技術(shù)設(shè)計(jì)并制造。正是因?yàn)檫@樣的原因使得該單片機(jī)可以完美的執(zhí)行和兼容51單片機(jī)所有的指令,以及擁有著更好的引腳結(jié)構(gòu)。但該單片機(jī)的缺點(diǎn)也是致命的,運(yùn)行速度過太慢使得很多時(shí)候51單片機(jī)不足以支持更復(fù)雜的程序,并且51單片機(jī)的自我保護(hù)能里太差,很容易燒掉芯片。經(jīng)過了一系列對(duì)比和查閱資料我發(fā)現(xiàn),STM32在性能上完全的勝過了51單片機(jī),STM32不僅性能高,它的引腳也更多,存儲(chǔ)空間也更大,在處理一些大的數(shù)據(jù)時(shí)速度更加快而且更加高效。所以我最終選擇了STM32來作為此次設(shè)計(jì)的微控制器。STM32的原理圖如圖所示。圖2-2STM32原理圖2.芯片選取及意義單片機(jī)的市場規(guī)模用“巨無霸”來形容再也貼切不過了,據(jù)統(tǒng)計(jì)2010年就有20G片的出貨量。全球的器件生產(chǎn)商們無時(shí)無刻的都在展示著自己的稱心之作,而各個(gè)廠商提供的產(chǎn)品也是各有優(yōu)點(diǎn)。在單片機(jī)的業(yè)界就如同百家爭鳴一般。各個(gè)行業(yè)也對(duì)單片機(jī)的性能越來越“不知足”。隨著越來越多的要求和“挑剔的眼光”處理器必須在幾乎不增加主頻和能耗的基礎(chǔ)下去承擔(dān)更多的工作。而另一方面也要求,處理器與處理器必須擁有著更好的聯(lián)系,像是串口,無線數(shù)傳等如果處理器想要同時(shí)讓這么多的數(shù)據(jù)通道同時(shí)工作,就必須把外設(shè)增加的更多。軟件方面更是如此,程序的功能一直都在更新,需要的性能支持也是欲求不滿,而所有的這些“無理”的要求處理器都只能欣然接受。因此在一系列得研究與調(diào)查后最終選用了這款Cortex-M3芯片。CM3的特點(diǎn)包括:強(qiáng)勁的性能,超低的功耗,良好的實(shí)時(shí)性,低成本的解決方案,更便捷的使用。CM3不光繼承了它的前輩們的衣缽,經(jīng)過了翻天覆地的改革以后,讓處理器的性能也變得更為強(qiáng)勁,讓高復(fù)雜的度編程和調(diào)試事件也得到了簡化。除此之外,CM3還破天荒的加入了許多新穎的甚至可以說是驚艷的技術(shù)來適用于單片機(jī)應(yīng)用程序的要求。例如,為了“使命-關(guān)鍵”應(yīng)用服務(wù)的不可屏蔽中斷,擁有極高敏捷性和確定性的嵌套向量中斷系統(tǒng)。這些新奇的特性讓使用者們愛不釋手。3.模塊框圖圖2-3Cortex-M3模塊框圖2.3.2SD卡模塊1.SD卡選取及意義SD卡在我們的生活中已經(jīng)是非常普遍的存在,在大多數(shù)的電子設(shè)備上都能看見SD卡的影子,正是因?yàn)镾D卡擁有著便宜的價(jià)格、小巧的體積、快速的傳輸速度、可拆卸、內(nèi)存大這些特點(diǎn),所以本設(shè)計(jì)選擇MicroSD卡作為存儲(chǔ)裝置。目前STM32最高支持v2.0定義的SD卡。我們生活中大多數(shù)使用的SD卡采用的文件格式幾乎都是FAT32文件格式,與此同時(shí)我們要將文件格式為MP3的音頻文件復(fù)制到SD卡中的用MUSIC命名的文件夾下,再由STM32的SDIO接口對(duì)存儲(chǔ)卡進(jìn)行數(shù)據(jù)訪問。2.SD卡原理圖圖2-4SD卡接口電路2.3.3LCD顯示模塊在當(dāng)今的市場中近乎百分之九十的可觸摸的屏幕都采用的是TFTLCD液晶顯示屏來作為觸摸屏幕。TFTLCD觸摸屏可以說是目前市場中的佼佼者。由于TFTLCD屏幕擁有著非常出眾得色彩飽和度,更好的色彩對(duì)比度,即使在烈日炎炎下也屏幕上顯示的圖案也能被看的清清楚楚。所以本設(shè)計(jì)決定采用的一塊TFTLCD高性能的電容觸摸屏幕模塊,該屏幕的尺寸為3.5寸,同時(shí)擁有著2*17的排針可以直接使其和STM32單片機(jī)連接,電容屏幕同時(shí)還擁有著手感好,方便操作,透光性好的優(yōu)點(diǎn),這些優(yōu)點(diǎn)都為本設(shè)計(jì)提供了更好的基礎(chǔ)。2.3.4VS1053模塊VS1053模塊是一款音頻解碼模塊,該模塊擁有著超高的性能可以快速的解碼MP3/WMA等音頻文件。模塊的通信是由SPI接口和STM32進(jìn)行的,模塊可以通過杜邦線直接和3.3V的單片機(jī)連接,同時(shí)該模塊自身也擁有著穩(wěn)壓芯片,使用起來非常方便。VS1053B總共有著3組排針,都采用純銅鍍金排針,方便與外部設(shè)備的連接。P1排針接口為模塊提供通信與供電,P2排針是模塊的IIS輸出接口,P3接口不對(duì)外來接,當(dāng)用跳線帽將P3的1引腳和2引腳連接時(shí),我們就可以通過模塊上的麥克風(fēng)來實(shí)現(xiàn)錄音功能。下圖就是VS1053模塊和STM32的連接方式。圖2-5VS1053與STM32連接圖第3章軟件設(shè)計(jì)3.1FATFS文件系統(tǒng)由于在本設(shè)計(jì)中使用到了SD卡,因此我們就要對(duì)SD卡中的文件進(jìn)行文件管理,所以本設(shè)計(jì)應(yīng)用了FATFS文件系統(tǒng)。該文件系統(tǒng)是一款專門為嵌入式設(shè)備準(zhǔn)備的,它是完全與磁盤隔離開來的,同時(shí)它完全的遵循著ANSIC來編寫。正是因?yàn)檫@些原因使它完全的獨(dú)立且不用依賴任何的架構(gòu),可以被應(yīng)用到各種微控制器中,例如本設(shè)計(jì)所用的STM32。同時(shí)它的代碼非常的簡單占用的空間也非常的小,非常易于應(yīng)用。由于該系統(tǒng)強(qiáng)勁的性能和占用較小的資源被廣泛的應(yīng)用與市場中的電子產(chǎn)品中。3.2UCGUI圖形用戶界面UCGUI是一種圖形支持系統(tǒng),通常都被應(yīng)用在嵌入式設(shè)計(jì)中。UCGUI的主要目標(biāo)就是在擁有更好的性能同時(shí)所占用的資源更低。UCGUI也可以被所有的處理器使用,和FATFAS文件系統(tǒng)相同,它們都是完全由ANSIC來編寫的。因此本實(shí)驗(yàn)采用了UCGUI來作為圖形界面系統(tǒng)。3.3操作系統(tǒng)移植我們要設(shè)計(jì)一個(gè)MP3播放器,擁有一個(gè)系統(tǒng)是必不可少的,這不僅能使整個(gè)播放器更加整體化也使得MP3播放器更加人性化,使用者可以通過系統(tǒng)來對(duì)MP3播放器進(jìn)行設(shè)置。系統(tǒng)移植之前一定要確定是否滿足移植的條件,以下使移植OS-II操作系統(tǒng)必須滿足的條件:1.C語言編譯器可以產(chǎn)生可重載的代碼2.中斷的關(guān)閉和打開可以由C語言來控制3.處理器能產(chǎn)生定時(shí)中斷4.處理器可以容納一定數(shù)據(jù)的硬件堆棧5.處理器能夠?qū)?duì)照指針和其他CPU寄存器讀出和存到堆棧的指令在滿足了以上的條件時(shí)我們就可以開始操作系統(tǒng)的移植了,如圖3.1所示圖中的文件就是需要我們手動(dòng)移植的一些文件。其中有一些重要的文件需要我們了解該文件到底有什么作用。os_cpu.h文件里是對(duì)數(shù)據(jù)類型的定義,處理器的相關(guān)代碼和幾個(gè)函數(shù)的原型。os_cpu_c.c文件中定義了用戶的hook函數(shù)。os_cpu_a.asm文件中包含了移植需要用到的匯編代碼完成的函數(shù),主要就是應(yīng)用了任務(wù)切換函數(shù)。os_task.c文件中包含了任務(wù)管理代碼。os_sem.c中包含了各個(gè)同步量管理代碼。os_mem.c存放著內(nèi)存管理代碼。os_time.c是時(shí)間管理代碼,主要做各種延時(shí)。圖3-1操作系統(tǒng)移植文件在移植完相關(guān)的文件后,我們對(duì)移植過后的文件進(jìn)行相應(yīng)的修改后我們的操作系統(tǒng)基本上就可以使用了。3.4底層驅(qū)動(dòng)程序設(shè)計(jì)在移植完操作系統(tǒng)后,我們就要對(duì)我們所用到的各個(gè)模塊開始進(jìn)行驅(qū)動(dòng)和初始化設(shè)置了。3.4.1TFTLCD顯示驅(qū)動(dòng)程序設(shè)計(jì)本設(shè)計(jì)選用NT35510作為LCD屏幕的驅(qū)動(dòng),該驅(qū)動(dòng)包含了GRAM,不需要額外的驅(qū)動(dòng)器,并且在至零上,在指令上完全兼容了ILI9341,使用起來非常的便捷。模塊采用了16位的接口同外部連接,LCD在此連接下的驅(qū)動(dòng)需要用到如下信號(hào)線:CS:LCD片選信號(hào)WR:向LCD寫入數(shù)據(jù)RD:從LCD中讀取數(shù)據(jù)D[15:0]:16位雙向的數(shù)據(jù)線RST:復(fù)位LCDRS:命令標(biāo)志除了上面的六個(gè)信號(hào)外我們還需要著兩個(gè)信號(hào):RST和BL_CTR,RST的作用是實(shí)現(xiàn)液晶屏的復(fù)位操作,BL_CTR則是來控制LCD屏幕亮起來。一般的TFTLCD模塊使用的流程都可以簡單的用下圖表示圖3-2TFTLCD使用流程3.4.2VS1053驅(qū)動(dòng)程序設(shè)計(jì)VS1053模塊是通過SPI來接收輸入的音樂數(shù)據(jù)。VS1053的SPI發(fā)送的數(shù)據(jù)分為SDI和SCI兩種,SDI是被用來發(fā)送數(shù)據(jù)的,SCI用于發(fā)送命令。我們將音樂文件不斷的發(fā)送給VS1053模塊通過SPI口,它接收到以后就會(huì)自動(dòng)的幫我們完成解碼操作,然后將音樂從輸出,這時(shí)我們只需要接入耳機(jī)就可以聽到播放的音樂了。用VS1053MP3模塊播放音樂是非常簡單的,通常我們常用的MP3/WMA等格式的文件只需要以下三個(gè)步驟就可以實(shí)現(xiàn)音樂的播放了。第一步,對(duì)VS1053進(jìn)行復(fù)位操作,硬復(fù)位和軟復(fù)位構(gòu)成了復(fù)位操作,硬復(fù)位就是指要按下板子上的RET按鍵而軟復(fù)位指的是要設(shè)置MODE寄存器的SM_RESET為1,之所以執(zhí)行復(fù)位的操作是為了讓VS1053回到最開始的工作狀態(tài),同時(shí)準(zhǔn)備解碼下一首將要播放的歌曲。為了保證可以更好的播放音樂,我們應(yīng)該在每此切換歌曲的時(shí)候在歌曲播放之前都進(jìn)行一次復(fù)位操作。第二步,在復(fù)位之后要做的就是配置相關(guān)的寄存器了。下面就倆介紹幾個(gè)主要需要配置的寄存器,第一個(gè)是MODE寄存器也就是我們經(jīng)常提到的模式寄存器,VS1053的模式就是由該寄存器所控制的,可以說是最為重要的寄存器之一。下一步是CLOCK寄存器(時(shí)鐘寄存器)的配置,時(shí)鐘的頻率、倍頻等相關(guān)的信息的設(shè)置都時(shí)由時(shí)鐘寄存器來完成的。時(shí)鐘寄存器配置好后我們要進(jìn)行低音調(diào)(BASS)寄存器的配置,音調(diào)寄存以毫無疑問就是來控制音調(diào)的,它可以用于設(shè)置VS1053的高低音效。最后一個(gè)需要配置的寄存器是音量(VOL)寄存器,VOL寄存器的作用也是非常重要的,它能夠調(diào)節(jié)輸出音量的大小,同時(shí)也可以控制是由左聲道輸出還是有聲道輸出以及左右兩個(gè)聲道輸出的音量。第三步也是最后一步,就是發(fā)送音頻文件了。當(dāng)經(jīng)過以上兩步的配置,我們剩下要做的事,就是要將音樂文件發(fā)送到VS1053中了,我們發(fā)送時(shí)的要求非常簡單,只要是VS1053可以支持的文件格式就沒有問題了,當(dāng)接收到文件以后VS1053會(huì)自動(dòng)執(zhí)行解碼操作,然后將音樂播放出來。當(dāng)這一步完成后我們就可以在耳機(jī)中聽見我們想要聽的音樂了。3.4.3SD卡的驅(qū)動(dòng)SD卡在上電以后,一直處于低電平狀態(tài),主機(jī)通過發(fā)送CDM0來執(zhí)行復(fù)位SD卡的操作,然后判斷當(dāng)前的電壓是否在可以支持SD卡工作的電壓范圍之內(nèi)。但如果是MMC卡,則不能識(shí)別出操作指令,因此可以通過這個(gè)命令來判斷,插入的卡的類型。得到正確的指令后,CID寄存器開始為接收主機(jī)的命令做好準(zhǔn)備,當(dāng)接收到CMD10時(shí)CID寄存器開始進(jìn)入工作狀態(tài)。然后CMD9被主機(jī)發(fā)送出來,目的是用來讀取SD卡的CSD寄存器。經(jīng)過以上的步驟主機(jī)可知道SD卡的存儲(chǔ)容量,支持的命令等一系列的重要參數(shù)。此時(shí)我們的SD卡已經(jīng)進(jìn)入了工作狀態(tài)了,主機(jī)就可以發(fā)送命令來對(duì)卡進(jìn)行讀寫操作和其他的控制了。CMD17時(shí)用來控制SD卡讀取消息的命令,當(dāng)卡接收到命令后就會(huì)檢測是否接收到了R1的響應(yīng),如果收到了響應(yīng),就開始接收起始的令牌數(shù)據(jù)(0xFE),當(dāng)收到了OxFE之后我們的SD卡就可以接收數(shù)據(jù)了。SD卡寫入數(shù)據(jù)由CMD24完成,具體步驟如下。發(fā)送CMD24,接收卡是否檢測到R1,R1如果被檢測到,則卡開始響應(yīng)。在響應(yīng)后開始發(fā)送寫入數(shù)據(jù)的令牌(0xFE),數(shù)據(jù)發(fā)送完成后再次發(fā)送偽crc兩個(gè)字節(jié),并且在最后一個(gè)8clk字母之后禁用。系統(tǒng)調(diào)試與分析4.1硬件調(diào)試在硬件調(diào)試的過程中遇到了以下幾個(gè)問題:1.在實(shí)現(xiàn)的過程中發(fā)現(xiàn)TFT屏幕總是出現(xiàn)閃屏的問題,經(jīng)檢查發(fā)現(xiàn)TFT屏幕與STM32之間的接觸不良總是產(chǎn)生虛接現(xiàn)象。拆下TFT屏幕檢查其引腳發(fā)現(xiàn)有松動(dòng),重新焊接好引腳后閃屏問題被解決。2.VS1053在播放音樂時(shí)經(jīng)常忽快忽慢不能使音樂正常的播放。經(jīng)檢查發(fā)現(xiàn)問題所在是由于芯片時(shí)鐘的不穩(wěn)定造成的現(xiàn)象。通過減少了晶振兩端的阻抗解決了此問題,使VS1053可以正常工作。4.2軟件調(diào)試在軟件調(diào)試時(shí),我采用的時(shí)分步循序漸進(jìn)的方法進(jìn)行測試。首先要完成對(duì)TFT顯示、串口、IIC、RTC時(shí)鐘等驅(qū)動(dòng)程序的調(diào)試,確保驅(qū)動(dòng)程序無誤并可以使用,然后開始調(diào)試文件系統(tǒng)的讀取和寫入、VS1053的讀取和寫入,最后根據(jù)系統(tǒng)所需來移植其他功能。本系統(tǒng)中用到了多個(gè)中斷,所以在設(shè)計(jì)的過程中我也遇到了中斷嵌套無法退出的問題,因此需要我們?cè)O(shè)定中斷的優(yōu)先級(jí)。在調(diào)試MP3播放功能時(shí),當(dāng)進(jìn)入到界面后發(fā)現(xiàn)并沒有歌曲播放,經(jīng)過仔細(xì)的檢查發(fā)現(xiàn),在SD卡中的文件夾名稱與程序中所設(shè)定的名稱不符,將其修改成MUSIC后就可以完美的運(yùn)行MP3播放器了。經(jīng)過一段時(shí)間的努力以后后,基本實(shí)現(xiàn)了本設(shè)計(jì)的主要功能。4.3功能模塊的介紹在完成了上述的驅(qū)動(dòng)以后,本設(shè)計(jì)的主要功能驅(qū)動(dòng)就已經(jīng)完成,下面我們開始對(duì)各個(gè)功能做一下介紹。對(duì)于一個(gè)多功能的MP3音樂播放器來說擁有一個(gè)簡潔方便的主界面時(shí)非常必要的,一個(gè)好的初始界面可以給用戶一個(gè)良好的體驗(yàn)從而讓用戶更加支持和喜愛產(chǎn)品,因此我們?cè)诔绦虻淖畛跻O(shè)計(jì)一個(gè)初始界面。在這個(gè)界面內(nèi)我們共設(shè)置了16個(gè)圖標(biāo)。每一個(gè)圖標(biāo)都被設(shè)計(jì)成時(shí)一個(gè)點(diǎn)擊事件當(dāng)我們點(diǎn)擊相應(yīng)的圖標(biāo)時(shí)就觸發(fā)相應(yīng)的事件。這些點(diǎn)擊事件分別是:電子書、相冊(cè)、USB連接、應(yīng)用中心、時(shí)鐘、系統(tǒng)設(shè)置、面板、無線傳輸和記事本等功能。下面我們就詳細(xì)的重點(diǎn)介紹以下幾個(gè)功能是如何實(shí)現(xiàn)的。圖4-1主界面圖4.3.1電子書功能電子書功能的實(shí)現(xiàn)離不開文件管理系統(tǒng),同時(shí)也需要中文字庫的支持,點(diǎn)擊電子書的圖標(biāo)后我們進(jìn)入到一個(gè)選擇界面,在這個(gè)界面里我們可以選擇SD卡或單片機(jī)自帶的內(nèi)存中打開電子書。所謂的電子書其實(shí)就是一個(gè)txt的文件,因?yàn)樵O(shè)計(jì)中已經(jīng)應(yīng)用了FATFS文件管理系統(tǒng),所以對(duì)于讀取txt等格式的文件來說時(shí)非常輕松的。在打開的電子書中我們可以通過在屏幕上拖動(dòng)手指來控制書的上翻下翻。圖4-2電子書4.3.2相冊(cè)功能該功能的操作基本與電子書共能相同,通過觸摸屏選擇要打開圖片的位置,點(diǎn)擊圖片后,圖片將進(jìn)行全屏播放,如果查看的時(shí)同一文件夾下的圖片,在全屏模式下可通過點(diǎn)擊屏幕進(jìn)行查看下一張的操作。該功能不光能查看靜態(tài)的圖片,也可以查看動(dòng)態(tài)的圖片。圖4-3相冊(cè)功能4.3.3時(shí)鐘與鬧鐘功能點(diǎn)擊時(shí)鐘圖標(biāo)進(jìn)入時(shí)鐘,在剛進(jìn)入界面的時(shí)候會(huì)提示是否檢測到了DS18B20溫度傳感器,如果檢測到就可以通過溫度傳感器來進(jìn)行實(shí)時(shí)的溫度測試,如果沒有就將啟動(dòng)內(nèi)部的溫度傳感器。鬧鐘功能基本與手機(jī)上的類似,可以設(shè)置日期及時(shí)間,同時(shí)也可以通過設(shè)置來讓哪個(gè)燈作為提示燈。當(dāng)?shù)竭_(dá)時(shí)間后在主界面的時(shí)鐘圖標(biāo)上會(huì)顯示你所設(shè)定的鬧鐘時(shí)間,這樣即使退出了時(shí)鐘也可以收到提示。圖4-4時(shí)鐘功能4.3.4MP3功能該功能時(shí)本設(shè)計(jì)的初衷,也是該設(shè)計(jì)的重點(diǎn)。點(diǎn)擊播放器就進(jìn)入了MP3界面,在該界面中會(huì)實(shí)時(shí)的顯示歌曲的名稱,以及播放的狀態(tài),同時(shí)也會(huì)顯示曲目的數(shù)量。用戶可以通過屏幕上的提示信息,來用觸摸屏控制播放的狀態(tài)以及上下曲目的切換還有音量的大小。圖4-5MP3功能4.3.5畫板功能畫板的功能時(shí)基于LCD觸摸屏的畫點(diǎn)以及畫線操作完成的。當(dāng)點(diǎn)擊了畫板圖標(biāo)的時(shí),會(huì)提示新建畫板或是打開畫板,如果選擇打開畫板,就會(huì)進(jìn)入到目錄的選擇,讓用戶選擇從哪里打開畫板。新建畫板的話,進(jìn)入后,會(huì)提示選擇畫筆的顏色,選擇好顏色后就可以在白色的畫板上進(jìn)行操作了。當(dāng)我們退出時(shí),會(huì)提示是否保存,同時(shí)可選擇保存的位置。圖4-6畫板功能4.3.6設(shè)置功能在設(shè)置功能中,我們可以設(shè)置系統(tǒng)的時(shí)間及日期,也可以切換系統(tǒng)的語言,查看系統(tǒng)的信息及狀態(tài),同時(shí)也可以對(duì)屏幕進(jìn)行校準(zhǔn),還可以設(shè)置圖片播放的模式??偨Y(jié)經(jīng)過長時(shí)間的學(xué)習(xí)和努力,和在老師的指導(dǎo)下,最后終于完成了該MP3播放器的設(shè)計(jì)和實(shí)現(xiàn)。在本系統(tǒng)的提出和設(shè)計(jì)中讓我學(xué)習(xí)到了更多的知識(shí),了解到了更多,例如FATFS文件系統(tǒng)是什么,SD卡如何操作,UCGUI、FATFS該如何使用,以及MP3格式和原理還有就是如何解碼等知識(shí)。也明白了一個(gè)重要的道理:不論多么復(fù)雜的事物都是由最簡單最單一的東西去構(gòu)成的,像這些最簡單的往往也需要我們?nèi)フJ(rèn)真學(xué)習(xí),只有更加的了解底層把底層的東西學(xué)透學(xué)懂,才能有更深刻的理解才能更好的去運(yùn)用。所以只有牢牢地掌握了基礎(chǔ)才能更好的向上發(fā)展。參考文獻(xiàn)[1]孫活.基于STM32單片機(jī)的多功能MP3播放器設(shè)計(jì)及實(shí)現(xiàn)[J].電視技術(shù),2019(4).[2]周雙飛,黃海波,簡煒,等.基于STM32的MP3播放器設(shè)計(jì)與實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù),2016,12(1):260-262.[3]郭慧,紀(jì)松波.基于μC/OSⅢ系統(tǒng)的人機(jī)交互界面的設(shè)計(jì)[J].電子設(shè)計(jì)工程,2019(11).[4]李偉,張真,范文豪.基于STM32微控制器的mp3播放器設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2015,04:118-124.[5]吳思中.基于STM32的MP3播放器設(shè)計(jì)[J].信息技術(shù),2014(9):173-174.[6]李世奇,董浩斌,李榮生.基于FatFs文件系統(tǒng)的SD卡存儲(chǔ)器設(shè)計(jì)[J].測控技術(shù),2011,12:79-81.[7]苑家瑋,朱海霞.基于UCOSII操作系統(tǒng)的解碼功放耳放一體化研究[J].江蘇科技信息,2017(19):26-27.[8]孫書鷹,陳志佳,寇超.新一代嵌入式微處理器STM32F103開發(fā)與應(yīng)用[J].微計(jì)算機(jī)應(yīng)用,2010,12:59-63.[9]繆賢浩.基于wifi的mp3音樂播放系統(tǒng)設(shè)計(jì)[J].山東工業(yè)技術(shù),2016(4):197-197.[10]Anonymous.DevelopmentenvironmentforSTM32ARM-basedMCU[J]. ElectronicsWeekly,2009,2411:.[11]李偉,張真,范文豪,等.基于STM32微控制器的MP3播放器設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2015(4):118-120.附錄主任務(wù)voidmain_task(void*pdata){ u8selx; u16tcnt=0; spb_init(); //初始化SPB界面 spb_load_mui(); //加載SPB主界面 slcd_frame_show(0); //顯示界面 while(1) { selx=spb_move_chk(); system_task_return=0;//清退出標(biāo)志 switch(selx)//發(fā)生了雙擊事件 { case0:ebook_play();break; //電子圖書 case1:picviewer_play();break; //數(shù)碼相框 case2:audio_play();break; //音樂播放 case3:tomcat_play();break; case4:calendar_play();break; //時(shí)鐘 case5:sysset_play();break; //系統(tǒng)設(shè)置 case6:nes_play();break; case7:notepad_play();break; //記事本 case8:exe_play();break; //運(yùn)行器 case9:paint_play();break; //手寫畫筆 case10:camera_play();break; //攝像頭 case11:recorder_play();break; //錄音機(jī) case12:usb_play();break; //USB連接 case13:net_play();break; case14:wireless_play();break; case15:calc_play();break; //計(jì)算器 case16:phone_play();break; case17:app_play();break; //APP case18:sms_play();break; } if(selx!=0XFF)spb_load_mui();//顯示主界面 if(spbdev.spbheight==0&&spbdev.spbwidth==0)spb_load_mui();//需要重新加載 delay_ms(1000/OS_TICKS_PER_SEC);//延時(shí)一個(gè)時(shí)鐘節(jié)拍 tcnt++; if(tcnt==500) //500個(gè)節(jié)拍為1秒鐘 { tcnt=0; spb_stabar_msg_show(0);//更新狀態(tài)欄信息 } }}VS1053驅(qū)動(dòng)//VS1053默認(rèn)設(shè)置參數(shù)_VS1053_objvsset={ 220, //音量:220 6, //低音上線60Hz 15, //低音提升15dB 10, //高音下限10Khz 15, //高音提升10.5dB 0, //空間效果 1, //板載喇叭默認(rèn)打開.};//////////////////////////////////////////////////////////////////////////////////移植時(shí)候的接口//data:要寫入的數(shù)據(jù)//返回值:讀到的數(shù)據(jù)u8VS_SPI_ReadWriteByte(u8data){ returnSPI1_ReadWriteByte(data); }vu8nes_spped_para=0; //NES游戲進(jìn)行時(shí),將會(huì)對(duì)此值設(shè)置,默認(rèn)為0.//SD卡初始化的時(shí)候,需要低速voidVS_SPI_SpeedLow(void){ SPI1_SetSpeed(SPI_BaudRatePrescaler_32+(nes_spped_para<<3)); //設(shè)置到低速模式}//SD卡正常工作的時(shí)候,可以高速了voidVS_SPI_SpeedHigh(void){ SPI1_SetSpeed(SPI_BaudRatePrescaler_8+(nes_spped_para<<3)); //設(shè)置到高速模式 }//初始化VS1053的IO口 voidVS_Init(void){ GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF,ENABLE); //使能PC,PE,PF端口時(shí)鐘 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13; //PC13 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //輸入 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOC,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6; //PE6 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽輸出 GPIO_Init(GPIOE,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;//PF6,PF7 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽輸出 GPIO_Init(GPIOF,&GPIO_InitStructure); SPI1_Init(); } //VS1053數(shù)據(jù)保存在:SYSTEM_PARA_SAVE_BASE+sizeof(_system_setings)之后//讀取VS1053數(shù)據(jù)//VS1053dev:vs1053數(shù)據(jù)voidVS1053_read_para(_VS1053_obj*VS1053dev){ AT24CXX_Read(SYSTEM_PARA_SAVE_BASE+sizeof(_system_setings),(u8*)VS1053dev,sizeof(_VS1053_obj));}//寫入VS1053數(shù)據(jù)//VS1053dev:vs1053數(shù)據(jù)voidVS1053_save_para(_VS1053_obj*VS1053dev){ OS_CPU_SRcpu_sr=0; OS_ENTER_CRITICAL(); //進(jìn)入臨界區(qū)(無法被中斷打斷) AT24CXX_Write(SYSTEM_PARA_SAVE_BASE+sizeof(_system_setings),(u8*)VS1053dev,sizeof(_VS1053_obj)); OS_EXIT_CRITICAL(); //退出臨界區(qū)(可以被中斷打斷)}//////////////////////////////////////////////////////////////////////////////// //軟復(fù)位VS1053voidVS_Soft_Reset(void){ u8retry=0; while(VS_DQ==0); //等待軟件復(fù)位結(jié)束 VS_SPI_ReadWriteByte(0Xff); //啟動(dòng)傳輸 retry=0; while(VS_RD_Reg(SPI_MODE)!=0x0800) //軟件復(fù)位,新模式 { VS_WR_Cmd(SPI_MODE,0x0804); //軟件復(fù)位,新模式 delay_ms(2);//等待至少1.35ms if(retry++>100)break; } while(VS_DQ==0);//等待軟件復(fù)位結(jié)束 retry=0; while(VS_RD_Reg(SPI_CLOCKF)!=0X9800)//設(shè)置VS1053的時(shí)鐘,3倍頻,1.5xADD { VS_WR_Cmd(SPI_CLOCKF,0X9800); //設(shè)置VS1053的時(shí)鐘,3倍頻,1.5xADD if(retry++>100)break; } delay_ms(20);}//硬復(fù)位MP3//返回1:復(fù)位失敗;0:復(fù)位成功 u8VS_HD_Reset(void){ u8retry=0; VS_RST=0; delay_ms(20); VS_XDCS=1;//取消數(shù)據(jù)傳輸 VS_XCS=1;//取消數(shù)據(jù)傳輸 VS_RST=1; while(VS_DQ==0&&retry<200)//等待DREQ為高 { retry++; delay_us(50); }; delay_ms(20); if(retry>=200)return1; elsereturn0; }//正弦測試voidVS_Sine_Test(void){ VS_HD_Reset(); VS_WR_Cmd(0x0b,0X2020); //設(shè)置音量 VS_WR_Cmd(SPI_MODE,0x0820);//進(jìn)入VS1053的測試模式 while(VS_DQ==0);//等待DREQ為高 //printf("modesin:%x\n",VS_RD_Reg(SPI_MODE)); //向VS1053發(fā)送正弦測試命令:0x530xef0x6en0x000x000x000x00 //其中n=0x24,設(shè)定VS1053所產(chǎn)生的正弦波的頻率值,具體計(jì)算方法見VS1053的datasheet VS_SPI_SpeedLow();//低速 VS_XDCS=0;//選中數(shù)據(jù)傳輸 VS_SPI_ReadWriteByte(0x53); VS_SPI_ReadWriteByte(0xef); VS_SPI_ReadWriteByte(0x6e); VS_SPI_ReadWriteByte(0x24); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); delay_ms(100); VS_XDCS=1;//退出正弦測試VS_XDCS=0;//選中數(shù)據(jù)傳輸 VS_SPI_ReadWriteByte(0x45); VS_SPI_ReadWriteByte(0x78); VS_SPI_ReadWriteByte(0x69); VS_SPI_ReadWriteByte(0x74); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); delay_ms(100); VS_XDCS=1; //再次進(jìn)入正弦測試并設(shè)置n值為0x44,即將正弦波的頻率設(shè)置為另外的值VS_XDCS=0;//選中數(shù)據(jù)傳輸 VS_SPI_ReadWriteByte(0x53); VS_SPI_ReadWriteByte(0xef); VS_SPI_ReadWriteByte(0x6e); VS_SPI_ReadWriteByte(0x44); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); delay_ms(100); VS_XDCS=1;//退出正弦測試VS_XDCS=0;//選中數(shù)據(jù)傳輸 VS_SPI_ReadWriteByte(0x45); VS_SPI_ReadWriteByte(0x78); VS_SPI_ReadWriteByte(0x69); VS_SPI_ReadWriteByte(0x74); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); delay_ms(100); VS_XDCS=1; } //ram測試//返回值:RAM測試結(jié)果//VS1003如果得到的值為0x807F,則表明完好;VS1053為0X83FF. u16VS_Ram_Test(void){ VS_HD_Reset(); VS_WR_Cmd(SPI_MODE,0x0820);//進(jìn)入VS1053的測試模式 while(VS_DQ==0);//等待DREQ為高 VS_SPI_SpeedLow();//低速 VS_XDCS=0; //xDCS=1,選擇VS1053的數(shù)據(jù)接口 VS_SPI_ReadWriteByte(0x4d); VS_SPI_ReadWriteByte(0xea); VS_SPI_ReadWriteByte(0x6d); VS_SPI_ReadWriteByte(0x54); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); delay_ms(150); VS_XDCS=1; returnVS_RD_Reg(SPI_HDAT0);//VS1003如果得到的值為0x807F,則表明完好;VS1053為0X83FF.;} //向VS1053寫命令//address:命令地址//data:命令數(shù)據(jù)voidVS_WR_Cmd(u8address,u16data){ while(VS_DQ==0);//等待空閑 VS_SPI_SpeedLow();//低速 VS_XDCS=1; VS_XCS=0; VS_SPI_ReadWriteByte(VS_WRITE_COMMAND);//發(fā)送VS1053的寫命令 VS_SPI_ReadWriteByte(address); //地址 VS_SPI_ReadWriteByte(data>>8); //發(fā)送高八位 VS_SPI_ReadWriteByte(data); //第八位 VS_XCS=1; VS_SPI_SpeedHigh(); //高速 }//向VS1053寫數(shù)據(jù)//data:要寫入的數(shù)據(jù)voidVS_WR_Data(u8data){ VS_SPI_SpeedHigh();//高速,對(duì)VS1003B,最大值不能超過36.864/4Mhz,這里設(shè)置為9M VS_XDCS=0; VS_SPI_ReadWriteByte(data); VS_XDCS=1;}//讀VS1053的寄存器//address:寄存器地址//返回值:讀到的值//注意不要用倍速讀取,會(huì)出錯(cuò)u16VS_RD_Reg(u8address){ u16temp=0; while(VS_DQ==0);//非等待空閑狀態(tài) VS_SPI_SpeedLow();//低速 VS_XDCS=1; VS_XCS=0; VS_SPI_ReadWriteByte(VS_READ_COMMAND);//發(fā)送VS1053的讀命令 VS_SPI_ReadWriteByte(address); //地址 temp=VS_SPI_ReadWriteByte(0xff); //讀取高字節(jié) temp=temp<<8; temp+=VS_SPI_ReadWriteByte(0xff); //讀取低字節(jié) VS_XCS=1; VS_SPI_SpeedHigh();//高速 returntemp;}//讀取VS1053的RAM//addr:RAM地址//返回值:讀到的值u16VS_WRAM_Read(u16addr){ u16res; VS_WR_Cmd(SPI_WRAMADDR,addr); res=VS_RD_Reg(SPI_WRAM); returnres;}//寫VS1053的RAM//addr:RAM地址//val:要寫入的值voidVS_WRAM_Write(u16addr,u16val){ VS_WR_Cmd(SPI_WRAMADDR,addr); //寫RAM地址 while(VS_DQ==0); //等待空閑 VS_WR_Cmd(SPI_WRAM,val); //寫RAM值}//設(shè)置播放速度(僅VS1053有效)//t:0,1,正常速度;2,2倍速度;3,3倍速度;4,4倍速;以此類推voidVS_Set_Speed(u8t){ VS_WRAM_Write(0X1E04,t); //寫入播放速度}//FORWAVHEAD0:0X7761HEAD1:0X7665//FORMIDIHEAD0:otherinfoHEAD1:0X4D54//FORWMAHEAD0:dataspeedHEAD1:0X574D//FORMP3HEAD0:dataspeedHEAD1:ID//比特率預(yù)定值,階層IIIconstu16bitrate[2][16]={{0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,0},{0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,0}};//返回Kbps的大小//返回值:得到的碼率u16VS_Get_HeadInfo(void){ unsignedintHEAD0; unsignedintHEAD1; HEAD0=VS_RD_Reg(SPI_HDAT0);HEAD1=VS_RD_Reg(SPI_HDAT1); switch(HEAD1){case0x7665://WAV格式case0X4D54://MIDI格式 case0X4154://AAC_ADTS case0X4144://AAC_ADIF case0X4D34://AAC_MP4/M4A case0X4F67://OGGcase0X574D://WMA格式 case0X664C://FLAC格式{ ////printf("HEAD0:%d\n",HEAD0);HEAD1=HEAD0*2/25;//相當(dāng)于*8/100if((HEAD1%10)>5)returnHEAD1/10+1;//對(duì)小數(shù)點(diǎn)第一位四舍五入elsereturnHEAD1/10;}default://MP3格式,僅做了階層III的表{HEAD1>>=3;HEAD1=HEAD1&0x03;if(HEAD1==3)HEAD1=1;elseHEAD1=0;returnbitrate[HEAD1][HEAD0>>12];}}}//得到平均字節(jié)數(shù)//返回值:平均字節(jié)數(shù)速度u32VS_Get_ByteRate(void){ returnVS_WRAM_Read(0X1E05);//平均位速}//得到需要填充的數(shù)字//返回值:需要填充的數(shù)字u16VS_Get_EndFillByte(void){ returnVS_WRAM_Read(0X1E06);//填充字節(jié)}//發(fā)送一次音頻數(shù)據(jù)//固定為32字節(jié)//返回值:0,發(fā)送成功// 1,VS1053不缺數(shù)據(jù),本次數(shù)據(jù)未成功發(fā)送u8VS_Send_MusicData(u8*buf){ u8n; if(VS_DQ!=0)//送數(shù)據(jù)給VS1053 { VS_XDCS=0;for(n=0;n<32;n++) { VS_SPI_ReadWriteByte(buf[n]); } VS_XDCS=1; }elsereturn1; return0;//成功發(fā)送了}//切歌//通過此函數(shù)切歌,不會(huì)出現(xiàn)切換“噪聲” voidVS_Restart_Play(void){ u16temp; u16i; u8n; u8vsbuf[32]; for(n=0;n<32;n++)vsbuf[n]=0;//清零 temp=VS_RD_Reg(SPI_MODE); //讀取SPI_MODE的內(nèi)容 temp|=1<<3; //設(shè)置SM_CANCEL位 temp|=1<<2; //設(shè)置SM_LAYER12位,允許播放MP1,MP2 VS_WR_Cmd(SPI_MODE,temp); //設(shè)置取消當(dāng)前解碼指令 for(i=0;i<2048;) //發(fā)送2048個(gè)0,期間讀取SM_CANCEL位.如果為0,則表示已經(jīng)取消了當(dāng)前解碼 { if(VS_Send_MusicData(vsbuf)==0)//每發(fā)送32個(gè)字節(jié)后檢測一次 { i+=32; //發(fā)送了32個(gè)字節(jié) temp=VS_RD_Reg(SPI_MODE); //讀取SPI_MODE的內(nèi)容 if((temp&(1<<3))==0)break; //成功取消了 } } if(i<2048)//SM_CANCEL正常 { temp=VS_Get_EndFillByte()&0xff;//讀取填充字節(jié) for(n=0;n<32;n++)vsbuf[n]=temp;//填充字節(jié)放入數(shù)組 for(i=0;i<2052;) { if(VS_Send_MusicData(vsbuf)==0)i+=32;//填充 } }elseVS_Soft_Reset(); //SM_CANCEL不成功,壞情況,需要軟復(fù)位 temp=VS_RD_Reg(SPI_HDAT0);temp+=VS_RD_Reg(SPI_HDAT1); if(temp) //軟復(fù)位,還是沒有成功取消,放殺手锏,硬復(fù)位 { VS_HD_Reset(); //硬復(fù)位 VS_Soft_Reset(); //軟復(fù)位 }}//重設(shè)解碼
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年中級(jí)會(huì)計(jì)職稱考試中級(jí)會(huì)計(jì)實(shí)務(wù)試題及答案解析
- 腦血管疾病患者的法律與倫理問題
- 衣物消殺技術(shù)培訓(xùn)課件
- 腮腺混合瘤患者的靜脈輸液護(hù)理
- 胸痹的常見誤區(qū)
- 微生物與感染病學(xué):陰道炎課件
- 組織胚胎學(xué)基礎(chǔ):消化管管壁分層課件
- 藥理學(xué)入門:H2 受體阻斷抑酸藥課件
- 公司預(yù)防教育培訓(xùn)制度
- 公司會(huì)計(jì)核算制度
- 妊娠合并膽汁淤積綜合征
- 河南省安陽市滑縣2024-2025學(xué)年高二數(shù)學(xué)上學(xué)期期末考試試題文
- 新疆維吾爾自治區(qū)普通高校學(xué)生轉(zhuǎn)學(xué)申請(qǐng)(備案)表
- 內(nèi)鏡中心年終總結(jié)
- 客房服務(wù)員:高級(jí)客房服務(wù)員考試資料
- 園林苗木容器育苗技術(shù)
- GB/T 6974.5-2023起重機(jī)術(shù)語第5部分:橋式和門式起重機(jī)
- 陜西省2023-2024學(xué)年高一上學(xué)期新高考解讀及選科簡單指導(dǎo)(家長版)課件
- 兒科學(xué)熱性驚厥課件
- 《高職應(yīng)用數(shù)學(xué)》(教案)
- 漢堡規(guī)則中英文
評(píng)論
0/150
提交評(píng)論