STM8S系列基于IAR开发:蜂鸣器(BEEP)驱动功能模块示例

STM8S系列基于IAR开发:蜂鸣器(BEEP)驱动功能模块示例


  • ✨基于IAR寄存器操作方式。

🔖本示例基于STM8S903K3T6单片机。蜂鸣器(BEEP)驱动映射引脚是PD4.

在这里插入图片描述

蜂鸣器功能模块介绍

在这里插入图片描述

功能描述

在这里插入图片描述

蜂鸣器 控制/状态 寄存器 (BEEP_CSR)

在这里插入图片描述

  • BEEP寄存器表和复位值
    在这里插入图片描述
  • 📓deep.c
/*************************************

 * 文件名  :beep.c
 * 描述    :BEEP配置函数库     
 * 实验平台: STM8S

*************************************/
#include "beep.h"
#include "uart.h"

static void Set_Beep_OptionByte(void);
static uint16_t FLASH_ReadOptionByte(uint16_t Address);
static void FLASH_ProgramOptionByte(uint16_t Address, uint8_t Data);
static void FLASH_WaitForLastOperation(void);
static void CLK_LSI_Enable_conf(void);
static void BEEP_LSICalibrationConfig(uint32_t LSIFreqHz);
static void Set_Beep_Frequency(uint8_t BEEP_Frequency);
static void BEEP_Enable_conf(void);

/**************************************************************************
 * 函数名: Beep_conf
 * 描述  : Beep配置函数
 * 输入  :无
 * 输出  :无
 * 返回  :无 
 * 调用  :外部调用 
 *************************************************************************/
void Beep_conf(void)
{
  Set_Beep_OptionByte();
  CLK_LSI_Enable_conf();
  BEEP_LSICalibrationConfig(LSI_128kHz);
  Set_Beep_Frequency(BEEP_FREQUENCY_1KHZ);
  BEEP_Enable_conf();
}
/**************************************************************************
 * 函数名: BEEP_Enable_conf
 * 描述  : Beep使能函数
 * 输入  :无
 * 输出  :无
 * 返回  :无 
 * 调用  :内部调用 供Beep配置函数调用
 *************************************************************************/
static void BEEP_Enable_conf(void)
{
   /* Enable the BEEP peripheral */
  BEEP_CSR |= MASK_BEEP_CSR_BEEPEN;
}
/**************************************************************************
 * 函数名:Set_Beep_Frequency
 * 描述  :设置Beep输出频率函数
 * 输入  :uint8_t BEEP_Frequency
 * 输出  :无
 * 返回  :无 
 * 调用  :内部调用 供Beep配置函数调用
 *************************************************************************/
static void Set_Beep_Frequency(uint8_t BEEP_Frequency)
{
    /* Select the output frequency */
    BEEP_CSR &= (uint8_t)(~MASK_BEEP_CSR_BEEPSEL);
    BEEP_CSR |= (uint8_t)(BEEP_Frequency);
}
/**************************************************************************
 * 函数名:BEEP_LSICalibrationConfig
 * 描述  :校正LSI时钟
 * 输入  :uint32_t LSIFreqHz
 *
 * 输出  :无
 * 返回  :无 
 * 调用  :内部调用 供Beep配置函数调用
 *************************************************************************/
static void BEEP_LSICalibrationConfig(uint32_t LSIFreqHz)
{
    uint16_t lsifreqkhz;
    uint16_t A;
    lsifreqkhz = (uint16_t)(LSIFreqHz / 1000); /* Converts value in kHz */

    /* Calculation of BEEPER calibration value */

    BEEP_CSR &= (uint8_t)(~MASK_BEEP_CSR_BEEPDIV ); /* Clear bits */

    A = (uint16_t)(lsifreqkhz >> 3U); /* Division by 8, keep integer part only */

    if ((8U * A) >= ((lsifreqkhz - (8U * A)) * (1U + (2U * A))))
    {
        BEEP_CSR |= (uint8_t)(A - 2U);
    }
    else
    {
        BEEP_CSR |= (uint8_t)(A - 1U);
    }
}
/**************************************************************************
 * 函数名:CLK_LSI_Enable_conf
 * 描述  :使能LSI时钟
 * 输入  :无
 *
 * 输出  :无
 * 返回  :无 
 * 调用  :内部调用 供Beep配置函数调用
 *************************************************************************/
static void CLK_LSI_Enable_conf(void)
{
   CLK_ICKR |= MASK_CLK_ICKR_LSIEN;
}
/**************************************************************************
 * 函数名:Set_Beep_OptionByte
 * 描述  :设置Beep的选项字
 * 输入  :无
 *
 * 输出  :无
 * 返回  :无 
 * 调用  :内部调用 供Beep配置函数调用
 *************************************************************************/
static void Set_Beep_OptionByte(void)
{
  uint16_t Beep_Option_status;/*记录激活备选功能Beep的状态*/
  Beep_Option_status=FLASH_ReadOptionByte(Beep_OptionAdd);
  printf("\r\n备选状态:0x%X\r\n",Beep_Option_status);
  if(!(Beep_Option_status&0x8000))
  {
    FLASH_ProgramOptionByte(Beep_OptionAdd,(uint8_t)((Beep_Option_status|0x8000)>>8));
    /*向Beep_OptionAdd  0x4803 置1,激活了Beep*/
  }
}
/**************************************************************************
 * 函数名:FLASH_ReadOptionByte
 * 描述  :读取的选项字
 * 输入  :无
 *
 * 输出  :无
 * 返回  :选项字的值 
 * 调用  :内部调用 设置Beep的选项字函数调用
 *************************************************************************/
static uint16_t FLASH_ReadOptionByte(uint16_t Address)
{
    uint8_t value_optbyte, value_optbyte_complement = 0;
    uint16_t res_value = 0;
    value_optbyte = *((NEAR uint8_t*)Address); /* Read option byte */
    value_optbyte_complement = *(((NEAR uint8_t*)Address) + 1); /* Read option byte complement */


        if (value_optbyte == (uint8_t)(~value_optbyte_complement))
        {
            res_value = (uint16_t)((uint16_t)value_optbyte << 8);
            res_value = res_value | (uint16_t)value_optbyte_complement;
        }
        else
        {
            res_value = FLASH_OPTIONBYTE_ERROR;
        }
    return(res_value);
}
/**************************************************************************
 * 函数名:FLASH_ProgramOptionByte
 * 描述  :FLASH编程
 * 输入  :uint16_t Address, uint8_t Data
 *
 * 输出  :无
 * 返回  :无
 * 调用  :内部调用 设置Beep的选项字函数调用
 *************************************************************************/
static void FLASH_ProgramOptionByte(uint16_t Address, uint8_t Data)
{
  /* Enable write access to option bytes */
  FLASH_CR2 |= MASK_FLASH_CR2_OPT;
  FLASH_NCR2 &= (uint8_t)(~MASK_FLASH_NCR2_NOPT );
  /* Program option byte and his complement */
  *((NEAR uint8_t*)Address) = Data;
  *((NEAR uint8_t*)((uint16_t)(Address + 1))) = (uint8_t)(~Data);
  FLASH_WaitForLastOperation();
  /* Disable write access to option bytes */
  FLASH_CR2 &= (uint8_t)(~MASK_FLASH_CR2_OPT);
  FLASH_NCR2 |= MASK_FLASH_NCR2_NOPT;
}
/**************************************************************************
 * 函数名:FLASH_WaitForLastOperation
 * 描述  :等到FLASH编程完毕
 * 输入  :无
 *
 * 输出  :无
 * 返回  :无
 * 调用  :内部调用 FLASH编程函数调用
 *************************************************************************/
static void FLASH_WaitForLastOperation(void)
{
    uint8_t flagstatus = 0x00;
    uint32_t timeout = OPERATION_TIMEOUT;
    while ((flagstatus == 0x00) && (timeout != 0x00))
        {
            flagstatus = (uint8_t)(FLASH_IAPSR & (uint8_t)(MASK_FLASH_IAPSR_EOP  |
                                              MASK_FLASH_IAPSR_WR_PG_DIS));
            timeout--;
        }
    
}

  • 📑deep.h
#ifndef __BEEP_H
#define __BEEP_H
#include "type_def.h"

#define Beep_OptionAdd  0x4803
#define FLASH_OPTIONBYTE_ERROR  ((uint16_t)0x5555)
#define OPERATION_TIMEOUT  ((uint32_t)0xFFFFF)
#define LSI_128kHz 128000
#define BEEP_FREQUENCY_1KHZ 0x00  //fLS/(4 x BEEPDIV) kHz 
#define BEEP_FREQUENCY_2KHZ 0x40  //fLS/(4 x BEEPDIV) kHz 
#define BEEP_FREQUENCY_4KHZ 0x80  //fLS/(4 x BEEPDIV) kHz 
#define NEAR __near

void Beep_conf(void);


#endif

📝mian.c


/**************************
 * 文件名  :main.c
 * 描述    :Beep功能实验   
 * 实验平台: STM8S
************************************/

/* Includes ------------------------------------------------------------------*/
#include "clk_conf.h"
#include "uart.h"
#include "beep.h"


/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

int main(void)
{
  /* Infinite loop */
  /*设置内部高速时钟16M为主时钟*/ 
  Clk_conf();
  uart_conf();
  Beep_conf();
  UART1_SendString("stm8s903k3",sizeof("stm8s903k3"));
  while(1)
  {
  
  }
}






#ifdef USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param file: pointer to the source file name
  * @param line: assert_param error line source number
  * @retval : None
  */
void assert_failed(u8* file, u32 line)
{ 
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif



  • 🌿4KHz
    在这里插入图片描述
  • 🌿2KHz
    在这里插入图片描述
  • 🌿1KHz
    在这里插入图片描述

📚程序源码

链接:https://pan.baidu.com/s/1_Wd-sAqGCEtOmXU2SlA9WA 
提取码:8ogn
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值