STM32F4库函数蜂鸣器实验

#include "sys.h"

#include "delay.h"

#include "usart.h"

#include "led.h"

#include "beep.h"

 

int main(void)

{

                  delay_init(168);                             //初始化延时函数

                  LED_Init();                                     //初始化LED端口

                  BEEP_Init();                                  //初始化蜂鸣器端口

                 while(1)

               {

                      GPIO_ResetBits(GPIOF,GPIO_Pin_9);             //DS0拉低,亮    等同于LED0=0;

                      GPIO_ResetBits(GPIOF,GPIO_Pin_8);             //BEEP引脚拉低, 等同于 BEEP= 0;

                      delay_ms(300);                                                     //延时300ms

                      GPIO_SetBits(GPIOF,GPIO_Pin_9);                 //DS0拉高,灭     等同于LED0=1;

                      GPIO_SetBits(GPIOF,GPIO_Pin_8);                 //BEEP引脚拉高,  等同于BEEP =1;

                      delay_ms(300);

                }

}

现在我们打开库函数版本的说明书

此程序控制的蜂鸣器是电磁式的有源蜂鸣器

这里的有源不是指电源的“源”,而是指有没有自带震荡电路,有源蜂鸣器自带了震荡电路,
一通电就会发声;无源蜂鸣器则没有自带震荡电路,必须外部提供 2~5Khz 左右的方波驱动,
才能发声

这个非常简单,我们看一下初始化函数配置的东西,再复习一遍。

//初始化延迟函数

void delay_init(u8 SYSCLK)

{

              SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);

              fac_us = SYSCLK/8;                              //延时微秒

              fac_ms=(u16)fac_us*1000;                  //延时毫秒

 

}

我们看一下SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8)这个函数

/**
  * @brief  Configures the SysTick clock source.
  * @param  SysTick_CLKSource: specifies the SysTick clock source.
  *   This parameter can be one of the following values:
  *     @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source.
  *     @arg SysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source.
  * @retval None
  */
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
  /* Check the parameters */
  assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
  if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
  {
    SysTick->CTRL |= SysTick_CLKSource_HCLK;
  }
  else
  {
    SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
  }
}

还是一样。我接着看LED_Init()里面

void LED_Init(void)

{

          GPIO_InitTypeDef   GPIO_InitStructure;

          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);   //使能GPIOF时钟

 //GPIOF9,F10初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉

GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化

 

GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10);   //设置GPIOF9,10高,灯灭

}

紧接着我看下BEEP_Init()

void BEEP_Init(void)

{

      GPIO_InitTypeDef     GPIO_InitStructure;

      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//使能GPIOF时钟

      //初始化蜂鸣器对应引脚GPIOF8

      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式

      GPIO_InitSturcture.GPIO_OType = GPIO_OType_PP;//推挽输出

      GPIO_InitSturcture.GPIO_Speed = GPIO_Speed_100MHz;//100MHz

      GPIO_InitSturcture.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉

      GPIO_Init(GPIOF,&GPIO_InitStructure);//初始化GPIO

      GPIO_ResetBits(GPIOF,GPIO_Pin_8);     //蜂鸣器对应引脚GPIOF8拉低

}

我们最后打开delay_ms()函数

//延时nms 0~65535

void delay_ms(u16 nms)

{

     u8 repeat = nms/540;                        //这里用540,是考虑某些用户可能超频使用  比如超频到248M的时候,delay_xms 最大只能延时541ms左右了

u16 remain  = nms%540;

while(repeat)

{

    delay_xms(540);

     repeat--;

}

if(remain)delay_xms(remain);

}

我们再打开delay_xms()函数看看

//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对168M条件下,nms<=798ms 
void delay_xms(u16 nms)
{                     
    u32 temp;           
    SysTick->LOAD=(u32)nms*fac_ms;            //时间加载(SysTick->LOAD为24bit)
    SysTick->VAL =0x00;                       //清空计数器
    SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数 
    do
    {
        temp=SysTick->CTRL;
    }while((temp&0x01)&&!(temp&(1<<16)));    //等待时间到达   
    SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器
    SysTick->VAL =0X00;                       //清空计数器              

 

 

你可能感兴趣的:(STM32F4库函数蜂鸣器实验)