0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【HarmonyOS HiSpark Wi-Fi IoT 套件试用连载】播放音乐

开发板试用精选 来源:开发板试用 作者:电子发烧友论坛 2022-10-31 14:41 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文来源电子发烧友社区,作者:华仔stm32, 帖子地址:https://bbs.elecfans.com/jishu_2299368_1_1.html


前面因为北海的疫情,科室抽搞了人员去支援,所单位的事一直在超负荷工作,这一个月都没有时间写文章,现在恢复正常,接上面的继续学习套件的学习,并分享给大家。

前面自己用pwm写过一个可以播放音乐的帖子,是用liteos来写的,这次学习了HarmonyOS来实现这一功能。

1、新建工程,按下图

image.png

image.png

然后点击创建:

image.png

等待下载结束,在弹出的对话框中选择当前窗口:

image.png

2、主要代码分析:

#define IOT_TEST_PWM_GPIO9 9 // 指定蜂鸣器的pwm输出IO
#define IOT_PWM_PORT0 0

#define IOT_IO_NAME_GPIO_8 8    // 按键检测IO
#define PWM_DUTY 50      //占空比
#define M_INTERVAL_TIME_TICK 60  
#define TICKS_DELAY  125*1000

3、频率与音符的对应:

static const uint16 g_tuneFreqs[] = {
    0,        // 40M Hz 对应的分频系数:
    1046 * 4, // 1046.50  1
    1174 * 4, // 1174.66  2
    1318 * 4, // 1318.51  3
    1396 * 4, // 1396.91  4
    1567 * 4, // 1567.99  5
    1760 * 4, // 1760.00  6
    1975 * 4, // 1975.53  7
    523 * 4,  // 523.25   1-  低一个8度的1
    587 * 4,  // 587.33   2-
    659 * 4,  // 659.26   3-   
    698 * 4,   // 698.46  4-
    783 * 4,  // 783.99   5-
    880 * 4,   // 880.00  6-
    987 * 4,  // 987.77   7-    
};

4、定义音符与节拍:

typedef enum
{
    D_DO = 1,  // 1
    D_RE,      // 2
    D_MI,      // 3
    D_FA,      // 4
    D_SO,      // 5
    D_LA,      // 6
    D_SI,      // 7
    C_DO,      // 1- 
    C_RE,      // 2- 
    C_MI,      // 3-
    C_FA,      // 4- 
    C_SO,      // 5- 
    C_LA,      // 6- 
    C_SI       // 7-     
} MusicTuneNotes;

typedef enum
{
    BEAT_1X4B = 1,   //4分之1拍为基础值1
    BEAT_1X2B,
    BEAT_3X4B,
    BEAT_1B,
    BEAT_3X2B = 6,
    BEAT_2B = 8,
    BEAT_3B = 12,
    BEAT_4B = 16
} MusicTuneInterval;

/*音符与时间间隔结构体*/
typedef struct
{
    MusicTuneNotes tuneNotes;       //音符
    MusicTuneInterval interval;     //时间间隔
} MusicNotesInterval;

5、曲谱,数组里面定义了音符与节拍:

*曲谱*/
static const MusicNotesInterval g_interval[] = {
    {D_MI,BEAT_1X2B},{D_SO,BEAT_1X2B},{D_SO,BEAT_3X4B},{D_LA,BEAT_1X4B},{D_SO,BEAT_1X2B},{D_MI,BEAT_1X2B},{D_DO,BEAT_1X2B},
    {D_DO,BEAT_1X4B},{D_RE,BEAT_1X4B},{D_MI,BEAT_1X2B},{D_MI,BEAT_1X2B},{D_RE,BEAT_1X2B},{D_DO,BEAT_1X2B},{D_RE,BEAT_2B},
    {D_MI,BEAT_1X2B},{D_SO,BEAT_1X2B},{D_SO,BEAT_3X4B},{D_LA,BEAT_1X4B},{D_SO,BEAT_1X2B},{D_MI,BEAT_1X2B},{D_DO,BEAT_1X2B},
    {D_DO,BEAT_1X4B},{D_RE,BEAT_1X4B},{D_MI,BEAT_1X2B},{D_MI,BEAT_1X2B},{D_RE,BEAT_1X2B},{D_RE,BEAT_1X2B},{D_DO,BEAT_2B},
    {D_FA,BEAT_1B},{D_FA,BEAT_1B},{D_FA,BEAT_1X2B},{D_LA,BEAT_3X2B},{D_SO,BEAT_1B},{D_SO,BEAT_3X4B},{D_MI,BEAT_1X4B},
    {D_RE,BEAT_2B},{D_MI,BEAT_1X2B},{D_SO,BEAT_1X2B},{D_SO,BEAT_3X4B},{D_LA,BEAT_1X4B},{D_SO,BEAT_1X2B},{D_MI,BEAT_1X2B},
    {D_DO,BEAT_1X2B},{D_DO,BEAT_1X4B},{D_RE,BEAT_1X4B},{D_MI,BEAT_1X2B},{D_MI,BEAT_1X2B},{D_RE,BEAT_1X2B},{D_RE,BEAT_1X2B},
    {D_DO,BEAT_2B}
};

6、按键响应函数,当按键按下后更新标志位music:

/*按键响应函数*/
static void OnButtonPressed(char *arg)
{
    (void)arg;
    IoTGpioUnregisterIsrFunc(IOT_IO_NAME_GPIO_8);

    music = 1;
    printf("
>>>>>>>>>>button is enter >>>.[%d]
", music);

    IoTGpioRegisterIsrFunc(IOT_IO_NAME_GPIO_8, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_FALL_LEVEL_LOW, 
    OnButtonPressed, NULL);
}

7、音乐处理函数:

static void *BeeperMusicTask(const char *arg)
{
    (void)arg;
    
    printf("BeeperMusicTask start!
");

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

    while (1)
    {
        osDelay(M_INTERVAL_TIME_TICK);
        /*第一次点击按键播放,播放完以后按键才能继续生效*/
        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;
}

8、创建音乐播放任务:

static void BeepMusicEntry(void)
{
    osThreadAttr_t attr;
    /* 初始化按键 */
    IoTGpioInit(IOT_IO_NAME_GPIO_8);   //button
    IoTGpioSetDir(IOT_IO_NAME_GPIO_8, IOT_GPIO_DIR_IN);
    /* 注册按键中断回调 */
    IoTGpioRegisterIsrFunc(IOT_IO_NAME_GPIO_8, IOT_INT_TYPE_EDGE, IOT_GPIO_EDGE_FALL_LEVEL_LOW, OnButtonPressed, NULL);
    /* 初始化蜂鸣器输出IO */
    IoTGpioInit(IOT_TEST_PWM_GPIO9);      //BWM
    IoTGpioSetDir(IOT_TEST_PWM_GPIO9, IOT_GPIO_DIR_OUT);
    IoTPwmInit(IOT_PWM_PORT0);

    IoTWatchDogDisable();

    attr.name = "BeeperMusicTask";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 1024;
    attr.priority = osPriorityNormal;

    if (osThreadNew((osThreadFunc_t)BeeperMusicTask, NULL, &attr) == NULL)
    {
        printf("[BeeperMusicTask] Falied to create BeepTask!
");
    }
}

9、开机创建启动:APP_FEATURE_INIT(BeepMusicEntry);

【设置编译选项】

1、在applications/sample/wifi-iot/app/demo_beep下的BUILD.gn创建jison:

static_library("demo_beep") {
    sources = [
        "beep_music_demo.c"
    ]

    include_dirs = [
        "//utils/native/lite/include",
        "//kernel/liteos_m/components/cmsis/2.0",
        "//base/iot_hardware/peripheral/interfaces/kits",
    ]
}

2、在applications/sample/wifi-iot/app下面创建BUILD.gn:

import("//build/lite/config/component/lite_component.gni")

lite_component("app") {
    features = [
        "demo_beep",
    ]
    deps = []
}

【编译】:

image.png

到这一步就显示编译成功了:

image.png

【拷贝文件到HiBurn目录下面】输出的文件在/home/hihope/Documents/DevEco/Projects/lyevk_hm_beep/out/hispark_pegasus/wifiiot_hispark_pegasus目录下面:

1660288320029.png

将Hi3861_wifiiot_app_allinone.bin复制到win下面。然后烧录到开发板就OK了。

image.png

重启开发板,按下按键,就可以播放音乐了。

image.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • wi-fi
    +关注

    关注

    15

    文章

    2460

    浏览量

    129997
  • HarmonyOS
    +关注

    关注

    80

    文章

    2157

    浏览量

    36280
  • HiSpark
    +关注

    关注

    1

    文章

    156

    浏览量

    7798
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    物联网浪潮下,如何精准选型Wi-Fi模块?

    在物联网迅猛发展、Wi-Fi技术日益成熟的当下,众多场景尤其是移动设备领域,对 Wi-Fi 无线数据传输的需求与日俱增。那么,在众多设备中究竟该如何挑选合适的 Wi-Fi模块 呢?接下来为您详细介绍
    的头像 发表于 03-02 15:37 272次阅读
    物联网浪潮下,如何精准选型<b class='flag-5'>Wi-Fi</b>模块?

    技术资讯 I Wi-Fi 模块设计

    本文要点Wi-Fi模块设计旨在打造一套紧凑且高效的硬件和软件解决方案,使设备能够通过Wi-Fi网络实现通信。Wi-Fi模块设计是一个复杂的过程,要求研发人员兼具硬件与软件工程方面的专业知识
    的头像 发表于 02-27 17:12 850次阅读
    技术资讯 I <b class='flag-5'>Wi-Fi</b> 模块设计

    Wi-Fi:无线连接的全球通用语

    一、什么是Wi-FiWi-FiWi-Fi联盟制造商的商标认证,是基于IEEE 802.11标准的无线局域网技术。它允许电子设备在特定范围内无线接入网络,实现高速数据交换与互联网访问,已成为
    发表于 01-07 09:49

    Nordic发布nRF7002 EBII 开发板, 支持Wi-Fi 6, 解锁nRF54L新玩法

    Wi-Fi 6 功能,帮助开发人员创建高性能、高能效的Wi-Fi 6 物联网解决方案。 基于 Nordic 的 nRF7002 Wi-Fi 协同 IC,nRF7002 EBII帮助 采用
    发表于 12-10 11:58

    Wi-Fi模块选型指南 | 低功耗蓝牙/Wi-Fi 6模块推荐 | 物联网设备集成攻略

    物联网的快速发展,Wi-Fi技术的成熟的情况下,越来越多的场景需要用到Wi-Fi来无线传输数据,尤其是移动设备中,怎么再设备中选择合适的Wi-Fi模块呢?下面我们来介绍下Wi-Fi模块
    的头像 发表于 12-09 11:27 1308次阅读
    <b class='flag-5'>Wi-Fi</b>模块选型指南 | 低功耗蓝牙/<b class='flag-5'>Wi-Fi</b> 6模块推荐 | 物联网设备集成攻略

    浅谈Wi-Fi 6E与Wi-Fi 7的关键器件——BAW滤波器新技术

    作者: Qorvo 亚太区无线连接事业部高级行销经理林健富   2020年1月,Wi-Fi联盟正式宣布开放6GHz频段(5925MHz-7125MHz),并将其命名为Wi-Fi 6E。2020年4月
    发表于 09-19 18:29 2445次阅读
    浅谈<b class='flag-5'>Wi-Fi</b> 6E与<b class='flag-5'>Wi-Fi</b> 7的关键器件——BAW滤波器新技术

    如何更新 NuMaker IoT 板上的 Wi-Fi 模块固件?

    更新 NuMaker IoT 板上的 Wi-Fi 模块固件
    发表于 09-04 08:28

    基于 SSID 的 Wi-Fi 定位:与其他定位服务的性能比较

    随着 nRF7000 Wi-Fi 协同 IC 的推出,我们现在可以提供具有 Wi-Fi、蜂窝物联网和 GNSS 功能的完整硅到云定位解决方案。nRF7000 针对 Wi-Fi 网络扫描进行了优化
    发表于 08-31 21:01

    LitePoint Wi-Fi测试软件减轻客户设计负担

    Wi-Fi 7于一年多前获得Wi-Fi联盟认证以来,作为最新一代通信技术,Wi-Fi正逐步成为用户实现无所不在无线连接的新选择。随着每一代Wi-Fi信号复杂性的提升,建议将硬件测试纳
    的头像 发表于 08-06 15:34 1373次阅读
    LitePoint <b class='flag-5'>Wi-Fi</b>测试软件减轻客户设计负担

    Texas Instruments CC335x SimpleLink™双频Wi-Fi® 6配套IC数据手册

    RTOS主机的成本敏感型嵌入式应用。Texas Instruments CC335x为物联网 (IoT) 的嵌入式设备应用带来了Wi-Fi 6的高效性能,并具有较小的PCB占用面积和高度优化的物料清单
    的头像 发表于 07-23 11:37 1629次阅读
    Texas Instruments CC335x SimpleLink™双频<b class='flag-5'>Wi-Fi</b>® 6配套IC数据手册

    有没有什么修复方法可以确保 AP 模式下的 Wi-Fi 和 BLE 连接同时正常工作?

    我正在使用 CYBSYSKIT DEV 01 套件。我尝试在 AP 模式下打开 Wi-Fi 并宣传 BLE。我可以宣传 SoftAP 和 BLE。但是,我无法从中央设备连接到 BLE。它可以立即连接并断开连接。有没有什么修复方法可以确保 AP 模式下的
    发表于 07-17 06:13

    如何选择合适的芯科科技Wi-Fi开发板

    您正在寻找适用于超低功耗物联网应用项目的Wi-Fi 开发板吗?本文将介绍Silicon Labs(芯科科技)推出的所有SiWx917 Wi-Fi 6和低功耗蓝牙5.4解决方案的Wi-Fi 开发板。SiWx917是目前市场上最节能
    的头像 发表于 07-09 09:15 2914次阅读

    科普|公司的Wi-Fi,为什么这么慢?

    大家在公司上班,经常会使用到Wi-Fi。最近这几年,随着时代的发展,高清视频会议等大带宽网络应用越来越普遍。而公司的网络,却非常不给力,频繁卡顿,严重影响使用体验。哪怕IT的同事已经把网络优化得很
    的头像 发表于 06-20 06:06 1790次阅读
    科普|公司的<b class='flag-5'>Wi-Fi</b>,为什么这么慢?

    Wi-Fi 8:开启极高可靠性 (UHR) 连接的新纪元——1

    英国作家狄更斯在《双城记》的开头写道:“这是最好的时代,也是最坏的时代。” 这句话若套用在现今Wi-Fi 的市场现状,何尝不是惊人的相似? 怎么说呢?Wi-Fi 从被发明至今已经经过了20多年的迭代
    发表于 06-13 11:09

    Wi-Fi HaLow如何突破传统Wi-Fi性能瓶颈?

    视频推荐在万物互联的时代,传统Wi-Fi在覆盖范围、功耗、连接数上渐显不足。而Wi-FiHaLow的诞生,正在用黑科技打破传统Wi-Fi的性能瓶颈!今天,我们一起来探究Wi-FiHaL
    的头像 发表于 04-22 11:38 1402次阅读
    <b class='flag-5'>Wi-Fi</b> HaLow如何突破传统<b class='flag-5'>Wi-Fi</b>性能瓶颈?