stm32f407驱动有源蜂鸣器(低电平触发)

我想使用一个有源蜂鸣器,这个蜂鸣器是低电平触发的。我使用了一个函数,是像跑马灯一样的函数。在我使用这个有源蜂鸣器的时候,但是我一接上这个io口,它就一直一直就响,无法控制它。
但是我切换到这个LED灯的时候,它也可以一闪一灭。然后我又使用最小的那个f1的那个板子,使用了相同的函数,在这块板子上就可以出现一响一灭的状况。
这是怎么回事啊?

如果想这个蜂鸣器不响,你得将这个引脚输出为高电平;
由于你现在输出了高电平,低电平这样的循环,蜂鸣器也会发出滴滴的声音~

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7516531
  • 你也可以参考下这篇文章:STM32F40实现 按键密码锁、按键控制LED 、串口选择菜单 、串口控制LED开关 、串口控制蜂鸣器开关及响度 、串口控制蜂鸣器播放音乐 、按键控制LED的亮度
  • 除此之外, 这篇博客: 构建驱动模块6--STM32 缓冲队列中的      缓冲区常常用于临时保存数据,特别是在通讯过程中,先把数据接收下后,后期等待任务空闲在进行处理,这样避免接收数据中处理数据而造成数据丢失。缓冲队列里经常使用为环形缓冲队列,环形队列是一个头尾相接的队列,一般定义当入队操作为缓冲写操作,而出队则定义为缓冲读。当一个数据或者一组消息来到时,进行入队操作;当需要解析消息时才有出队操作。针对该思想编写一个最简单缓冲队列模块。其代码如下: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 缓冲队列实现代码

    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芯片之间的接口出现了问题,导致无法控制蜂鸣器的开关状态。这种情况可能与蜂鸣器的工作电压或电流相关。

您可以尝试改变有源蜂鸣器的接口,看看能否解决这个问题。另外,您可以检查一下接口是否接触良好、电路是否正确等问题。如果以上方法都无法解决问题,您可以尝试使用一个示波器来检测电压、电流等信号,以帮助确定问题的根本原因。