打印
[STM8]

【正点原子K210连载】第七章 蜂鸣器实验-《DNK210使用指南-SDK版》

[复制链接]
31|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
第七章 蜂鸣器实验

本章实验将介绍如何使用SDK编程让Kendryte K210控制板载的蜂鸣器发声。通过本章的学习,读者将学习到用SDK编程技术控制Kendryte K210GPIO输出高低电平。
本章分为如下几个小节:
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.cbeep.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,是因为我们GPIO0GPIO1都被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将固件烧录到开发板中,可以听到板载的蜂鸣器间歇地发声,这与理论推断的结果一致。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

73

帖子

1

粉丝