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)驱动功能模块示例的主要内容,如果未能解决你的问题,请参考以下文章