|
在小哈公眾號上,公眾號:嵌入式從0到1,小哈用鴻蒙平臺做了個播放愛若琉璃歌曲的文章,寫的非常詳細,視頻做的也非常好,伙伴們可以去看看,哈哈,說了這么多,就是為了抄點素材。。。鑒于stm32f103c8t6(便宜好用)平臺應(yīng)該是比較普遍的了,做個32版本的,嘿嘿 這次廢話有點多,上干貨!
1、音樂的音調(diào)(音符)和節(jié)拍(摘自小哈公眾號) 要想實現(xiàn)一個樂譜,我們只要確定“音符(音調(diào))”和“節(jié)拍”即可。音調(diào)表示一個音符響的頻率,節(jié)拍表示一個音符該唱多長的時間。
音符(音調(diào))的確定一般鋼琴鍵盤有88個按鍵:
r43lmhahf206405163614.png (60.7 KB, 下載次數(shù): 0)
下載附件
保存到相冊
r43lmhahf206405163614.png
2024-9-7 17:20 上傳
鋼琴上88按鍵的頻率如下表所示:
eta3teit5dw6405163714.png (124.98 KB, 下載次數(shù): 0)
下載附件
保存到相冊
eta3teit5dw6405163714.png
2024-9-7 17:20 上傳
比如中央C音的標(biāo)準(zhǔn)頻率就是261,在上面表格中就是:音名為C4的按鍵。程序中定義一個音頻的數(shù)組:
jicdzsk4ahe6405163814.png (142.58 KB, 下載次數(shù): 0)
下載附件
保存到相冊
jicdzsk4ahe6405163814.png
2024-9-7 17:20 上傳
在系統(tǒng)時鐘為40MHZ的情況下,輸出的脈沖的最低頻率為:40M / 65535 (下面有計算方法) ,即 40 * 1000 * 1000 / 65535 = 610.3608758678569?,所以在系統(tǒng)時鐘40MHZ下,只能產(chǎn)生頻率610Hz以上的音,即D#5及以上的按鍵音,所以我們選擇C6那組按鍵的音作為主音。所以我們預(yù)定義正常音的C6對應(yīng)數(shù)組的起始索引為63。
lsl5b0tdwq46405163914.png (12.89 KB, 下載次數(shù): 0)
下載附件
保存到相冊
lsl5b0tdwq46405163914.png
2024-9-7 17:20 上傳
要想讓蜂鳴器發(fā)出某個音只需要讓PWM輸出對應(yīng)頻率的脈沖即可。網(wǎng)上找個《愛若琉璃》的簡譜,然后按照對應(yīng)關(guān)系創(chuàng)建如下樂譜數(shù)組:
lmuacu3jrws6405164014.png (362 KB, 下載次數(shù): 0)
下載附件
保存到相冊
lmuacu3jrws6405164014.png
2024-9-7 17:20 上傳
節(jié)拍的確定節(jié)拍就是一個音持續(xù)的時間,這里就是PWM脈沖持續(xù)的時間,那么持續(xù)的時間如何確定呢?
5bugpxwjzlj6405164115.png (247.27 KB, 下載次數(shù): 0)
下載附件
保存到相冊
5bugpxwjzlj6405164115.png
2024-9-7 17:20 上傳
基礎(chǔ)知識算是寫完(抄完)了,那么怎么在程序上實現(xiàn)呢,王者榮耀達摩常說的,公式才是永恒的真理,現(xiàn)在理論有了,來,實現(xiàn)它,干!
2、此次使用的可視化配置工具cubemx,不得不說,基本的配置,用這玩意還是非常省事(懶)的,由于我的蜂鳴器控制引腳接在了PB3上,也即是TIM2-CH2的通道上,配置PB3為TIM2-CH2模式
gsarenzko2c6405164215.png (165.28 KB, 下載次數(shù): 0)
下載附件
保存到相冊
gsarenzko2c6405164215.png
2024-9-7 17:20 上傳
接下來是最重要的時鐘配置,宛若人的心臟般,芯片工作的基本,這里選擇的也是配置為了40MHZ,為什么是40MHZ,懶!配置40MHZ剩下的就直接搬運小哈的,無非是換個平臺啦。
zrpndmsxg2p6405164315.png (94.84 KB, 下載次數(shù): 0)
下載附件
保存到相冊
zrpndmsxg2p6405164315.png
2024-9-7 17:20 上傳
然后配置定時器2的一些參數(shù),和通道2配置為PWM模式,分頻系數(shù)選擇不分頻,周期設(shè)為0,這里只是初始值,即使設(shè)置了,也沒關(guān)系的,后面播放音符的時候,會修改的咯,所以這個不用擔(dān)心具體設(shè)置什么值
5agmy1ylc4i6405164415.png (64.09 KB, 下載次數(shù): 0)
下載附件
保存到相冊
5agmy1ylc4i6405164415.png
2024-9-7 17:20 上傳
這里可以設(shè)置我們代碼生成時候的一些設(shè)置,第一項是只添加需要的文件,用到哪些庫文件添加那些,我們可以選擇用到的文件添加,第二處是為每個模塊生成單獨的.c,.h文件,建議勾選,否則所有的東西都在main函數(shù)里面,代碼可讀性會比較差,小飛哥是經(jīng)常勾選的。
0wva1yebcyx6405164515.png (45.94 KB, 下載次數(shù): 0)
下載附件
保存到相冊
0wva1yebcyx6405164515.png
2024-9-7 17:20 上傳
3、代碼解讀
至此我們的配置就完成了,生成代碼就可以啦!TIM2的初始化配置,和我們cubemx配置上一樣的咯,不分頻,周期為0,占空比為0,這些參數(shù)后面會用到,在進行修改
nwks20cc3fx6405164615.png (57.47 KB, 下載次數(shù): 0)
下載附件
保存到相冊
nwks20cc3fx6405164615.png
2024-9-7 17:20 上傳
這里可以看到,配置PB3引腳復(fù)用功能
hdgvyokxjbh6405164715.png (37.32 KB, 下載次數(shù): 0)
下載附件
保存到相冊
hdgvyokxjbh6405164715.png
2024-9-7 17:20 上傳
在播放音樂的時候,我們主要通過不斷修改頻率來實現(xiàn),PWM占空比設(shè)置為50%,占空比通過設(shè)置CCR寄存器的值來控制
PWM頻率計算:
Fpwm=Ftimclk/(arr+1)*(psc+1)
arr:周期
psc:預(yù)分頻值
比如:
Ftimclk = 40MHZ
arr=399
psc=0
Fpwm = 40/40=100000HZ
TIM2->CCR2 = 199
占空比為50%
代碼實現(xiàn):
mpe0ypqwgk36405164815.png (54.89 KB, 下載次數(shù): 0)
下載附件
保存到相冊
mpe0ypqwgk36405164815.png
2024-9-7 17:20 上傳
大白,小飛哥給你放首音樂,嗨起來,哈哈,連接會在下面評論區(qū),歡迎小伙伴們動手,干!
歡迎大家關(guān)注 Embeded小飛哥 ,我是小飛哥,讓我快點遇到優(yōu)秀的你,然后一起變得更加優(yōu)秀,加油
2a3z4aap0z16405164915.jpg (413.81 KB, 下載次數(shù): 0)
下載附件
保存到相冊
2a3z4aap0z16405164915.jpg
2024-9-7 17:20 上傳
! |
|