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