PWM播放<<铃儿响叮当>>

参考OpenHarmony LYEVK-3861开发板播放《蜜雪冰城》
收到XR806开发板了,之前在公众号看到有人用开发板播放蜜雪冰城,快到圣诞节了,今天试下播放<<铃儿响叮当>>。

环境搭建

  1. WSL2 Ubuntu 20.04 LTS开发环境搭建

感觉和正常的Ubuntu环境配置没啥区别,区别有以下几个

a.在 安装必要的库和工具的时候把libc6-dev-amd64替换为libc6-dev就成,这个方法参考github上边wsl给的遇到E: Unable to locate package libc6-dev-amd64的解决方案

b.我没装LLVM也可以烧录
2. XR806开发板、无源蜂鸣器

开发

曲谱

在这里插入图片描述

流程

在这里插入图片描述

代码编写

cd device/xradio/xr806/ohosdemo
mkdir beeperMusic

目录如下

.
├── BUILD.gn
├── beeperMusic
│   ├── BUILD.gn
│   └── src
│       └── main.c
├── hello_demo
├── iot_peripheral
└── wlan_demo

源代码

//main.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "kernel/os/os.h"
#include "iot_pwm.h"
#include "ohos_init.h"

static OS_Thread_t g_main_thread;
// 音符对应的频率
static const uint16_t g_tuneFreqs[] = {523,587,659,698,784,880,988};

// 曲谱音符
static const uint8_t g_scoreNotes[] = {
  3,3,3, 3,3,3, 3,5,1,2, 3, 4,4,4, 4,4,3,3,
  3,2,2,1, 2,5,
  3,3,3, 3,3,3, 3,5,1,2, 3, 4,4,4, 4,4,3,3,
  5,5,4,2, 1,
};

// 曲谱时值
static const uint8_t g_scoreDurations[] = {
  4,4,8, 4,4,8, 4,4,4,4, 16, 4,4,4, 4,4,4,8,
  4,4,4,4, 8,8,
  4,4,8, 4,4,8, 4,4,4,4, 16, 4,4,4, 4,4,4,8,
  4,4,4,4, 16,
};


static void BeeperMusicTask(const char *arg)
{
    (void)arg;
    printf("BeeperMusicTask start!\r\n");
    IoTPwmInit(0);
    unsigned int pwm_duty_ratio = 30;
    for (size_t i = 0; i < sizeof(g_scoreNotes)/sizeof(g_scoreNotes[0]); i++) {
        unsigned int pwm_delay_cnt = 0;
        uint32_t tune = g_scoreNotes[i]; // 音符
        uint16_t freqDivisor = g_tuneFreqs[tune];
        uint32_t tuneInterval = g_scoreDurations[i] * 10; // 音符时间
        printf("%d %d %d %d\r\n", tune,freqDivisor, pwm_duty_ratio,tuneInterval);
        IoTPwmStart(0,30,freqDivisor);
        OS_MSleep(tuneInterval*5);
        IoTPwmStop(0);
    }
    IoTPwmDeinit(0);
}

void MusicTestMain(void)
{
	printf("Music Test Start\n");  
	if (OS_ThreadCreate(&g_main_thread, "MainThread", BeeperMusicTask, NULL,
			    OS_THREAD_PRIO_APP, 4 * 1024) != OS_OK) {
		printf("[ERR] Create MainThread Failed\n");
	}
}

SYS_RUN(MusicTestMain);

beeperMusic目录的BUILD.gn

import("//device/xradio/xr806/liteos_m/config.gni")

static_library("app_music") {
   configs = []

   sources = [
      "src/main.c",
   ]

   cflags = board_cflags

   include_dirs = board_include_dirs
   include_dirs += [
      "//kernel/liteos_m/kernel/arch/include",
      "include",
      "//base/iot_hardware/peripheral/interfaces/kits",
   ]
}

主目录BUILD.gn

group("ohosdemo") {
    deps = [
        #"hello_demo:app_hello",
        #"iot_peripheral:app_peripheral",
        #"wlan_demo:app_WlanTest",
        "beeperMusic:app_music"
    ]
}

效果

https://www.bilibili.com/video/BV15q4y1m783/?aid=592553918&cid=467526939&page=1

MobaXterm显示问题解决

参考

1 Setting->Configuration->Terminal->Terminal features 取消Paste using right-click

2 终端内右键选择"Change Terminal Settings"

3勾选"Implicit CR in every LF"

缺点是每次关了终端,配置就丢了,要重新配

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐