STM8S BEEP蜂鸣器输出2.7KHz 
 
我用的是2.7KHz的无源贴片蜂鸣器.STM8S103K3.  
 
标准模式下只能输出1,2,4KHz的频率.修改输出2KHz为2.7KHz.主要修改校准输入参数. 
 
编译器:IAR for STM8 1.10.4 
/* Fhsi = 16MHz/4 = 4MHz 
   Fcpu = 4MHz/1 = 4MHz */ 
    
#include "stm8s.h"  
#include "stm8s_beep.h"  
#include "stm8s_flash.h" 
 
#define BEEP_PORT GPIOD 
#define BEEP_PIN GPIO_PIN_4 
 
//注意,使用本程序前需要使用  
//st visual programmer 把 Option Bytes 里   
//AFR7改为"Port D4 Alternate Function = Beep"  ,否则没有声音  
//由于新增了在程序里修改AFR7改为"Port D4 Alternate Function = Beep"  ,则可以不必用stvp修改了  
 
//北京微芯力科三合一开发套件,内部时钟,没有精确测试,仅凭感觉 
/*void  delay(unsigned int Xms)  
{  
    unsigned int i ;  
    while (Xms--)  
    {     
        i = 120;  
        while(i--);  
    }  
} */ 
//Fcpu = 4MHz/1 = 4MHz 
/*延时子程序*/ 
void delay_ms(u16 time) 
{ 
u16 i; 
for(;time>0;time--) 
  for(i=0;i<670;i++); //241 
} 
/*******************************************************************************   
*                         ==FLASH初始化函数==   
* FLASH_DeInit();                                           --> 复位FLASH的寄存器值   
* FLASH_Unlock(FLASH_MEMTYPE_DATA);                         --> 解锁 对 Data FLASHmemory 进行操作   
* FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD);     --> 标准编程时间   
*******************************************************************************/   
void FLASH_INIT(void)   
{   
    FLASH_DeInit();   
    FLASH_Unlock(FLASH_MEMTYPE_DATA);   
    FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD);   
}   
 
/* 本子函数修改为内部时钟 
Fhsi = 16MHz/4 = 4MHz 
Fcpu = 4MHz/1 = 4MHz */ 
void CLK_INIT(void)                  
{  
  CLK_DeInit();  
  //CLK_HSECmd(ENABLE);  
  /* Enables the Internal High Speed oscillator (HSI). */ 
  CLK_HSICmd(ENABLE); 
  /* Configure the HSI prescaler to 4 . Fhsi = 16MHz/4 = 4MHz */   
  /* Configure the Fcpu to DIV1 . Fcpu = 4MHz/1 = 4MHz */ 
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV4); 
     
  /* Enables the Clock Security(安全) System. */ 
  CLK_ClockSecuritySystemEnable(); 
}  
 
void GPIO_INIT(void)  
{  
    GPIO_DeInit(GPIOA);  
    GPIO_DeInit(GPIOB);  
    GPIO_DeInit(GPIOC);  
    GPIO_DeInit(GPIOD);  
    GPIO_DeInit(GPIOE);  
 
}  
 
void main ( void )  
{       
 
    CLK_INIT();//设置外部时钟  
    GPIO_INIT();//初始化IO  
 
    FLASH_INIT();//初始化FLASH  
 
    //PD4第二功能脚不是beep功能,就强制写成beep  
    if(FLASH_ReadOptionByte(0x4803) != 0x807F)  
    {  
        FLASH_ProgramOptionByte(0x4803,0x80);//将PD4的第二功能脚写成beep  
        WWDG->CR = 0x80;//复位stm8  
    }  
 
    //BEEP_LSICalibrationConfig(128000); 
    BEEP_LSICalibrationConfig(95000);    //此处修改输入参数************************************************** 
    BEEP_Init(BEEP_FREQUENCY_2KHZ);  
    BEEP_Cmd(ENABLE);    
 
    while(1)  
    {  
        //delay(1000); 
        delay_ms(500); 
        BEEP_Cmd(ENABLE);  
        //delay(1000); 
        delay_ms(500); 
        BEEP_Cmd(DISABLE);  
    }   
}  
 
 
 
 
参考: 
stm8蜂鸣器(beep)发声实验,程序里修改OptionByte位,软件复位 
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4183993&bbs_id=9999 
 |