【中软国际】HarmonyOS LYEVK-3861开发板播放《蜜雪冰城》 原创 精华

深开鸿
发布于 2021-8-10 15:32
浏览
20收藏

在LYEVK-3861开发板的学习过程中,发现缺少基于鸿蒙2.0的相关文档,同时缺少基于2.0系统 IoT接口的应用示例。在学习PWM相关接口的过程中,了解到PWM接口驱动蜂鸣器可以实现类似音乐播放的效果,个人觉得是个不错的思路,就有了本次的学习开发之旅。

环境准备

1、开发环境、编译环境搭建,参考官方文档,此处不在赘述。参考链接如下:

Window开发环境
Ubuntu编译环境

2、OpenHarmony 2.0 Canary源码 源码获取,参考:

源码获取说明
镜像全量下载

3、LYEVK-3861 IoT物联网开发板套件

LYEVK-3861开发板

开发调试

2.1 相关基础知识介绍

PWM输出方波的IOT接口

鸿蒙系统IoT硬件子系统提供了一些外设相关的接口,目录位于:

base/iot_hardware/peripheral/interfaces/kits

PWM相关接口,接口头文件为iot_pwm.h,其中开始输出方波的接口为:

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

接口参数介绍:

freq:IoTPwmStart接口中freq参数是分频倍数,PWM实际输出的方波频率等于 PWM时钟源频率 除以 分频倍数,即
f = Fcs / freq
其中,Fcs是PWM时钟源频率;
duty:IoTPwmStart接口的duty参数可以控制输出方波的占空比,占空比是指PWM输出的方波波形的高电平时间占整个方波周期的比例,具体占空比值取值为1到99,例如想要输出占空比 50%的方波信号,那么duty填的值就要是50。

音符-频率对应关系

【中软国际】HarmonyOS LYEVK-3861开发板播放《蜜雪冰城》-鸿蒙开发者社区

这个表中有一个规律——音高升高一个八度,频率升高一倍。

hi_u32 hi_pwm_set_clock(hi_pwm_clk_source clk_type);

160M时钟源条件下,输出方波的最低频率是:160M/65535=2441.44…,这个频率略高,在上面的表格中没有找到音名。通过调用hi_pwm_set_clock接口,可以修改时钟源,将时钟源设置为晶体时钟且时钟频率为40MHz,40M/65535= 610.3…,这样就能够输出E5及以上的所有音符。

2.2 曲谱转换

由于个人比较喜欢《蜜雪冰城》,我选择了《蜜雪冰城主题曲》的曲谱作为素材,简谱如下:

【中软国际】HarmonyOS LYEVK-3861开发板播放《蜜雪冰城》-鸿蒙开发者社区

简谱转换

每个音符都需要有节拍,在外面的代码里体现为停顿时间,不同音符的不同停顿时间,可以实现简单的音乐起伏。

常见的节拍简谱对应:

【中软国际】HarmonyOS LYEVK-3861开发板播放《蜜雪冰城》-鸿蒙开发者社区

通过简谱和以上表格的对应,就可以将我们现有的简谱,转换成为可以被程序识别的”程序谱子“。

2.3 编写代码

接口初始化

修改device/hisilicon/hispark_pegasus/sdk_liteos/build/config/usr_config.mk配置文件,打开PWM编译支持,如已打开,可略过:

# CONFIG_UART_DMA_SUPPORT is not set
CONFIG_PWM_SUPPORT=y
# CONFIG_PWM_HOLD_AFTER_REBOOT is not set

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

#ifdef CONFIG_PWM_SUPPORT 
    /* PWM 0/2/3/4/5 配置同理 */
    //hi_io_set_func(HI_IO_NAME_GPIO_8, HI_IO_FUNC_GPIO_8_PWM1_OUT);
    //GPIO引脚复用
    hi_io_set_func(HI_IO_NAME_GPIO_8, HI_IO_FUNC_GPIO_8_GPIO);  //button
    hi_io_set_pull(HI_IO_NAME_GPIO_8, HI_IO_PULL_UP);
    hi_io_set_func(HI_IO_NAME_GPIO_9,HI_IO_FUNC_GPIO_9_PWM0_OUT);// PWM
#endif

备注:2.0把GPIO的引脚复用从应用层移到了板级,对IO的功能做了更加细分的处理,之前一直以为2.0移除了相关的接口实现,最后才发现2.0做了功能上的优化。

实例代码

按键驱动

【中软国际】HarmonyOS LYEVK-3861开发板播放《蜜雪冰城》-鸿蒙开发者社区

说明:按键主要是为了开启音乐的播放。

“程序”曲谱

《蜜雪冰城主题曲》的“程序”曲谱,定义如下:

【中软国际】HarmonyOS LYEVK-3861开发板播放《蜜雪冰城》-鸿蒙开发者社区

以上的曲谱,看起来比较直观,也比较容易理解,其中的一些宏定义定义如下:

【中软国际】HarmonyOS LYEVK-3861开发板播放《蜜雪冰城》-鸿蒙开发者社区
有了以上的枚举,可以自己直接谱曲,甚至不用拘泥于现有的曲子,当然放出来的具体效果如何,就因人而异了。

音符频率

以下是IoTPwmStart接口的入口参数freq的定义,和前述枚举是一一对应的:

音乐处理
/* 音乐处理*/
static void *BeeperMusicTask(const char *arg)
{
    (void)arg;
    int status = 0;
    printf("BeeperMusicTask start!\r\n");

    hi_pwm_set_clock(PWM_CLK_XTAL); // 设置时钟源为晶体时钟(40MHz,默认时钟源160MHz)

    while (1)
    {
        usleep(M_INTERVAL_TIME_US);
        /*第一次点击按键播放,播放完以后按键才能继续生效*/
        if (music == 1)
        {
            for (size_t i = 0; i < sizeof(g_interval) / sizeof(g_interval[0]); i++)
            {  
                uint32 tune = g_interval[i].tuneNotes; // 音符
                uint16 freqDivisor = g_tuneFreqs[tune];
                uint32 tuneInterval = g_interval[i].interval * (TICKS_DELAY); // 音符时间
                IoTPwmStart(IOT_PWM_PORT0, PWM_DUTY, freqDivisor);
                usleep(tuneInterval);
                IoTPwmStop(IOT_PWM_PORT0);
                music = 0;
            }
        }
    }

    return NULL;
}
功能展示

​ 以上都完成之后,就可以编译、烧录,并测试最后的完成效果。

视频演示

​ 说明:

​ 1、本程序需要Hi3861开发板配合交通灯板实现完整的演示

​ 2、烧录完成之后,RESET重启开发板之后,音乐不会播放;

​ 3、重启开发板之后,点击交通灯板开发播放音乐;播放过程中,按键失去效果,待播放完成之后,再次点击按键,音乐继续播放。

作者:张金苑

更多原创内容请关注:中软国际 HarmonyOS 技术学院

入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2021-8-10 15:52:52修改
32
收藏 20
回复
举报
32条回复
按时间正序
/
按时间倒序
mb609898e2cfb86
mb609898e2cfb86

现在我满脑子都是甜蜜蜜了。

1
回复
2021-8-10 15:55:39
Whyalone
Whyalone

有点魔性,哈哈哈

回复
2021-8-10 16:03:48
mb6096018f96945
mb6096018f96945

被成功洗脑

回复
2021-8-10 16:38:11
萨瓦迪迪
萨瓦迪迪

等下就去光顾蜜雪冰城

回复
2021-8-10 16:43:57
林森不知楚
林森不知楚

好棒~~中软开发板挺有意思的嘛

回复
2021-8-10 16:48:55
修身养生
修身养生

优秀

 

回复
2021-8-10 16:51:25
mb6077fa78b1acf
mb6077fa78b1acf

给蜜雪冰城打了一波广告~

回复
2021-8-10 16:52:56
中软产品经理美迪
中软产品经理美迪

甜蜜蜜

回复
2021-8-10 16:54:14
flyzhyg
flyzhyg

满屏的蜜雪冰城,哈哈哈哈

回复
2021-8-10 16:56:31
强哥1999
强哥1999

优秀~~

回复
2021-8-10 16:57:00
wx60b25071502d0
wx60b25071502d0

原来视频链接在B站:https://www.bilibili.com/video/BV1fh411q7N1,找了好一会儿

回复
2021-8-10 16:58:47
深开鸿
深开鸿 回复了 wx60b25071502d0
原来视频链接在B站:https://www.bilibili.com/video/BV1fh411q7N1,找了好一会儿

哈哈哈,帖子最下方有视频链接,已经洗脑了。

1
回复
2021-8-10 17:06:28
黄ZL
黄ZL

这个案例很有意思!点赞

回复
2021-8-10 17:13:31
起个可爱的昵称
起个可爱的昵称

你爱我 我爱你 蜜雪冰城甜蜜蜜~

回复
2021-8-10 17:14:08
wx60114fc31e6c1
wx60114fc31e6c1

有意思

回复
2021-8-10 17:29:44
Anzia
Anzia

这构思就不错hhh

回复
2021-8-11 00:30:14
Der_带鱼
Der_带鱼

你爱我,我爱你,蜜雪冰城甜蜜蜜

回复
2021-8-11 08:57:35
AnBetter2021
AnBetter2021

中软国际开发板棒棒的。

回复
2021-8-11 09:44:24
You森
You森

为啥你的开发板如此优秀!!!

回复
2021-8-11 10:50:49
mb607a431c9c266
mb607a431c9c266

真不错

回复
2021-8-11 14:30:42
回复
    相关推荐