我想使用一个有源蜂鸣器,这个蜂鸣器是低电平触发的。我使用了一个函数,是像跑马灯一样的函数。在我使用这个有源蜂鸣器的时候,但是我一接上这个io口,它就一直一直就响,无法控制它。
但是我切换到这个LED灯的时候,它也可以一闪一灭。然后我又使用最小的那个f1的那个板子,使用了相同的函数,在这块板子上就可以出现一响一灭的状况。
这是怎么回事啊?
如果想这个蜂鸣器不响,你得将这个引脚输出为高电平;
由于你现在输出了高电平,低电平这样的循环,蜂鸣器也会发出滴滴的声音~
缓冲队列实现代码
typedef struct
{
MsgCell *msgCell;
ht_uint32_t wPos;
ht_uint32_t rPos;
ht_uint32_t Count;
}cmMsg_t;
/**********************************************************************************************************
*
* 函数名:cmMsgCreate
* 功 能:
* 参 数:
* 返回值:
* 版 本:
*
**********************************************************************************************************/
void* cmMsgCreate(ht_uint32_t wantSize)
{
cmMsg_t *prt=NULL;
prt=(cmMsg_t *)cmMalloc(sizeof(cmMsg_t)) ;
prt->msgCell=(MsgCell *)cmMalloc(sizeof(MsgCell)*wantSize) ;
prt->rPos=0;
prt->wPos=0;
prt->Count=wantSize;
return (void*)prt;
}
/**********************************************************************************************************
*
* 函数名:cmMsgWrite
* 功 能:
* 参 数:
* 返回值:
* 版 本:
*
**********************************************************************************************************/
ht_int32_t cmMsgWrite(void * handle,MsgCell msg)
{
ht_uint32_t iPos,i;
cmMsg_t *prt=(cmMsg_t*)handle;
iPos=(prt->wPos+1)%prt->Count;
if(( iPos!=prt->rPos)&&(msg.MsgLen<=256))//最大长度不超过256字节
{
prt->msgCell[prt->wPos].MsgLen=msg.MsgLen;
prt->msgCell[prt->wPos].prtMsg=(ht_uint8_t *)cmMalloc(msg.MsgLen) ;
for(i=0;i<prt->msgCell[prt->wPos].MsgLen;i++)
{
prt->msgCell[prt->wPos].prtMsg[i]=msg.prtMsg[i];
}
prt->wPos=iPos;
return 1;
}
else
{
return 0;
}
}
/**********************************************************************************************************
*
* 函数名:cmMsgRead
* 功 能:
* 参 数:
* 返回值:
* 版 本:
*
**********************************************************************************************************/
ht_int32_t cmMsgRead(void * handle,MsgCell *msg )
{
ht_uint32_t i;
cmMsg_t *prt=(cmMsg_t*)handle;
if( prt->wPos!=prt->rPos)
{
msg->MsgLen=prt->msgCell[prt->rPos].MsgLen;
for(i=0;i<prt->msgCell[prt->rPos].MsgLen;i++)
{
msg->prtMsg[i]=prt->msgCell[prt->rPos].prtMsg[i];
cmFree(prt->msgCell[prt->rPos].prtMsg);
}
prt->rPos=(prt->rPos+1)%prt->Count;
return 1;
}
return 0;
}
可能是您的有源蜂鸣器和STM32芯片之间的接口出现了问题,导致无法控制蜂鸣器的开关状态。这种情况可能与蜂鸣器的工作电压或电流相关。
您可以尝试改变有源蜂鸣器的接口,看看能否解决这个问题。另外,您可以检查一下接口是否接触良好、电路是否正确等问题。如果以上方法都无法解决问题,您可以尝试使用一个示波器来检测电压、电流等信号,以帮助确定问题的根本原因。