自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

HarmonyOS LYEVK-3861開發(fā)板播放《蜜雪冰城》

開發(fā) 前端 OpenHarmony
在學(xué)習(xí)PWM相關(guān)接口的過程中,了解到PWM接口驅(qū)動(dòng)蜂鳴器可以實(shí)現(xiàn)類似音樂播放的效果,個(gè)人覺得是個(gè)不錯(cuò)的思路,就有了本次的學(xué)習(xí)開發(fā)之旅。

[[418096]]

​想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

在LYEVK-3861開發(fā)板的學(xué)習(xí)過程中,發(fā)現(xiàn)缺少基于鴻蒙2.0的相關(guān)文檔,同時(shí)缺少基于2.0系統(tǒng) IoT接口的應(yīng)用示例。在學(xué)習(xí)PWM相關(guān)接口的過程中,了解到PWM接口驅(qū)動(dòng)蜂鳴器可以實(shí)現(xiàn)類似音樂播放的效果,個(gè)人覺得是個(gè)不錯(cuò)的思路,就有了本次的學(xué)習(xí)開發(fā)之旅。

環(huán)境準(zhǔn)備

1、開發(fā)環(huán)境、編譯環(huán)境搭建,參考官方文檔,此處不在贅述。參考鏈接如下:

2、OpenHarmony 2.0 Canary源碼 源碼獲取,參考:

3、LYEVK-3861 IoT物聯(lián)網(wǎng)開發(fā)板套件

開發(fā)調(diào)試

2.1 相關(guān)基礎(chǔ)知識(shí)介紹

PWM輸出方波的IOT接口

鴻蒙系統(tǒng)IoT硬件子系統(tǒng)提供了一些外設(shè)相關(guān)的接口,目錄位于:

  1. base/iot_hardware/peripheral/interfaces/kits 

PWM相關(guān)接口,接口頭文件為iot_pwm.h,其中開始輸出方波的接口為:

  1. unsigned int IoTPwmStart(unsigned int port, unsigned short duty, unsigned int freq); 

接口參數(shù)介紹:

freq:IoTPwmStart接口中freq參數(shù)是分頻倍數(shù),PWM實(shí)際輸出的方波頻率等于 PWM時(shí)鐘源頻率 除以 分頻倍數(shù),即

  1. f = Fcs / freq 

其中,F(xiàn)cs是PWM時(shí)鐘源頻率;

duty:IoTPwmStart接口的duty參數(shù)可以控制輸出方波的占空比,占空比是指PWM輸出的方波波形的高電平時(shí)間占整個(gè)方波周期的比例,具體占空比值取值為1到99,例如想要輸出占空比 50%的方波信號(hào),那么duty填的值就要是50。

音符-頻率對(duì)應(yīng)關(guān)系

【中軟國(guó)際】HarmonyOS LYEVK-3861開發(fā)板播放《蜜雪冰城》-鴻蒙HarmonyOS技術(shù)社區(qū)

這個(gè)表中有一個(gè)規(guī)律——音高升高一個(gè)八度,頻率升高一倍。

  1. hi_u32 hi_pwm_set_clock(hi_pwm_clk_source clk_type); 

160M時(shí)鐘源條件下,輸出方波的最低頻率是:160M/65535=2441.44…,這個(gè)頻率略高,在上面的表格中沒有找到音名。通過調(diào)用hi_pwm_set_clock接口,可以修改時(shí)鐘源,將時(shí)鐘源設(shè)置為晶體時(shí)鐘且時(shí)鐘頻率為40MHz,40M/65535= 610.3…,這樣就能夠輸出E5及以上的所有音符。

2.2 曲譜轉(zhuǎn)換

由于個(gè)人比較喜歡《蜜雪冰城》,我選擇了《蜜雪冰城主題曲》的曲譜作為素材,簡(jiǎn)譜如下:【中軟國(guó)際】HarmonyOS LYEVK-3861開發(fā)板播放《蜜雪冰城》-鴻蒙HarmonyOS技術(shù)社區(qū)

簡(jiǎn)譜轉(zhuǎn)換

每個(gè)音符都需要有節(jié)拍,在外面的代碼里體現(xiàn)為停頓時(shí)間,不同音符的不同停頓時(shí)間,可以實(shí)現(xiàn)簡(jiǎn)單的音樂起伏。

常見的節(jié)拍簡(jiǎn)譜對(duì)應(yīng):

【中軟國(guó)際】HarmonyOS LYEVK-3861開發(fā)板播放《蜜雪冰城》-鴻蒙HarmonyOS技術(shù)社區(qū)

通過簡(jiǎn)譜和以上表格的對(duì)應(yīng),就可以將我們現(xiàn)有的簡(jiǎn)譜,轉(zhuǎn)換成為可以被程序識(shí)別的”程序譜子“。

2.3 編寫代碼

接口初始化

修改device/hisilicon/hispark_pegasus/sdk_liteos/build/config/usr_config.mk配置文件,打開PWM編譯支持,如已打開,可略過:

  1. # CONFIG_UART_DMA_SUPPORT is not set 
  2. CONFIG_PWM_SUPPORT=y 
  3. # CONFIG_PWM_HOLD_AFTER_REBOOT is not set 

修改device/hisilicon/hispark_pegasus/sdk_liteos/app/wifiiot_app/init/app_io_init.c的如下代碼:

  1. #ifdef CONFIG_PWM_SUPPORT  
  2.     /* PWM 0/2/3/4/5 配置同理 */ 
  3.     //hi_io_set_func(HI_IO_NAME_GPIO_8, HI_IO_FUNC_GPIO_8_PWM1_OUT); 
  4.     //GPIO引腳復(fù)用 
  5.     hi_io_set_func(HI_IO_NAME_GPIO_8, HI_IO_FUNC_GPIO_8_GPIO);  //button 
  6.     hi_io_set_pull(HI_IO_NAME_GPIO_8, HI_IO_PULL_UP); 
  7.     hi_io_set_func(HI_IO_NAME_GPIO_9,HI_IO_FUNC_GPIO_9_PWM0_OUT);// PWM 
  8. #endif 

備注:2.0把GPIO的引腳復(fù)用從應(yīng)用層移到了板級(jí),對(duì)IO的功能做了更加細(xì)分的處理,之前一直以為2.0移除了相關(guān)的接口實(shí)現(xiàn),最后才發(fā)現(xiàn)2.0做了功能上的優(yōu)化。

實(shí)例代碼

按鍵驅(qū)動(dòng)

【中軟國(guó)際】HarmonyOS LYEVK-3861開發(fā)板播放《蜜雪冰城》-鴻蒙HarmonyOS技術(shù)社區(qū)

說明:按鍵主要是為了開啟音樂的播放。

“程序”曲譜

《蜜雪冰城主題曲》的“程序”曲譜,定義如下:

【中軟國(guó)際】HarmonyOS LYEVK-3861開發(fā)板播放《蜜雪冰城》-鴻蒙HarmonyOS技術(shù)社區(qū)

以上的曲譜,看起來比較直觀,也比較容易理解,其中的一些宏定義定義如下:

【中軟國(guó)際】HarmonyOS LYEVK-3861開發(fā)板播放《蜜雪冰城》-鴻蒙HarmonyOS技術(shù)社區(qū)

有了以上的枚舉,可以自己直接譜曲,甚至不用拘泥于現(xiàn)有的曲子,當(dāng)然放出來的具體效果如何,就因人而異了。

音符頻率

以下是IoTPwmStart接口的入口參數(shù)freq的定義,和前述枚舉是一一對(duì)應(yīng)的:

音樂處理

  1. /* 音樂處理*/ 
  2. static void *BeeperMusicTask(const char *arg) 
  3.     (void)arg; 
  4.     int status = 0; 
  5.     printf("BeeperMusicTask start!\r\n"); 
  6.  
  7.     hi_pwm_set_clock(PWM_CLK_XTAL); // 設(shè)置時(shí)鐘源為晶體時(shí)鐘(40MHz,默認(rèn)時(shí)鐘源160MHz) 
  8.  
  9.     while (1) 
  10.     { 
  11.         usleep(M_INTERVAL_TIME_US); 
  12.         /*第一次點(diǎn)擊按鍵播放,播放完以后按鍵才能繼續(xù)生效*/ 
  13.         if (music == 1) 
  14.         { 
  15.             for (size_t i = 0; i < sizeof(g_interval) / sizeof(g_interval[0]); i++) 
  16.             {   
  17.                 uint32 tune = g_interval[i].tuneNotes; // 音符 
  18.                 uint16 freqDivisor = g_tuneFreqs[tune]; 
  19.                 uint32 tuneInterval = g_interval[i].interval * (TICKS_DELAY); // 音符時(shí)間 
  20.                 IoTPwmStart(IOT_PWM_PORT0, PWM_DUTY, freqDivisor); 
  21.                 usleep(tuneInterval); 
  22.                 IoTPwmStop(IOT_PWM_PORT0); 
  23.                 music = 0; 
  24.             } 
  25.         } 
  26.     } 
  27.  
  28.     return NULL

功能展示

​ 以上都完成之后,就可以編譯、燒錄,并測(cè)試最后的完成效果。

​ 視頻演示

​ 說明:

​ 1、本程序需要Hi3861開發(fā)板配合交通燈板實(shí)現(xiàn)完整的演示

​ 2、燒錄完成之后,RESET重啟開發(fā)板之后,音樂不會(huì)播放;

​ 3、重啟開發(fā)板之后,點(diǎn)擊交通燈板開發(fā)播放音樂;播放過程中,按鍵失去效果,待播放完成之后,再次點(diǎn)擊按鍵,音樂繼續(xù)播放。

​想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2021-11-05 09:58:58

鴻蒙HarmonyOS應(yīng)用

2021-08-27 17:02:56

鴻蒙HarmonyOS應(yīng)用

2021-10-11 10:07:09

鴻蒙HarmonyOS應(yīng)用

2021-09-02 15:25:53

鴻蒙HarmonyOS應(yīng)用

2020-10-30 17:42:36

鴻蒙 OS Hi386

2020-11-06 10:15:16

HiBurn

2021-12-15 15:28:18

鴻蒙HarmonyOS應(yīng)用

2020-12-16 10:05:48

鴻蒙開發(fā)板Onenet平臺(tái)

2021-09-16 10:03:39

鴻蒙HarmonyOS應(yīng)用

2021-02-01 13:58:51

鴻蒙HarmonyOS應(yīng)用開發(fā)

2020-12-29 09:59:01

鴻蒙HarmonyOS智能家居

2020-12-17 10:02:16

鴻蒙Hi3861開發(fā)板

2020-10-14 09:37:03

HiBurn鴻蒙.bin文件

2020-10-30 17:12:05

Hi3861

2020-12-15 11:57:49

Hi3861 HarmonyOS開發(fā)板

2021-09-10 10:01:04

鴻蒙HarmonyOS應(yīng)用

2020-12-09 09:44:29

Hi3861硬件介紹鴻蒙開發(fā)板

2020-11-18 11:56:06

鴻蒙Hi3861

2020-11-06 11:32:11

NV操作

2021-06-25 15:32:13

鴻蒙HarmonyOS應(yīng)用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)