当前位置: 首页 > 科技观察

在HarmonyOSLYEVK-3861开发板上玩玩《蜜雪冰城》

时间:2023-03-13 20:52:39 科技观察

更多内容请访问:Harmonyos技术社区https://harmonyos.51cto.com与华为官方共同建立在学习LYEVK-3861开发板的过程中,是发现缺少基于鸿蒙2.0的相关文档,缺少基于2.0系统物联网接口的应用实例。在学习PWM相关接口的过程中了解到,通过PWM接口驱动的蜂鸣器可以实现类似音乐播放的效果。我个人认为这是一个好主意,所以我才有了这次学习和发展之旅。环境准备1.搭建开发环境和编译环境。参考官方文档,这里不再赘述。参考链接如下:Window开发环境Ubuntu编译环境2.OpenHarmony2.0Canary源码源码获取,参考:源码获取说明镜像完整下载3.LYEVK-3861物联网开发板套件LYEVK-3861开发板开发与调试2.1相关基础知识介绍PWM输出方波IOT接口Harmony系统IoT硬件子系统提供了一些外设相关接口,目录位于:base/iot_hardware/peripheral/interfaces/kitsPWM相关接口,接口头文件为iot_pwm.hardware。h、开始输出方波接口为:unsignedintIoTPwmStart(unsignedintport,unsignedshortduty,unsignedintfreq);接口参数介绍:freq:IoTPwmStart接口中的freq参数为分频倍数,PWM实际输出的方波频率等于PWM时钟源频率除以分频倍数,即f=Fcs/freq其中,Fcs为PWM时钟源频率;duty:IoTPwmStart接口的duty参数可以控制输出方波的占空比,占空比是指PWM输出的方波波形的高电平时间占整个方波周期的具体占空比取值范围为1~99。比如你要输出一个占空比为50%的方波信号,那么占空比就必须是50。音符-频率对应关系这个表有个规律-音高是提高一个八度,频率增加一倍。hi_u32hi_pwm_set_clock(hi_pwm_clk_sourceclk_type);160M时钟源条件下,输出方波的最小频率为:160M/65535=2441.44...,这个频率略高,音名在上表中没有找到。调用hi_pwm_set_clock接口,可以修改时钟源,设置时钟源为晶振时钟,时钟频率为40MHz,40M/65535=610.3...,这样就可以输出E5及以上的所有音符了。2.2乐谱转换由于我个人比较喜欢《蜜雪冰城》,所以我选择了《蜜雪冰城主题曲》的乐谱作为素材。简谱如下:每个音符在简谱转换中需要一个节拍,在外部代码中体现为停顿时间,不同音符时间的不同停顿,可以实现简单的音乐起伏。常用节拍简谱对应关系:通过简谱与上表的对应关系,可以将我们现有的简谱转换成程序可以识别的“程序简谱”。2.3编写代码接口初始化修改device/hisilicon/hispark_pegasus/sdk_liteos/build/config/usr_config.mk配置文件,开启PWM编译支持,如果已经开启可以跳过:#CONFIG_UART_DMA_SUPPORTisnotsetCONFIG_PWM_SUPPORT=y#CONFIG_PWM_HOLD_AFTER_REBOOThisnotset修改pecon/arkphisilisdk_liteos/app/wifiiot_app/init/app_io_init.c中的如下代码:#ifdefCONFIG_PWM_SUPPORT/*PWM0/2/3/4/5配置相同*///hi_io_set_func(HI_IO_NAME_GPIO_8,HI_IO_FUNC_GPIO_8_PWM1_OUT);/un/GPIO引脚复用hi_io_set_f(HI_IO_NAME_GPIO_8,HI_IO_FUNC_GPIO_8_GPIO);//buttonhi_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将pin复用的pin复用从板级的应用转移到了板级一直以为2.0去掉了相关的接口实现,最后发现2.??0对功能进行了优化。示例代码按键驱动说明:按键主要是启动音乐播放。“程序”评分《蜜雪冰城主题曲》“程序”评分定义如下:上面的评分看起来更直观,更容易理解。一些宏定义如下:有了上面的列举,就可以直接谱曲了,甚至不需要拘泥于已有的歌曲,当然具体效果因人而异。下面是IoTPwmStart接口入口参数freq的定义,对应前面的枚举:MusicProcessing/*MusicProcessing*/staticvoid*BeeperMusicTask(constchar*arg){(void)arg;intstatus=0;printf("BeeperMusicTaskstart!\r\n");hi_pwm_set_clock(PWM_CLK_XTAL);//设置时钟源为晶振(40MHz,默认时钟源为160MHz)while(1){usleep(M_INTERVAL_TIME_US);/*点击按钮第一次播放,播放完按钮会继续生效*/if(music==1){for(size_ti=0;i