《DNK210使用指南 -SDK版 V1.0》第七章 蜂鸣器实验

第七章 蜂鸣器实验


       本章实验将介绍如何使用SDK编程让Kendryte K210控制板载的蜂鸣器发声。通过本章的学习,读者将学习到用SDK编程技术控制Kendryte K210的GPIO输出高低电平。

       本章分为如下几个小节:

       7.1 GPIO介绍

       7.2 硬件设计

       7.3 程序设计

       7.4 运行验证


        7.1 GPIO介绍

       有关GPIO外设的介绍,请见第6.2小节《GPIO介绍》。


        7.2 硬件设计


       7.2.1 例程功能


       1. 控制板载蜂鸣器间歇发生


       7.2.2 硬件资源


       1. 蜂鸣器 - IO17


       7.2.3 原理图

       本章实验内容,需要控制板载蜂鸣器发声,正点原子DNK210开发板上蜂鸣器的连接原理图,如下图所示:


图7.2.3.1 蜂鸣器连接原理图


       通过以上原理图可以看出,蜂鸣器的发声与否由IO17控制,当IO17输出低电平时,蜂鸣器不发声,当IO17输出高电平时,蜂鸣器发声。


        7.3 程序设计


       7.3.1 蜂鸣器驱动代码

       蜂鸣器驱动源码包括两个文件:beep.c和beep.h,我们先介绍beep.h。

/*****************************HARDWARE-PIN*********************************/
/* 硬件IO口,与原理图对应 */
#define PIN_LED_BEEP          (17)
 
/*****************************SOFTWARE-GPIO********************************/
/* 软件GPIO口,与程序对应 */
#define BEEP_GPIONUM          (2)
 
/*****************************FUNC-GPIO************************************/
/* GPIO口的功能,绑定到硬件IO口 */
#define FUNC_BEEP             (FUNC_GPIO0 + BEEP_GPIONUM)
 
/* IO操作 */
#define BEEP(x)                 do { (x) ?                                     \
                                    gpio_set_pin(BEEP_GPIONUM, GPIO_PV_HIGH):  \
                                    gpio_set_pin(BEEP_GPIONUM, GPIO_PV_LOW);   \
                                } while (0)
 
/* 函数声明 */
void beep_init(void);     /* 初始化蜂鸣器 */

       我们可以看到,这个文件和led.h文件非常相似,宏定义部分我们只是需要修改硬件管脚号和软件编号就能实现不同IO的绑定,我们还需要修改宏定义名字用于区分功能,这里BEEP的软件编号设置为2,是因为我们GPIO0和GPIO1都被LED引脚使用,为防止冲突所以蜂鸣器使用GPIO2,接下来我们看beep.c。

void beep_init(void)
{
    gpio_init();     /* 使能GPIO时钟 */
    
    fpioa_set_function(PIN_LED_BEEP, FUNC_BEEP);
    
    /* 设置蜂鸣器的GPIO模式为输出 */
    gpio_set_drive_mode(BEEP_GPIONUM, GPIO_DM_OUTPUT);
    
    /* 先关闭蜂鸣器 */
    gpio_set_pin(BEEP_GPIONUM, GPIO_PV_LOW);
}

       这里同样只有一个初始化函数,并且和LED的初始化代码基本一样,不同的是初始化最后一步是将管脚电平拉低,是因为我们用的蜂鸣器是高电平发声,低电平不发声。


       7.3.2 main.c代码

       main.c中的代码如下所示:

#include 
#include 
#include 
#include "./BSP/BEEP/beep.h"
#include "gpio.h"
#include "fpioa.h"
 
int main(void)
{
    beep_init();     /* 蜂鸣器初始化 */
 
    while (1)
    {
        BEEP(1);     /* 打开蜂鸣器 */
        msleep(500); /* 延时500毫秒 */
        BEEP(0);     /* 关闭蜂鸣器 */
        msleep(500); /* 延时500毫秒 */
    }
}

       可以看到,首先通过beep_init()为控制蜂鸣器的IO分别分配了GPIO2的功能并设置GPIO模式,然后通过BEEP(x)控制GPIO口输出高低电平,在一个循环中设置这个GPIO依次输出高低电平并延时一段时间,从而应该能听到板载的蜂鸣器间歇地发声。


        7.4 运行验证

       将DNK210开发板连接到电脑主机,通过VSCode将固件烧录到开发板中,可以听到板载的蜂鸣器间歇地发声,这与理论推断的结果一致。


请使用浏览器的分享功能分享到微信等