杜建銘,師文慶
(廣東海洋大學(xué)電子與信息工程學(xué)院,廣東湛江 524088)
1986年,卡爾因茨·布蘭登堡提出:通過(guò)編碼重組技術(shù)大幅度壓縮音頻文件,在播放時(shí)使用專門(mén)的解碼技術(shù)進(jìn)行還原,以此達(dá)到減小音樂(lè)文件大小的同時(shí)保持音質(zhì)的目的。自此之后,播放器不斷地改進(jìn)、完善。1990年,布蘭登堡得到一家音頻研究機(jī)構(gòu)的幫助,為他提供了一個(gè)研究小組。在同年,布蘭登堡在實(shí)際的測(cè)試中把CD音質(zhì)的音樂(lè)文件壓縮到原來(lái)的1∕12,并且順利地解碼播放,MP3技術(shù)就是由此而來(lái)。
MP3音樂(lè)播放器雖然已經(jīng)誕生30多年,但仍然能在消費(fèi)類電子產(chǎn)品有一席之位,原因在于其設(shè)計(jì)理念一直在變化,從而能夠持續(xù)地?zé)òl(fā)生機(jī)與活力。目前國(guó)內(nèi)市場(chǎng)上的MP3播放器,能夠播放若干種格式的音樂(lè);所有的信息都直觀地顯示在一塊鏡面顯示屏上,靈敏觸摸屏取代了按鍵控制,大大簡(jiǎn)便了用戶的操作;不僅如此,由于消費(fèi)者愛(ài)好需要也十分廣泛,廠家往往費(fèi)盡心思地為產(chǎn)品添加更多實(shí)用功能來(lái)增加產(chǎn)品的賣點(diǎn),例如計(jì)步、藍(lán)牙、收音機(jī)、電子書(shū)等功能。由此可見(jiàn),設(shè)計(jì)一款觸屏交互,且多功能的MP3音樂(lè)播放器不僅有實(shí)際的應(yīng)用價(jià)值,并且是非常符合市場(chǎng)要求的。
基于以上描述,本設(shè)計(jì)選用STM32F103ZET6微處理器作為主控[1-2],音樂(lè)解碼部分使用VS1053B,提供的硬件解碼功能,LCD顯示與電阻觸屏作為本設(shè)計(jì)的主要交互方式,要實(shí)現(xiàn)的主要功能有歌曲的切換、暫停∕播放、音量條的顯示及控制、播放進(jìn)度的顯示及控制,在此基礎(chǔ)上添加多種實(shí)用功能,設(shè)計(jì)一款多功能MP3播放器,讓用戶在享受音樂(lè)之余還能體驗(yàn)額外功能帶來(lái)的便利性。
一般的音樂(lè)文件通常是經(jīng)過(guò)編碼壓縮的,所以播放的時(shí)候需進(jìn)行解碼才能輸出動(dòng)聽(tīng)的音樂(lè)。常規(guī)的解碼方式有軟解碼和硬解碼。
(1)軟解碼
軟解碼就是把一套解碼算法交給CPU去運(yùn)算從而得到音頻數(shù)據(jù),對(duì)CPU的運(yùn)算速度有較高的要求[3]。
(2)硬解碼
硬解碼這種方式將解碼工作交給專門(mén)的解碼芯片,目前市面上的MP3播放器采用的大多數(shù)是硬解碼[4]。
在本設(shè)計(jì)中選擇了硬解碼,STM32僅需完成文件讀寫(xiě)并分批量地輸送數(shù)據(jù)到解碼芯片上,運(yùn)算量較小,不需移植第三方庫(kù)。
系統(tǒng)由電阻觸摸屏、音頻解碼模塊、溫度傳感器、藍(lán)牙模塊、外部Flash存儲(chǔ)芯片、SD卡等模塊組成。利用溫度傳感器進(jìn)行環(huán)境溫度的檢測(cè);外部Flash存儲(chǔ)芯片用于保存字庫(kù)信息;藍(lán)牙模塊可供手機(jī)連接,通過(guò)手機(jī)藍(lán)牙發(fā)送指令來(lái)實(shí)現(xiàn)遠(yuǎn)程控制MP3播放器。系統(tǒng)硬件結(jié)構(gòu)框如圖1所示。
圖1 系統(tǒng)總體框圖
STM32F103ZET6工作頻率為72 MHz,是基于意法半導(dǎo)體公司專為低成本、低功耗的嵌入式應(yīng)用所設(shè)計(jì)的ARM架構(gòu)32位Cortex-M3內(nèi)核,內(nèi)置512 K字節(jié)的閃存,64 k字節(jié)的SRAM作為運(yùn)行內(nèi)存,還具有豐富的通信接口,可以滿足本設(shè)計(jì)的需求[5]。
本設(shè)計(jì)采用VS1053B作為硬件解碼方案,是通過(guò)SPI接口來(lái)接收音頻數(shù)據(jù)的,模塊上的RST引腳提供了硬件復(fù)位功能,在歌曲切換前進(jìn)行硬復(fù)位可減少切換歌曲時(shí)的雜音。VS1053B解碼完成的數(shù)據(jù)由其內(nèi)置的DAC將數(shù)字音頻信號(hào)轉(zhuǎn)換成模擬音頻信號(hào),而后輸出到VS1053B的LEFT與RIGHT引腳上,可以直接驅(qū)動(dòng)耳機(jī)或是外接功放驅(qū)動(dòng)揚(yáng)聲器[6]。
DS18B20是常用的數(shù)字溫度傳感器,能夠?qū)h(huán)境溫度轉(zhuǎn)換為數(shù)字電信號(hào),是一種單總線接口的器件,只需一根數(shù)據(jù)線與主控的IO端連接口就可以實(shí)現(xiàn)通信,直流工作電壓范圍3.0~5.5 V,當(dāng)測(cè)溫范圍在-10℃~+85℃,測(cè)溫誤差僅在±0.5℃,可以給本系統(tǒng)提供較精確的環(huán)境測(cè)溫功能[7]。
CC2541串口藍(lán)牙模塊,可直接與STM32的USART接口相連。令藍(lán)牙模塊的STATE引腳與STM32上的引腳相連,把引腳配置成下拉輸入,當(dāng)藍(lán)牙連接建立之后,引腳上就會(huì)檢測(cè)到高電平,反之則為低電平,根據(jù)引腳上電平的變化,可把藍(lán)牙的連接狀態(tài)直觀的在顯示屏上展現(xiàn)出來(lái),此模塊可實(shí)現(xiàn)手機(jī)控制MP3播放器的功能。
LCD顯示屏是通過(guò)字模來(lái)顯示中文字體的,需要添加中文字庫(kù)來(lái)實(shí)現(xiàn)漢字及中文標(biāo)點(diǎn)符號(hào)的顯示。設(shè)計(jì)中用到的是GBK漢字庫(kù),其中每個(gè)漢字都采用雙字節(jié)(2 Bytes)的存儲(chǔ)方式,而GBK漢字庫(kù)中共收錄了21 003個(gè)漢字,如果將漢字庫(kù)存儲(chǔ)到內(nèi)部Flash(512 k字節(jié))顯然是不可行的,需要8 MB的外部Flash來(lái)存儲(chǔ)字庫(kù)[8]。
SD卡是一種大容量的數(shù)據(jù)存儲(chǔ)介質(zhì),不僅存儲(chǔ)容量大,它的讀寫(xiě)速率高、體積小,很適合用于本系統(tǒng)中存儲(chǔ)音頻及圖形化界面的圖標(biāo)。
SD卡支持兩種總線操作模式:分別是SPI模式與SDIO模式。SPI模式需要4根數(shù)據(jù)線,一個(gè)SPI接口可以掛載多個(gè)器件,但不足之處是犧牲了速度。出于避免SD卡的讀寫(xiě)速度成為系統(tǒng)運(yùn)行速度的瓶頸,保證音樂(lè)播放的流暢度的考慮,所以設(shè)計(jì)中使用了讀寫(xiě)速度較快的SDIO模式。
本設(shè)計(jì)中使用了一塊分辨率為320×240的3.2寸液晶顯示觸摸屏,作為播放器的顯示及控制部分。觸摸顯示屏可分為顯示屏與觸摸屏兩部分介紹:
(1)顯示屏其控制芯片是ILI9328,其BL_EN引腳是背光引腳,若該引腳上是高電平,則點(diǎn)亮顯示屏,反之顯示屏熄滅。將該引腳連接到STM32上具有PWM輸出功能的GPIO口,將產(chǎn)生一定頻率的脈沖輸出到該引腳,再通過(guò)控制脈沖的占空比,便可控制屏幕的亮度,這種控制屏幕亮度的方法被稱為PWM調(diào)光。
(2)觸摸部分是電阻式觸摸屏,觸摸控制芯片為XPT2046,其內(nèi)部集成了逐步逼近型AD轉(zhuǎn)換器,當(dāng)觸摸屏被按下,觸點(diǎn)的X、Y方向上會(huì)產(chǎn)生電壓變化,XPT2046對(duì)電壓進(jìn)行兩次AD轉(zhuǎn)換之后,再進(jìn)一步處理便可以得到觸點(diǎn)的X、Y坐標(biāo),根據(jù)得出的坐標(biāo)值可實(shí)現(xiàn)觸摸控制[9]。
設(shè)計(jì)中包含了多個(gè)按鈕以及多個(gè)界面,在圖形化界面的設(shè)計(jì)時(shí)盡量考慮了人機(jī)交互的體驗(yàn)感,盡量使界面美觀、簡(jiǎn)潔,讓操作變得簡(jiǎn)單,容易上手。
系統(tǒng)在運(yùn)行時(shí)有兩個(gè)主要任務(wù):一是檢測(cè)觸摸的坐標(biāo),根據(jù)坐標(biāo)作出響應(yīng);二是讀取SD中的音頻文件數(shù)據(jù),并發(fā)送到VS1053B進(jìn)行硬件解碼并輸出音樂(lè)。其余功能只能在兩個(gè)主要任務(wù)運(yùn)行的空余時(shí)間去處理,若其余功能運(yùn)行過(guò)于耗時(shí),則會(huì)影響系統(tǒng)的流暢性,會(huì)造成音樂(lè)卡頓,觸摸不及時(shí),所以在編寫(xiě)代碼時(shí),盡可能避免使用延時(shí)。
首先下載FatFs的源碼,其源代碼目錄下有ffconf.h、ff.h、ff.c、diskio.h、diskio.c、interger.h,移植過(guò)程可分為以下兩步。
(1)FatFs文件系統(tǒng)的關(guān)鍵配置文件是ffconf.h,在使用FatFs提供的接口之前,可根據(jù)需求對(duì)該文件其中的宏定義進(jìn)行修改。其部分宏定義的說(shuō)明如表1所示。
表1 ffconf.h中的重要宏定義及其說(shuō)明
(2)重新編寫(xiě)diskio.c中的6個(gè)底層驅(qū)動(dòng)函數(shù):初始化磁盤(pán)disk_initialize、讀取扇區(qū)disk_read、寫(xiě)入扇區(qū)disk_write、磁盤(pán)控制disk_ioctl、獲取磁盤(pán)狀態(tài)disk_status、獲取當(dāng)前時(shí)間get_fattime[10]。
本設(shè)計(jì)的顯示屏的控制芯片是ILI9328,在顯示屏的底層驅(qū)動(dòng)中,主要用到3個(gè)指令來(lái)實(shí)現(xiàn)在LCD屏幕上繪制圖形的,指令及描述如表2示。表中的功能表述中的行列地址實(shí)際上對(duì)應(yīng)的是屏幕的像素點(diǎn)的x與y坐標(biāo)。其控制的流程如圖2所示。
表2 ILI9328控制指令及說(shuō)明
圖2 顯示屏控制流程
觸摸屏的控制有兩個(gè)重要指令說(shuō)明如表3所示。當(dāng)觸摸屏被按下時(shí),T_INT引腳輸出低電平,此時(shí)向觸摸屏發(fā)送指令碼,等待XPT2046芯片內(nèi)部進(jìn)行AD轉(zhuǎn)換后,可以從T_MISO引腳上讀取16位的坐標(biāo)數(shù)據(jù),一個(gè)完整的坐標(biāo)需要發(fā)送兩次指令碼,分別獲得X與Y軸的坐標(biāo)值。
表3 觸摸屏控制指令
音頻數(shù)據(jù)來(lái)源于使用FatFs文件系統(tǒng)中接口函數(shù)f_read讀出的數(shù)據(jù),每次主控芯片從SD卡中讀取4 096字節(jié)的音頻數(shù)據(jù)緩存到主控上的內(nèi)存中,每當(dāng)DREQ為高電平就往VS1053中發(fā)送32字節(jié)的數(shù)據(jù),直到讀取到音頻文件的末尾[11]。其主要工作流程如圖3所示。
圖3 播放音頻流程
在本設(shè)計(jì)使用PWM調(diào)光對(duì)屏幕亮度進(jìn)行控制。PWM有3個(gè)重要的參數(shù)分別是高度、寬度及周期,其關(guān)系如圖4所示。
圖4 PWM的3個(gè)參數(shù)
寬度占周期的百分比稱為占空比。通過(guò)控制占空比來(lái)控制屏幕的亮度,屏幕亮度大小與占空比正相關(guān)[12]。PWM的脈沖是由定時(shí)器產(chǎn)生的,這里列出脈沖周期及占空比與定時(shí)器參數(shù)的關(guān)系如下。
(1)周期=定時(shí)器重載值∕定時(shí)器時(shí)鐘頻率。
(2)占空比=比較值∕定時(shí)器重載值。
定時(shí)器重載值、定時(shí)器時(shí)鐘頻率這兩個(gè)參數(shù)在定時(shí)器初始化的時(shí)候就設(shè)置好固定值,只需要改變比較值,就可以改變占空比,從而實(shí)現(xiàn)屏幕調(diào)光功能。
串口藍(lán)牙模塊是通過(guò)串口與主控通信的,為STM32編寫(xiě)串口中斷程序,就可以從藍(lán)牙模塊獲取數(shù)據(jù)。設(shè)定一套字符串指令,通過(guò)手機(jī)App發(fā)送到藍(lán)牙模塊,STM32接收到之后進(jìn)行字符串比對(duì),然后作出指令相對(duì)應(yīng)的動(dòng)作,實(shí)現(xiàn)藍(lán)牙控制功能。
該功能的實(shí)現(xiàn)用到了硬件定時(shí)器以及定時(shí)中斷,設(shè)定一個(gè)計(jì)時(shí)值,每次中斷觸發(fā)計(jì)時(shí)值減1,當(dāng)計(jì)時(shí)值為0時(shí)便使音樂(lè)停止播放。其工作流程如圖5所示。
圖5 定時(shí)關(guān)閉播放功能流程
DS18B20單次溫度采集的流程如圖6所示。DS18B20完成一次溫度轉(zhuǎn)換至多需要750 ms,若在啟動(dòng)溫度轉(zhuǎn)換的750 ms內(nèi)再次啟動(dòng)轉(zhuǎn)換,很有可能讀取不到正確的結(jié)果。在本設(shè)計(jì)中,利用定時(shí)器每隔3 s進(jìn)行一次溫度采集,既避免了采集間隔過(guò)低,也能保證溫度檢測(cè)的實(shí)時(shí)性。
圖6 DS18B20溫度轉(zhuǎn)換流程
系統(tǒng)上電后進(jìn)入主界面,如圖7所示,分為3個(gè)部分。
圖7 主功能界面
(1)信息顯示欄。位于主界面的頂部,從左到右分別顯示了當(dāng)前的時(shí)間、日期以及環(huán)境的溫度值。點(diǎn)擊時(shí)間或者日期的字體會(huì)切換至設(shè)置界面。亮度調(diào)節(jié)如圖8所示。
圖8 屏幕亮度調(diào)節(jié)功能測(cè)試
(2)音樂(lè)列表。界面中間部分把SD卡中歌曲的名字以列表的形式顯示出來(lái),一頁(yè)顯示8首歌曲,支持翻頁(yè)瀏覽功能??芍苯狱c(diǎn)擊歌曲名切換歌曲。
(3)播放控制欄。位于主界面的底部,該部分顯示了當(dāng)前歌曲的播放音量、播放進(jìn)度,點(diǎn)擊音量條或者進(jìn)度條可調(diào)整歌曲的音量以及播放進(jìn)度,還包含了5個(gè)控制按鈕。
時(shí)間設(shè)置界面如圖9所示,主要功能是設(shè)置時(shí)分秒,通過(guò)點(diǎn)擊主界面頂部顯示的時(shí)間進(jìn)入,通過(guò)界面上的“+”和“-”便可以調(diào)整時(shí)間,按下“確認(rèn)”按鈕使設(shè)置生效。
圖9 時(shí)間設(shè)置功能測(cè)試
功能與時(shí)間設(shè)置界面相似,可設(shè)置年、月、日,如圖10所示。定時(shí)播放關(guān)閉功能界面如圖11所示。
圖10 日期設(shè)置界面測(cè)試
圖11 播放定時(shí)關(guān)閉功能測(cè)試
藍(lán)牙連接建立成功之后,出現(xiàn)如圖12所示右上角的藍(lán)牙圖標(biāo)便可以通過(guò)手機(jī)App控制。
圖12 藍(lán)牙連接測(cè)試
本設(shè)計(jì)采用SMT32F103ZET6作為主控芯,在此硬件平臺(tái)KDE基礎(chǔ)上,結(jié)合了音頻編解碼模塊、溫度傳感器、藍(lán)牙模塊以及SD卡,以顯示觸摸屏作為人機(jī)交互基礎(chǔ),進(jìn)行了圖形化界面及應(yīng)用功能的開(kāi)發(fā);移植了FatFs文件系統(tǒng)用以讀寫(xiě)SD卡,成功設(shè)計(jì)出了MP3播放器。此播放器具有溫度檢測(cè)、屏幕調(diào)光、藍(lán)牙控制、電子時(shí)鐘、定時(shí)播放等功能。經(jīng)實(shí)驗(yàn)測(cè)試,該播放器不僅觸摸響應(yīng)迅速,能流暢地播放音樂(lè),并能長(zhǎng)時(shí)間穩(wěn)定運(yùn)行,具有一定的應(yīng)用價(jià)值。