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

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM8S系列基于IAR开发:蜂鸣器(BEEP)驱动功能模块示例相关的知识,希望对你有一定的参考价值。

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


🔖本示例基于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

以上是关于STM8S系列基于IAR开发:蜂鸣器(BEEP)驱动功能模块示例的主要内容,如果未能解决你的问题,请参考以下文章

STM8S系列基于IAR开发串口中断接收和发送示例

STM8S系列基于IAR开发单通道ADC连续采样示例

STM8S系列基于IAR开发外部中断(EXTI)按键检测示例

STM8S系列基于IAR标准外设printf输出demo

本人正在学习stm8,使用IAR编程,求代码把蜂鸣器弄响

IAR工程STM8S208RB基于ST标准库独立看门狗(IWDG)