如何使用單片機(jī)模仿視頻播放
Halo大家好我是叭布,現(xiàn)在已經(jīng)咕了半年,謝謝大家還沒取關(guān)。
這次的內(nèi)容是講解用單片機(jī)模擬視頻播放需要實(shí)現(xiàn)的功能以及模塊以及我踩過的坑,說是播放視頻,實(shí)際是播放音樂的同時(shí)刷新圖片,源碼我會(huì)放在評(píng)論區(qū)以供參考,因?yàn)榫臀易约河茫⑨尣煌耆?,有些地方為了提高效率寫得比較亂,如果你花耐心去看的話應(yīng)該會(huì)有所收獲。
使用的音頻是11025采樣率單聲道的WAV文件,畫面是輪流展示320*240的bmp圖片的效果
首先是文件存儲(chǔ)
使用的模塊:
STM32F411CEU6最小系統(tǒng)板,SDIO接口的SD卡模塊,SD卡

使用的資料:
STM32F411的數(shù)據(jù)手冊(cè)和寄存器手冊(cè)(某寶店家提供)
野火視頻教程“SDIO—SD卡讀寫測試”以及相關(guān)例程,這個(gè)視頻B站有,但是基于STM32F103的內(nèi)容,會(huì)有所不同,這部分只能自己探索了,當(dāng)時(shí)我一直翻固件庫的文件夾,用文本文檔打開.c文件來找相應(yīng)的程序接口。
野火視頻教程“SDIO—SD卡文件系統(tǒng)移植”
如果你打算移植代碼,就要首先熟悉.c和.h文件的創(chuàng)建,每次添加新功能都會(huì)用到這個(gè)內(nèi)容
說說我遇到的坑:
測試文件系統(tǒng)時(shí)要先把SD卡格式化成FAT32文件系統(tǒng),分配單元大小要默認(rèn)大小
為了使用DMA正常傳輸SDIO的數(shù)據(jù),DMA初始化時(shí)要啟用FIFO
為了避免有時(shí)SD卡讀取的數(shù)據(jù)會(huì)在頭部或者尾部多2個(gè)字節(jié),DMA初始化時(shí)內(nèi)設(shè)的數(shù)據(jù)單位設(shè)為半字
SD卡和單片機(jī)的線路距離越短越好,不然通訊速度調(diào)快了就會(huì)涼。所以我的SD卡的位置就在單片機(jī)下面,SDIO驅(qū)動(dòng)的移植是整個(gè)項(xiàng)目最難的地方。
畫面顯示:SPI接口的彩色液晶屏 ( 像素320*240 ,RGB565彩色分辨率)
使用的資料:
彩色液晶屏的STM32驅(qū)動(dòng)例程(某寶店家提供)
野火視頻教程“電阻觸摸屏—觸摸畫板”以及相關(guān)例程
這里我根據(jù)自己的硬件只重寫了SPI初始化的程序,然后在復(fù)制野火的LCD屏繪制的部分程序,需要什么就復(fù)制什么。
模擬信號(hào)輸出(音頻部分):PT8211做數(shù)字轉(zhuǎn)模擬信號(hào)加TDA2822功放
PT8211的驅(qū)動(dòng)程序網(wǎng)上一找就有了,TM8211的驅(qū)動(dòng)貌似和他是一樣的,這個(gè)芯片能輸出有符號(hào)16Bit分辨率的模擬信號(hào),也就是寫入輸出1.65v(3.3V電源),寫-32764輸出0V,和wav文件的數(shù)據(jù)的格式完美契合。TDA2822照著數(shù)據(jù)手冊(cè)的示例電路做就能用了,手冊(cè)是百度找的
關(guān)于排除單片機(jī)對(duì)模擬電路的干擾,大家有沒有什么相關(guān)文章或示例電路可以在評(píng)論區(qū)告訴我嗎?我了解的是??
模擬和數(shù)字的VCC和地分開接上,最后在只有一點(diǎn)連接,并隔著磁珠連接模擬和數(shù)字的vcc,每個(gè)芯片電源引腳旁都加上電容,
最后這個(gè)效果可能是因?yàn)閷?shí)際電路并不是這樣吧。
現(xiàn)在能讀取SD卡的文件,描繪液晶屏的顯示內(nèi)容,輸出模擬信號(hào),把它們協(xié)調(diào)好播放畫面與音頻就是我自己做的了。圖片用的是BMP格式文件,音頻用的是WAV單聲道文件,都是沒有編碼的裸數(shù)據(jù)的文件格式,解讀起來比較快,為什么不用jpg,mp3?不是沒試過JPG,移植了它的解碼程序,顯示一張全屏的圖片居然花了半秒,而同樣的圖片BMP需要0.11秒,優(yōu)化程序后,就變成了0.08秒,不過程序變得比較難懂了,后來做到音頻時(shí)索性用wav了。
?
終于到視頻播放的實(shí)現(xiàn)思路了
WAV 11025采樣率,也就是說修改1103次模擬輸出大概就過了0.1秒,這時(shí)修改顯示的圖片,就能達(dá)到動(dòng)畫的效果了,關(guān)于如何把視頻分解成10幀的320*240的BMP圖片請(qǐng)轉(zhuǎn)到CV2289163
后面就是一些關(guān)于學(xué)習(xí)的建議和沒什么用的心得
?
看到現(xiàn)在可能有人會(huì)說了,怎么你一天到晚都是在抄別人的程序啊,自己寫多學(xué)點(diǎn)東西不好嗎?確實(shí),移植程序會(huì)少學(xué)了很多東西,移植的確是抄程序,只需要理解接口和參數(shù)就能成功,我認(rèn)為既然已經(jīng)有人比我先做出來了,那我更想移植或者閱讀它,利用或者仿造它去實(shí)現(xiàn)更多天馬行空的想法,我以前埋頭苦干到最后,發(fā)現(xiàn)網(wǎng)上早就有人做好了,思路還更簡潔,運(yùn)行更快,所以現(xiàn)在做第一層底層時(shí)我第一步是找例程。
?
網(wǎng)購元件、模塊、大部分店家還是會(huì)把資料整理好的,就算沒有,你也能在網(wǎng)上找到相關(guān)內(nèi)容或是例程,代碼的獲取并不難,所以你完全嘗試可以自己從頭開始編輯“單片機(jī)播放視頻”的項(xiàng)目,我發(fā)布了這個(gè)項(xiàng)目是為了提供一種實(shí)現(xiàn)思路給大家,雖然我覺得不會(huì)有多少人看,而且還有一些不知道原因的問題,但如果能幫助你去實(shí)現(xiàn)功能(移植),或是理解實(shí)現(xiàn)的方法模仿思路編程,那我還是做了一件好事。
有些人瘋狂問資料,問問題,但真正的花心思理解代碼的時(shí)候卻很少,總是裝出一副努力學(xué)習(xí)的樣子,天天把代碼掛嘴邊最后連移植都做不到,所以,我認(rèn)為能讓單片機(jī)播放視頻最重要的是耐心和毅力,這話雖然很老土,但確實(shí)在理。
整個(gè)過程我是邊學(xué)邊做,這些功能我是第一次實(shí)現(xiàn)。去年12月初開始買模塊,在12月中旬宣告全面失敗,因?yàn)楫?dāng)時(shí)用的方法不對(duì),單片機(jī)各方面通訊速度太慢了,頂多1秒兩幀的動(dòng)畫,之后使用STM32F411,尺寸相同,不需要完全重焊,店家給了手冊(cè)和例程。最后在1月17日第一次實(shí)現(xiàn)“播放視頻”。在20號(hào)完成觸摸按鈕和界面繪制的程序。中間因?yàn)樨澩婊蛞驗(yàn)槠渌虑闀?huì)暫時(shí)停下,但過不久還是會(huì)去趕一下進(jìn)度,大概這就是積蛙步以至千里吧。