GD32VW553-IOT-V2驱动无源蜂鸣器播放音乐

分享作者:sandwich21
评测品牌:萤火工场
评测型号:GD32VW553-IOT-V2
发布时间:2026-01-16 09:45:00
1
视频链接
【使用iCEasy商城GD32VW553-IOT-V2驱动无源蜂鸣器播放音乐】 https://www.bilibili.com/video/BV1AerZB6EZd/?share_source=copy_web&vd_source=1b4f7b5c610cf0f17295ce50fa5d6caf
概要
GD32VW553学习心得
开源口碑分享内容

前言

这是我一次在刷B站是看到有博主测评这款开发板,当时我在寻找一款既可以跑WiFi又可以使用BLE的开发板,然后抱着试一试的心态在iCEasy商城申请了这款萤火工场研发的GD32VW553HQM7开发板,没想到小易给我审核通过后很快就发回来了,在此特别感谢小易~😘。我申请的这块板子在9月份进行过一次更新,这次更新小易也是非常的听取创客们的建议,Typec集成了串口调试、BOOT下载升级为了拨码开关并且增加了板载丝印,再也不需要为找IO口烦恼啦~

一、开发板简介

这款开发板是萤火工场基于兆易创新GD32VW553研发的一款开发板,这款芯片是RISC-V内核的32位MCU,内部已经集成了2.4GHz WiFi6和低功耗蓝牙5.2,具体详细系统资源如下:

  1. 片上内存有4MB的FLASH和320KB的SRAM;
  2. 时钟方面有2个16位通用定时器(TIMER15,TIMER16)、2个32位通用定时器(TIMER1,TIMER2)、1个16位高级定时器(TIMER0)、1个16位基础定时器(TIMER5)、1个系统嘀嗒时钟、2个看门狗和1个RTC(掉电走时系统);
  3. 接口电路有1个USART、2个UART、2个I2C、1个SPI、1个QSPI(四路高速SPI)、1个Wi-Fi和1个BLE5.2;
  4. 模数转换方面有1个12位多通道ADC,分别有9个外部通道、一个内部温度传感器、一个内部参考电压;无DAC功能;

为了方便在面包板上开发我附上引脚图如下:

GD32VW553xx有一条AHB时钟线支持最大主频160MHz,两条APB时钟线,APB1支持最大主频80MHz、APB2支持最大主频160MHz。系统整体架构图如下

GD32VW553xx支持六种节能模式,睡眠、深度睡眠、待机、SRAM睡眠、 WIFI睡眠和BLE睡眠模式。这些操作模式可以降低功耗,使应用能够在CPU运行时间、速度和功耗之间达到最佳平衡。

下面是我根据数据手册整理的外设资源表(由于手工制作,若有不对的地方请大家指出🙏

二、开发环境搭建

第一步:可以选择在iCEasy商城中 https://www.iceasy.com/cloud/RISC-V?pid=1907770165638025220 下载如下文件

  • 步骤一:

  • 步骤二

第二步:下载解压文件

  • 解压上图第一个框中的7z压缩包得到GD32 All In One Programmer文件夹找到如下图所示的exe可执行程序

不习惯中文的可以进行汉化哟~

GD32 embedded builder汉化教程可以参考这篇博客: https://blog.csdn.net/qq_45762107/article/details/147348992?spm=1001.2014.3001.5501 。感谢这位博主这么细致的教程😍

给大家一个小Tips:大家可以设置一下代码提示功能的快捷键,在开发的过程中省去了跳转查找参数的苦恼。作为小白的我找了好久才探索到设置方法😭,见下图:

具体设置路径为Window->Preferences->General->Keys中找到Content Assist,默认快捷键为Alt+/。

  • 串口程序下载APP界面以及操作说明(使用串口下载需要将开发板1号拨码开关拨到ON位置),程序下载完成后将拨码开关归位并按下K1按键程序将会运行。(如果前期调试阶段可以勾选Jump to run the App program直接下载完程序会跳转到程序段运行省去来回拨拨码开关

三、第一个工程创建及烧录

该款芯片支持裸机开发和SDK开发。本文演示的为裸机开发工程创建。

  • 第一步

创建一个文件夹作为工作区(记住创建的路径后面会用到)

  • 第二步

在解压好的GC32EmbeddedBuilder文件夹中找到下图中的exe文件双击打开

  • 第三步

选择第一步创建好的文件夹路径填入下图中的红框中,然后点击“启动”。

  • 第四步

开始创建一个基础项目

  • 第五步

根据下图流程创建工程

  • 第六步

为项目起一个名字(避免使用中文),放到第一步创建的文件夹中。因为这款芯片是基于RISC-V架构的,故有如下配置

  • 第七步

根据下图选择芯片以便于生成合适的工程

  • 第八步

等待右下角进度条走完,基础工程已经自动生成好

  • 第九步

关闭欢迎界面,将会出现如下界面,至此,基础的工程已经建立完成。

刚刚生成的工程可以实现的功能如下:

  1. 实现了LED2、LED3电平500ms反转一次。LED2为PA5,LED3为PA6。
  2. 利用按键控制LED1的亮和灭。按键为PA0,LED1为PA4。
  3. 使用串口打印输出一些有关于主频的配置和当前使用的固件库版本。

点击“菜单栏”中的类似于小斧头一样的图表可以进行工程的编译。工程无报错会生成一个bin文件在Debug文件夹中,搭建好电路后使用GD32 All In One Programmer将bin文件烧录到开发板中即可看到现象。(程序烧录参见第二节末尾,这里就不过多赘述了😜

四、OLED显示、DHT11温湿度采集、中断LED灯闪烁和PWM驱动蜂鸣器播放音乐

1.微秒延时函数的实现

在systick.h中增加如下代码

void delay_1us(uint32_t count);


在systick.c中增加如下代码

void delay_1us(uint32_t count)
{
     uint64_t ticks;
     uint64_t told, tnow;
     uint64_t tcnt = 0;
     uint64_t reload = SysTimer_GetCompareValue(); // 获取比较值作为重载值
     /* 获得延时经过的 tick 数 */
     /* 注意:CPUTimer 时钟源是40MHz,是SystemCoreClock的1/4 */
     ticks = (uint64_t)count * ((SystemCoreClock / 4) / 1000000);
     /* 获取当前时间 */
     told = (uint64_t)SysTimer->MTIMER;
     while (1)
     {
         /* 循环获得当前时间,直到达到指定的时间后退出循环 */
         tnow = (uint64_t)SysTimer->MTIMER;
         if (tnow != told)
         {
             if (tnow < told)
             {
                 /* 处理计数器回绕 */
                 tcnt += (reload - told) + tnow;
             }
             else
             {
                 tcnt += tnow - told;
             }
             told = tnow;
             if (tcnt >= ticks)
             {
                 break;
             }
         }
     }
}

将上述代码移植到相应文件中即可实现微妙延时。

2.功能实现

主函数实现蜂鸣器播放音乐、温湿度实时采集和按键按下控制开发板用户小灯亮灭并记录按键按下次数显示在OLED屏幕上。本文按键使用了开发板上K2按键控制开发板上的小灯亮灭,亮灭小灯使用了A1口,OLED的SDA使用A10口,OLED的SCL使用A9口(OLED接线一定要确保稳定连接😉

中断函数中实现了LED小灯5S闪烁一次。小灯闪烁代码如下:

  • main.c文件中代码如下
void led_spark(void)
{
     static __IO uint32_t timingdelaylocal = 0U;
     if(timingdelaylocal) {
         if(timingdelaylocal < 5000U) {
         gd_eval_led_on(LED1);
     } else {
         gd_eval_led_off(LED1);
     }


     timingdelaylocal--;
     } else {
     timingdelaylocal = 10000U;
     }
}


  • gd32vw55x_it.c文件中
void eclic_mtip_handler(void)
{
     ECLIC_ClearPendingIRQ(CLIC_INT_TMR);
     led_spark();
     delay_decrement();
}


按键初始化代码:

  • main.c文件中代码如下
gd_eval_key_init(KEY_TAMPER_WAKEUP, KEY_MODE_GPIO);


  • gd32vw553h_eval.c文件中
void gd_eval_key_init(key_typedef_enum key_num, keymode_typedef_enum key_mode)
{
     /* enable the key clock */
     rcu_periph_clock_enable(KEY_CLK[key_num]);
     rcu_periph_clock_enable(RCU_SYSCFG);


     /* configure button pin as input */
     gpio_mode_set(KEY_PORT[key_num], GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_PIN[key_num]);


     if(key_mode == KEY_MODE_EXTI){
     /* enable and set key EXTI interrupt to the lowest priority */
     eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1);
     eclic_irq_enable(KEY_IRQn[key_num],1, 1);


     /* connect key EXTI line to key GPIO pin */
     syscfg_exti_line_config(KEY_PORT_SOURCE[key_num], KEY_PIN_SOURCE[key_num]);


     /* configure key EXTI line */
     exti_init(KEY_EXTI_LINE[key_num], EXTI_INTERRUPT, EXTI_TRIG_FALLING);
     exti_interrupt_flag_clear(KEY_EXTI_LINE[key_num]);
 }
}


按键检测代码

  • gd32vw553h_eval.c文件中
uint8_t gd_eval_key_state_get(key_typedef_enum button)
{
     uint8_t keynumber = 0;
     if(gpio_input_bit_get(KEY_PORT[button], KEY_PIN[button]) == 0)
     {
         // 按键消抖
         delay_1ms(10);
         while(gpio_input_bit_get(KEY_PORT[button], KEY_PIN[button]) == 0);
         delay_1ms(10);
         keynumber = 1;
     }
     return keynumber;
}



OLED显示代码:

由于代码太多,这里只写出文件位置供使用者参考

  • C文件路径:src/OLED.c;
  • H文件路径:inc/OLED.h;


DHT11温湿度采集代码:

  • C文件路径:src/DHT11.c;
  • H文件路径:inc/DHT11.h;


无源蜂鸣器播放音乐代码:

首先,我们使用无源蜂鸣器播放音乐需要了解一些乐理知识。本文使用PWM输出相应音调的频率模拟乐谱以达到蜂鸣器播放音乐的目的。

  • main.c文件中

音调频率宏定义

#define P0 0 // 休止符频率

#define L1 262 // 低音频率
#define L2 294
#define L3 330
#define L4 349
#define L5 392
#define L6 440
#define L7 494

#define M1 523 // 中音频率
#define M2 587
#define M3 659
#define M4 698
#define M5 784
#define M6 880
#define M7 988

#define H1 1047 // 高音频率
#define H2 1175
#define H3 1319
#define H4 1397
#define H5 1568
#define H6 1760
#define H7 1976


结构体声明,存储了对应的音调和持续周期

typedef struct
{
     uint16_t frequency;
     float period;
} Bate;


《哼着你爱听的歌》乐谱定义

const Bate HengZheNiAiTingDeGe[] = {
 // 空
 {P0, 0.5f}, {M3, 0.5f},
 // 荡的房间里享受着
 {H1, 1}, {P0, 0.5f}, {H1, 0.5f}, {M7, 0.5f}, {M6, 0.25f}, {M5, 0.25f}, {M5, 0.25f}, {M3, 0.25f}, {M3, 0.25f}, {M5, 0.25f},
 // 你送我的孤单,凌
 {M6, 0.5f}, {M5, 0.5f}, {M5, 0.5f}, {M1, 0.25f}, {M2, 0.25f}, {M2, 0.25f}, {M3, 0.75f}, {P0, 0.5f}, {M3, 0.5f},
 // 晨时想起你煎熬着
 {H1, 1}, {P0, 0.5f}, {H1, 0.5f}, {M7, 0.5f}, {M6, 0.25f}, {M5, 0.25f}, {M5, 0.25f}, {M3, 0.25f}, {M3, 0.25f}, {M5, 0.25f},
 // 自己习惯失眠。回
 {M6, 0.5f}, {H1, 0.5f}, {M7, 0.5f}, {M5, 0.25f}, {M7, 0.25f}, {M7, 0.25f}, {M6, 0.75f}, {P0, 0.5f}, {M3, 0.5f},
 // 忆着你关于你是我最
 {H1, 1}, {P0, 0.5f}, {H1, 0.5f}, {M7, 0.5f}, {M6, 0.25f}, {M5, 0.25f}, {M5, 0.25f}, {M3, 0.25f}, {M3, 0.25f}, {M5, 0.25f},
 // 开心的那几年,如
 {M6, 0.5f}, {M5, 0.5f}, {M5, 0.5f}, {M1, 0.25f}, {M2, 0.25f}, {M2, 0.25f}, {M3, 0.75f}, {P0, 0.5f}, {M3, 0.5f},
 // 今再也没有和你在
 {H1, 1}, {P0, 0.5f}, {H2, 0.5f}, {M7, 0.5f}, {M6, 0.25f}, {M5, 0.25f}, {M5, 0.25f}, {M3, 0.25f}, {M3, 0.25f}, {M5, 0.25f},
 // 一起的那种感觉。我们
 {M6, 0.5f}, {H1, 0.25f}, {H1, 0.25f}, {H1, 0.5f}, {M5, 0.25f}, {M5, 0.25f}, {M5, 0.25f}, {M6, 0.75f}, {P0, 0.5f}, {H1, 0.25f}, {H2, 0.25f},
 // 曾小心翼翼的
 {H3, 0.5f}, {H3, 0.25f}, {H3, 0.25f}, {H3, 0.5f}, {H3, 0.25f}, {H1, 0.25f}, {H3, 0.5f},
 // 接近,后来
 {H2, 0.5f}, {P0, 0.5f}, {H1, 0.25f}, {H2, 0.25f},
 // 分开后悄无声息。我们
 {H3, 0.25f}, {H3, 0.5f}, {H4, 0.25f}, {H5, 0.5f}, {H1, 0.25f}, {H1, 0.25f}, {H1, 0.25f}, {M6, 0.75f}, {P0, 0.5f}, {M6, 0.25f}, {M7, 0.25f},
 // 许下的诺言你还记得吗,还是你
 {H1, 0.25f}, {M6, 0.25f}, {H1, 0.25f}, {M6, 0.25f}, {H1, 0.5f}, {H1, 0.25f}, {M6, 0.25f}, {H1, 0.25f}, {M6, 0.25f}, {H1, 0.25f}, {H1, 0.75f},
 // 提都不想提。
 {H3, 0.5f}, {H3, 0.5f}, {H3, 0.25f}, {H2, 0.5f}, {H3, 0.25f},
 // 我的
 {H3, 0.75f}, {P0, 0.25f}, {P0, 0.5f}, {H1, 0.25f}, {H2, 0.25f},
 // 梦里下着昨夜的雨,雨中
 {H3, 0.25f}, {H3, 0.25f}, {H3, 0.25f}, {H3, 0.25f}, {H5, 0.5f}, {H5, 0.5f}, {H1, 0.25f}, {H2, 1}, {P0, 0.5f}, {H1, 0.25f}, {H2, 0.25f},
 // 站着曾经爱过的你,你在
 {H3, 0.25f}, {H3, 0.25f}, {H3, 0.25f}, {H3, 0.25f}, {H5, 0.5f}, {H1, 0.25f}, {H1, 0.25f}, {M6, 1}, {P0, 0.5f}, {M6, 0.25f}, {M7, 0.25f},
 // 我的梦里说了很多
 {H1, 0.25f}, {M6, 0.25f}, {H1, 0.25f}, {M6, 0.25f}, {H1, 0.25f}, {M6, 0.25f}, {H1, 0.25f}, {H1, 0.25f},
 // 我却记不
 {H2, 0.5f}, {H2, 0.5f}, {H2, 0.5f}, {M5, 0.5f},
 // 清。我
 {M6, 1}, {P0, 1}, {P0, 1}, {P0, 0.5f}, {M6, 0.5f},
 // 哼着你爱听的歌,
 {H6, 0.5f}, {H5, 0.25f}, {H5, 0.25f}, {H5, 0.5f}, {H1, 0.25f}, {H1, 0.25f}, {H3, 1}, {H2, 1},
 // 在你的全世界路过,你
 {H5, 0.5f}, {H3, 0.25f}, {H3, 0.25f}, {H2, 0.5f}, {M5, 0.5f}, {H1, 0.5f}, {H1, 0.5f}, {M6, 0.75f}, {M6, 0.25f},
 // 听啊回忆里播放着那首
 {H1, 0.5f}, {M6, 0.5f}, {H1, 0.25f}, {H1, 0.5f}, {M6, 0.25f}, {H2, 0.5f}, {H3, 0.5f}, {H2, 0.5f}, {H1, 0.25f}, {H2, 0.25f},
 // 唱着悲伤的歌。我
 {H3, 0.25f}, {H3, 0.75f}, {H5, 0.5f}, {H3, 0.25f}, {H2, 0.25f}, {H3, 1}, {P0, 0.5f}, {H3, 0.5f},
 // 哼着你爱听的歌,
 {H6, 0.5f}, {H5, 0.25f}, {H5, 0.25f}, {H5, 0.5f}, {H1, 0.25f}, {H1, 0.25f}, {H3, 1}, {H2, 1},
 // 享受着你给我的寂寞,我
 {H5, 0.5f}, {H3, 0.25f}, {H3, 0.25f}, {H3, 0.5f}, {M5, 0.25f}, {M5, 0.25f}, {H1, 0.5f}, {H1, 0.5f}, {M6, 0.75f}, {M6, 0.25f},
 // 看见有关你的一切我的
 {H1, 0.5f}, {M6, 0.5f}, {H1, 0.25f}, {H1, 0.5f}, {M6, 0.25f}, {H2, 0.5f}, {H3, 0.5f}, {H2, 0.5f}, {H1, 0.25f}, {H2, 0.25f},
 // 心,又一
 {H3, 1}, {H3, 1}, {P0, 1}, {P0, 0.5f}, {M5, 0.25f}, {M5, 0.25f},
 // 次堕落。
 {H1, 0.5f}, {H1, 0.5f}, {M6, 1}, {P0, 1}, {P0, 1},


 {P0, 1}, {P0, 1}, {P0, 1}, {P0, 1},


 {P0, 1}, {P0, 1}, {P0, 1}, {P0, 1},


 {P0, 1}, {P0, 1}, {P0, 1}, {P0, 1},
 // 我们
 {P0, 1}, {P0, 1}, {P0, 1}, {P0, 0.5f}, {H1, 0.25f}, {H2, 0.25f},
 // 曾小心翼翼的
 {H3, 0.5f}, {H3, 0.25f}, {H3, 0.25f}, {H3, 0.5f}, {H3, 0.25f}, {H1, 0.25f}, {H3, 0.5f},
 // 接近,后来
 {H2, 0.5f}, {P0, 0.5f}, {H1, 0.25f}, {H2, 0.25f},
 // 分开后悄无声息。我们
 {H3, 0.25f}, {H3, 0.5f}, {H4, 0.25f}, {H5, 0.5f}, {H1, 0.25f}, {H1, 0.25f}, {H1, 0.5f}, {M6, 0.75f}, {P0, 0.5f}, {M6, 0.25f}, {M7, 0.25f},
 // 许下的诺言你还记得吗,还是你
 {H1, 0.25f}, {M6, 0.25f}, {H1, 0.25f}, {M6, 0.25f}, {H1, 0.5f}, {H1, 0.25f}, {M6, 0.25f}, {H1, 0.25f}, {M6, 0.25f}, {H1, 0.25f}, {H1, 0.75f},
 // 提都不想提。
 {H3, 0.5f}, {H3, 0.5f}, {H3, 0.25f}, {H2, 0.5f}, {H3, 0.25f},
 // 我的
 {H3, 0.75f}, {P0, 0.25f}, {P0, 0.5f}, {H1, 0.25f}, {H2, 0.25f},
 // 梦里下着昨夜的雨,雨中
 {H3, 0.25f}, {H3, 0.25f}, {H3, 0.25f}, {H3, 0.5f}, {H5, 0.5f}, {H5, 0.25f}, {H1, 0.25f}, {H2, 1}, {P0, 0.5f}, {H1, 0.25f}, {H2, 0.25f},
 // 站着曾经爱过的你,你在
 {H3, 0.25f}, {H3, 0.25f}, {H3, 0.25f}, {H3, 0.25f}, {H5, 0.5f}, {H1, 0.25f}, {H1, 0.25f}, {M6, 1}, {P0, 0.5f}, {M6, 0.25f}, {M7, 0.25f},
 // 我的梦里说了很多
 {H1, 0.25f}, {M6, 0.25f}, {H1, 0.25f}, {M6, 0.25f}, {H1, 0.25f}, {M6, 0.25f}, {H1, 0.25f}, {H1, 0.25f},
 // 我却记不
 {H2, 0.5f}, {H2, 0.5f}, {H2, 0.5f}, {M5, 0.5f},
 // 清。我
 {M6, 3}, {P0, 1}, {P0, 1}, {P0, 0.5}, {M6, 0.5},
 // 哼着你爱听的歌,
 {H6, 0.5f}, {H5, 0.25f}, {H5, 0.25f}, {H5, 0.5f}, {H1, 0.25f}, {H1, 0.25f},{H3, 1}, {H2, 1},
 // 在你的全世界路过,你
 {H5, 0.5f}, {H3, 0.25f}, {H3, 0.25f}, {H2, 0.5f}, {M5, 0.5f}, {H1, 0.5f}, {H1, 0.5f}, {M6, 0.75f}, {M6, 0.25f},
 // 听啊回忆里播放着那首
 {H1, 0.5f}, {M6, 0.5f}, {H1, 0.25f}, {H1, 0.5f}, {M6, 0.25f}, {H2, 0.5f}, {H3, 0.5f}, {H2, 0.5f}, {H1, 0.25f}, {H2, 0.25f},
 // 唱着悲伤的歌。我
 {H3, 0.25f}, {H3, 0.75f}, {H5, 0.5f}, {H3, 0.25f}, {H2, 0.25f}, {H3, 1}, {P0, 1}, {H3, 0.5f},
 // 哼着你爱听的歌,
 {H6, 0.5f}, {H5, 0.25f}, {H5, 0.25f}, {H5, 0.5f}, {H1, 0.25f}, {H1, 0.25f}, {H3, 1}, {H2, 1},
 // 享受着你给我的寂寞,我
 {H5, 0.5f}, {H3, 0.25f}, {H3, 0.25f}, {H3, 0.5f}, {M5, 0.25f}, {M5, 0.25f}, {H1, 0.5f}, {H1, 0.5f}, {M6, 0.75f}, {M6, 0.25f},
 // 看见有关你的一切我的
 {H1, 0.5f}, {M6, 0.5f}, {H1, 0.25f}, {H1, 0.5f}, {M6, 0.25f}, {H2, 0.5f}, {H3, 0.5f}, {H2, 0.5f}, {H1, 0.25f}, {H2, 0.25f},
 // 心,又一
 {H3, 1}, {H3, 1}, {P0, 1}, {P0, 0.5f}, {M5, 0.25f}, {M5, 0.25f},
 // 次堕落。
 {H1, 0.5f}, {H1, 0.5f}, {M6, 1}, {M6, 1},


 // 我
 {P0, 0.5}, {M6, 0.5},
 // 哼着你爱听的歌,
 {H6, 0.5f}, {H5, 0.25f}, {H5, 0.25f}, {H5, 0.5f}, {H1, 0.25f}, {H1, 0.25f},{H3, 1}, {H2, 1},
 // 在你的全世界路过,你
 {H5, 0.5f}, {H3, 0.25f}, {H3, 0.25f}, {H2, 0.5f}, {M5, 0.5f}, {H1, 0.5f}, {H1, 0.5f}, {M6, 0.75f}, {M6, 0.25f},
 // 听啊回忆里播放着那首
 {H1, 0.5f}, {M6, 0.5f}, {H1, 0.25f}, {H1, 0.5f}, {M6, 0.25f}, {H2, 0.5f}, {H3, 0.5f}, {H2, 0.5f}, {H1, 0.25f}, {H2, 0.25f},
 // 唱着悲伤的歌。我
 {H3, 0.25f}, {H3, 0.75f}, {H5, 0.5f}, {H3, 0.25f}, {H2, 0.25f}, {H3, 1}, {P0, 1}, {H3, 0.5f},
 // 哼着你爱听的歌,
 {H6, 0.5f}, {H5, 0.25f}, {H5, 0.25f}, {H5, 0.5f}, {H1, 0.25f}, {H1, 0.25f}, {H3, 1}, {H2, 1},
 // 享受着你给我的寂寞,我
 {H5, 0.5f}, {H3, 0.25f}, {H3, 0.25f}, {H3, 0.5f}, {M5, 0.25f}, {M5, 0.25f}, {H1, 0.5f}, {H1, 0.5f}, {M6, 0.75f}, {M6, 0.25f},
 // 看见有关你的一切我的
 {H1, 0.5f}, {M6, 0.5f}, {H1, 0.25f}, {H1, 0.5f}, {M6, 0.25f}, {H2, 0.5f}, {H3, 0.5f}, {H2, 0.5f}, {H1, 0.25f}, {H2, 0.25f},
 // 心,又一
 {H3, 1}, {H3, 1}, {P0, 1}, {P0, 0.5f}, {M5, 0.25f}, {M5, 0.25f},
 // 次堕落。
 {H1, 0.5f}, {H1, 0.5f}, {M6, 1}, {P0, 1}, {P0, 1},


 {P0, 1}, {P0, 1}, {P0, 1}, {P0, 1},


 {P0, 1}, {P0, 1}, {P0, 1}, {P0, 1},


 {P0, 1}, {P0, 1}, {P0, 1}, {P0, 1},


 {P0, 1}, {P0, 1}, {P0, 1},


};


主程序运行代码

// TIM1的计数频率(PWM初始化时已经进行过预分频, 故这里频率为1MHz)
uint32_t timFrequency = 1000000;
// 播放状态
uint8_t playState = 0;
// 播放进度
uint32_t playIndex = 0;
// 节拍速度(每分钟多少拍)
uint8_t bpm = 78;
// 每拍的持续时间
float noteDuration = 1000 * 60 / bpm;


// 无源蜂鸣器播放《哼着你爱听的歌》
if(playState)
{
     const Bate bate = HengZheNiAiTingDeGe[playIndex];
     if (bate.frequency == P0) {
         // 休止符
         Set_Pulse(0);
     } else {
         // 将频率转换为计数值, 设置到自动重装载寄存器
         uint32_t arr = timFrequency / bate.frequency;
         timer_autoreload_value_config(TIMER1, arr);
         // 设置占空比为20%
         Set_Pulse(arr/5);// 20%占空比
         // 从0开始计数 重置PWM波形
         timer_counter_value_config(TIMER1, 0);
    }
     // 延时该音符的持续时间 (5ms的空白以区分连续两个相同的音符)
     delay_1ms((uint32_t) (bate.period * noteDuration) - 5);
     Set_Pulse(0);
     delay_1ms(5);


     // 下一个音符
     playIndex++;


     // 播放结束
     if (playIndex >= sizeof(HengZheNiAiTingDeGe)/8){
         playState = 0;
         playIndex = 0;
     }
}else{
     Set_Pulse(0);
}


3.使用说明

上电后先初始化所需要用到的外社,初始化完毕后蜂鸣器提示。屏幕开始显示温湿度数据和按键点击次数,小灯以5s时间进行有规律的闪烁。当点击K2按键时屏幕上次数加一蜂鸣器开始播放音乐且开发板上小灯亮起,在次点击按键蜂鸣器停止播放音乐且开发板上小灯熄灭。(代码放B站视频简介,有需要自取喔~


最后,在此感谢看到本文的各位(准)工程师们,本文有写的不当之处,恳请各位大佬指出🙏,也祝愿大家永远不会被bug所困扰💪~,再次感谢iCEasy商城的样片让我有了这次对GD32VW553HMQ7芯片的学习经历


接下来打算使用sdk进行开发wifi和蓝牙,浅浅展望一波叭~😘

全部评论
暂无评论
0/144