
之前一直想做一個MP3播放器,普遍的方案都比較復雜,用音頻解碼芯片還有其他芯片的方案,開發起來不太容易。偶然的一個機會看到這種簡單的串口播放器,就跟大家分享一下這個過程,大家也可以自己制作下,弄個好的造型,外加功放和喇叭,那就更完美,放在枕邊聽著,舒服。
設計使用的是MY1690-12P語音模塊,支持UART 異步串口控制:支持播放、暫停、上下曲、音量加減、選曲播放、插播等。模塊最大支持32GTF卡;也可外接U盤或USB數據線連接電腦更換SD卡音頻文件。該模塊內置3W功放,可以直接驅動3W的喇叭,使用更方便。


越簡單、越容易實現的東西,功能不太完善,在另一個程度上就比較麻煩。第一點是歌名必須按照0000、0001這樣修改,不然播放不了;第二就是單片機控制需要挺多按鍵;斷電不能保持進度等。沒用到那個就ADKEY的功能。
用串口發送16進制的指令來控制模塊,這個就很簡單的,先創建幾個控制命令的數據,打包一個串口發送的子程序,發命令是用按鍵觸發調用發送子函數。確實會很簡單。所以我用手上的stm32板(ufun沒有把串口接出來)來完成這些功能。很簡單的程序,我硬是折騰了幾個晚上。
按鍵部分:
5個按鍵控制:暫停播放,上下切歌、調音量大小。想用一個按鍵實現兩種功能:單擊和雙擊(不是單擊兩次,有區別的),當時沒搞出來。有一個簡單的用延時的方法,我沒有用。中斷和定時器方案有時間在研究,估計也不難。

第二部分:串口發送部分
可能大家會覺得很簡單,但是可能有人不太注意一些細節,在我介紹畢設(超聲波測距)的有提過說串口發送數據的問題。
首先大家現在開發板用串口發送e802 b4如下程序,不要放在while循環里面,保證上電只運行一次。發送代碼如下:
USART_SendData(USART1,0xe8);while((USART1->SR&0X40)==0);// while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);delay_us(40);USART_SendData(USART1,0x02);while((USART1->SR&0X40)==0);delay_us(40);// while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);USART_SendData(USART1,0xb4);while((USART1->SR&0X40)==0);
打開電腦串口助手,你會發現一下問題:

第一次發送e8 02 b4少了e8,丟失第一個字節數據。不知大家平時有沒有遇到。
查閱stm32f10x參考手冊,找到這樣一句話:
TC:發送完成
當包含有數據的一幀發送完成后,由硬件將該位置位。如果USART_CR1中的TCIE為1,則產生中斷。由軟件序列清除該位(先讀USART_SR,然后寫入USART_DR)。TC位 也可以通過寫入0來清除,只有在多緩存通訊中才推薦這種清除程序。 【 0:發送還未完成;1:發送完成】
注意到這一句:由軟件序列清除該位(先讀USART_SR,然后寫入USART_DR)。也就是說,要先read USART_SR,然后write USART_DR,才能完成TC狀態位的清除。而硬件復位后,串口發送的首個數據之前沒有read SR的操作,是直接write DR,也就是說,TC沒有被清除掉。
詳情請看參考手冊,建議是看官方英文的,翻譯版不準確的話,理解起來也費勁。
前面要加
USART_ClearFlag(USART2,USART_FLAG_TC)
語句就可避免這個錯誤,好像還有另外一個函數可以解決這個問題。當然,一直循環發送而忽視第一次發送是沒問題,但是對一些只能發送一次的命令,就不太適用;或者加入一個無關的數據來丟失。不過是否每次發送前都要這要,我就沒有去驗證,估計是硬件復位會的第一次發送會丟失。有興趣的可以去驗證下。所以我把這個語句寫進串口發送的子函數里面,每次發送都去清除標志位。
串口子函數部分:
串口子函數部分用數組作為形參,就用到了指針,不多做解釋,因為我也是剛學習這個指針的。這個子函數能節省好多行代碼,不用一個一個的單獨發送。

最重要的串口丟失首位數據的問題解決了和串口發送子函數寫好了,剩下的就不是問題了。當然還有一些可以擴展地方,比如說可以拓展一個0.91寸OLED屏幕,用來顯示歌名,是可以做到,不過工作量有點大,外接功放和喇叭,那會更棒,歡迎大家提供更多的方案,一起交流。

用ufun的同學需要提醒一下,記得改晶振哦
有興趣的小伙伴自行某寶搜索MY1690-12P模塊,說明書也很容易的找到。
-END-
#推薦閱讀#
為什么你的電源紋波那么大?
MOSFET數據手冊你會看了嗎?
工程師講解:用C語言實現狀態機(實用)
十大常用電子元器件背后的門道
面向對象編程,再見!
三英戰呂布:中國半導體3大核心公司
工程師不得不知的PCB基本常識
MEMS陀螺儀工作原理
四十年大戲——光刻機資本局
如何使用示波器進行射頻信號測試(深度好文)
高人圖解高速電路PCB回流路徑
警惕!CAF效應導致PCB漏電
要吃透MOS管,看這個就夠了!
一個故事講完CPU的工作原理
深入了解上拉電阻和下拉電阻
電容是如何工作的,這個動畫看后基本懂了
牛人教你開關電源各功能部分原理分析、計算與選型
MOSFET的驅動技術有哪些?圖文并茂告訴你真相!
電路板調不出來,一怒之下老子一刀劈開!
PCB制板基礎知識
▼點擊閱讀原文,下載《7份電機與電控精華資料合集 》