第七章 蜂鸣器实验
本章实验将介绍如何使用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 <stdio.h> #include <unistd.h> #include <sleep.h> #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将固件烧录到开发板中,可以听到板载的蜂鸣器间歇地发声,这与理论推断的结果一致。
|