蜂鸣器设备
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。
蜂鸣器IO配置
该蜂鸣器接在PB5引脚上,为无源蜂鸣器,需高低变化电平控制发声。
蜂鸣器设备配置
如同前面数码管设备一样,也要完成三件事。
首先,在对应bsp的“\board\ports”目录下创建“drv_beep.c”和“drv_beep.h”文件。
然后,在“Kconfig”文件中添加以下配置项
config BSP_USING_BEEP
bool "Enable BEEP"
select BSP_USING_GPIO
default n
最后,在“SConscript”文件中添加文件依赖
if GetDepend(['BSP_USING_BEEP']):
src += Glob('ports/drv_beep.c')
打开图形化配置工具,进入到以下目录
Hardware Drivers Config
—> Onboard Peripheral Drivers
选中刚才新增“Enable BEEP”项,保存配置,退出,重新生成工程。
蜂鸣器驱动编写
如同数码管驱动,在头文件添加相应头文件,定义蜂鸣器设备结构体。
#include "rtdevice.h"
#include <drv_common.h>
struct drv_beep_device
{
struct rt_device parent;
};
在源文件中,同样先完成最基本的事情
#include <rtthread.h>
#include "drv_gpio.h"
#include "drv_beep.h"
#define DBG_TAG "drv.beep"
#include <drv_log.h>
static struct drv_beep_device _beep;
在函数操作集中就不一样了,不同于数码管直接控制显示,有源蜂鸣器需要有电平的交替变换,而这个交替变换需要驱动程序内部完成,不应在应用程序才来控制其交替变换。所以在驱动程序中就可以通过线程或者定时器来变换蜂鸣器引脚的电平,单纯只是控制引脚的电平转换,没必要用线程来控制(开销太大了),用定时器就足够了。
所以,函数操作集,还需要实现打开和关闭函数,在打开函数里面开启定时器,定时转换电平状态,在关闭函数里面停止定时器,在初始化函数里面创建定时器。
新定义结构体来表示蜂鸣器状态
struct beep_state
{
uint8_t on; /* 开关状态 */
uint16_t hz; /* 转换频率 */
int32_t time; /* 持续时间ms,-1为一直响 */
};
在写操作函数里面,写入该结构体变量,控制定时器定时周期。
在定时超时函数里面,根据蜂鸣器状态,决定是否关闭定时器和电平转换。
文件链接
结尾
rtthread学习中,打开主页查看更多笔记