使用STM32控制蜂鸣器实现1秒响1秒闭间隔发声

STM32控制蜂鸣器间断时间响

  • 一.蜂鸣器介绍
  • 二 代码讲解
  • 2.1 初始化蜂鸣器引脚
  • 2.2 配置中断优先级和定时器
  • 2.3 中断处理
  • 2.4 main 函数
  • 三.结语
  • 一.蜂鸣器介绍

    我现在这个蜂鸣器是有缘蜂鸣器,只能发出一种声音。而且是低电平触发(根据你们自己的蜂鸣器决定),现在我要做的一个实验就是蜂鸣器响1s,关闭1s。实现间隔的发出声音。

    二 代码讲解

    这里我使用的是定时器6进行计时。

    2.1 初始化蜂鸣器引脚

    我这边蜂鸣器对应的引脚是GPIOA_Pin_8

    void Buzzer_GPIO_Configuration(void)
    { 
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
      GPIO_InitTypeDef GPIO_InitStructure;
      GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
    }
    

    2.2 配置中断优先级和定时器

    static void TIME6_NVIC_Configuration(void)
    {
    	NVIC_InitTypeDef NVIC_InitStructure;
    	
    	NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3 ;
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    	NVIC_Init(&NVIC_InitStructure);
    	
    }
    
    static void TIME6_cfg(void)
    {
    	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    
    	//允许TIM6的时钟
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
    
    	//初始化Timer
    	TIM_DeInit(TIM6);
    
    	//采用内部时钟给TIM2提供时钟源
    	//TIM_InternalClockConfig(TIM6);
    
    	//预分频系数为71,这样计数器时钟为72MHz/72= 1us
    	TIM_TimeBaseStructure.TIM_Prescaler = 72 -1;
    
    	//设置时钟分割
    	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    
    	//设置计数器模式为向上计数模式
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    
    	//设置计数溢出大小,每计1000个数就产生一个更新事件  1ms
    	TIM_TimeBaseStructure.TIM_Period = 1000-1;//
    	//将配置应用到TIM6中
    	TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure);
    	
    	//清除溢出中断标志
    	TIM_ClearFlag(TIM6, TIM_FLAG_Update);
    
    	//禁止ARR预装载缓冲器
    	TIM_ARRPreloadConfig(TIM6, ENABLE);
    
    	//开启TIM6的中断
    	TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);
    
    }
    

    2.3 中断处理

    void TIM6_IRQHandler(void)
    {
    	
    	static int data=0;
       //检测是否发生溢出更新事件
       if(TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)
       {        
         
    		 //清除TIM6的中断待处理位
    		 TIM_ClearITPendingBit(TIM6 , TIM_FLAG_Update);
             data++;
           	if(data>=2000)
    			{
    				data=0;
    			}
           if(data<=1000)
           {
    		GPIO_ResetBits(GPIOA ,GPIO_Pin_8);
             
           }
           
           else 
           {
               GPIO_SetBits(GPIOA ,GPIO_Pin_8);
              
           }
    				
    		   
         }
    }
    

    2.4 main 函数

    void main()
    {
    TIME6_NVIC_Configuration();
    //引脚初始化
    Buzzer_GPIO_Configuration();
    TIME6_cfg();	
    //开启定时6
    TIM_Cmd(TIM6,ENABLE);
    while(1);
    }
    

    三.结语

    代码也不算多,到这里就结束了,如果你想修改间隔值,就直接修改中断里面data的值就可以了。这个代码只是一个demo。最后谢谢大家阅读。

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用STM32控制蜂鸣器实现1秒响1秒闭间隔发声

    发表评论