构建驱动模块5--STM32 蜂鸣器驱动
一、硬件原理图:
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。主要分为有源和无源,注意,这里的“源”不是指电源,而是指震荡源。有源的蜂鸣器里面带有驱动电路,只要通电就响,而无源蜂鸣器需要特有频率驱动,本程序设计一个最简单的有源蜂鸣器驱动程序。 其硬件连接如下:
二、蜂鸣器驱动程序
1、蜂鸣器设备初始化,本驱动的硬件接口为单总线接口,因为蜂鸣器只需要一个IO口就行了,所以可以通过singbus操作蜂鸣器。
void beephardwareInit(ht_int8_t *name,ht_int16_t devno)
{
char str[64];
beep_dev=(ht_device_t) cmMalloc(sizeof(struct ht_device) );
if(beep_dev==NULL)
{
cmFault(SYS_ERROR_MEMMALLOC_ABNORMAL,RECORD_FLAG);
}
ht_printk("Cfg Beep Dev<%s-%d>\r\n",name,devno);
cmMemset(beep_dev,0,sizeof(struct ht_device));
beep_dev -> open = bspbeepOpen;
beep_dev -> close = bspbeepClose;
beep_dev -> read = NULL;
beep_dev->control = bspbeepdevctl;
beep_dev->help = beephelp;
beep_dev->write = NULL;
beep_dev->user_privatedata = NULL;
beep_dev->del=bspbeepdel;
sprintf(str,"%s-%d",name,devno);
if(SinglehardwareInit("singbus",devno)>0)
{
htDevFsRegister( beep_dev,str);
htDevFsAssociated(beep_dev,"singbus",devno);
}
else
{
cmFree(beep_dev);
}
}
2、实现蜂鸣器操作,主要通过bspbeepdevctl实现,在该函数里调用sigGpio->Single_DATA_OUT(cmd);接口就行了。
/**********************************************************************************************************
*
* 函数名:bspbeepOpen
* 功 能:
* 参 数:
* 返回值:
* 版 本:REV1.0.0
*
**********************************************************************************************************/
ht_inline ht_int32_t bspbeepOpen (ht_device_t dev, ht_uint32_t oflag)
{
sigGpio =(single_driver_t*) dev->ChidNode;
if(sigGpio==NULL)
{
return -1;
}
return HT_EOK;
}
/**********************************************************************************************************
*
* 函数名:bspbeepClose
* 功 能:
* 参 数:
* 返回值:
* 版 本:REV1.0.0
*
**********************************************************************************************************/
ht_inline ht_int32_t bspbeepClose (ht_device_t dev)
{
if(sigGpio!=NULL)sigGpio=NULL;
return HT_EOK;
}
/**********************************************************************************************************
*
* 函数名:bspbeepdevctl
* 功 能:
* 参 数:
* 返回值:
* 版 本:REV1.0.0
*
**********************************************************************************************************/
ht_inline ht_int32_t bspbeepdevctl(ht_device_t dev, ht_uint8_t cmd, void *args)
{
ht_err_t iResult=1;
sigGpio->Single_DATA_OUT(cmd);
return iResult;
}
/**********************************************************************************************************
*
* 函数名:ht_beeptest
* 功 能:
* 参 数:
* 返回值:
* 版 本:REV1.0.0
*beeptest beep
**********************************************************************************************************/
ht_int32_t beephelp (ht_device_t dev, ht_int8_t argc, ht_int8_t * argv[])
{
int arg=0,i;
htDevFsHandle fd;
ht_uint8_t buffer[2];
ht_uint16_t temp;
if(arg<=argc)
{
if (strcmp((char const *) argv[2], "test")==0)
{
ht_printk("devname %s\r\n",argv[1]);
fd=htDevFsOpen( argv[1],0);
if(fd!=NULL)
{
for(i=0;i<8;i++)
{
OSTimeDlyHMSM(0,0,0,100);
htDevFsControl(fd,1,NULL);
ht_printk("BEEP ON\r\n");
OSTimeDlyHMSM(0,0,0,100);
htDevFsControl(fd,0,NULL);
ht_printk("BEEP OFF\r\n");
}
htDevFsClose(fd);
}
else
{
ht_printk("can not find dev\r\n");
}
}
}
}
3、测试结果: