STM32_驱动蜂鸣器自定义库

STM32_驱动蜂鸣器自定义库

功能说明:

1、可以实现设置蜂鸣器的音调

2、可以设置蜂鸣器连续鸣响次数

3、设置连续鸣响时间间隔

main.c

c 复制代码
#include "mymain.h"
#include "dev_control.h"

int main(void)
{
	HAL_Init();
	SystemClock_Config();

	MX_GPIO_Init();
	MX_TIM2_Init();
	
	devInit();

	devBuzzerSetNum(3);		//设置鸣响次数3
	devBuzzerSetLevel(unsigned char level);	//设置音调等级
	
	while (1)
	{
		devTask();
		HAL_Delay(1);
	}
}

buzzer.c

c 复制代码
#include "dev_control.h"

#define DEV_TASK_PERIOD 1 //调用devTask的周期
devBuzzer_t devBuzzer = {0};

void devInit(void)
{
	/*************************蜂鸣器************************/
	devBuzzer.devBuzzerEnable = STATE_ENABLE;
	devBuzzer.devBuzzerPeriod = 200;				//周期200ms
	devBuzzer.devBuzzerDuty = 100;				//鸣响100ms
}

void devTask(void)
{
	if(devBuzzer.devBuzzerEnable == STATE_ENABLE)
	{
		if(devBuzzer.devBuzzerNumber > 0)
		{
			devBuzzer.devBuzzerCount += DEV_TASK_PERIOD;
			if(devBuzzer.devBuzzerCount <= devBuzzer.devBuzzerDuty)
			{
				HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);
			}
			else 
			{
				HAL_TIM_PWM_Stop(&htim2,TIM_CHANNEL_3);
			}
			if(devBuzzer.devBuzzerCount == devBuzzer.devBuzzerPeriod)
			{
				devBuzzer.devBuzzerCount = 0;
				devBuzzer.devBuzzerNumber--;
			}
		}
	}
}

void devBuzzerSetLevel(unsigned char level)
{
	switch(level)
	{
		case BUZZER_LEVEL_0:
			devBuzzer.devBuzzerLevel = level;
			__HAL_TIM_SET_PRESCALER(&htim2, 144-1);//设置时钟频率0.5Khz
			break;
		case BUZZER_LEVEL_1:
			devBuzzer.devBuzzerLevel = level;
			__HAL_TIM_SET_PRESCALER(&htim2, 72-1);//1Khz
			break;
		case BUZZER_LEVEL_2:
			devBuzzer.devBuzzerLevel = level;
			__HAL_TIM_SET_PRESCALER(&htim2, 36-1);//2Khz
			break;
		default:
			break;
	}
}

buzzer.h

c 复制代码
#ifndef __DEV_CONTROL_H
#define __DEV_CONTROL_H
#include "main.h"
#include "gpio.h"

enum{
	STATE_DISABLE,
	STATE_ENABLE
};

enum{
	BUZZER_LEVEL_0,
	BUZZER_LEVEL_1,
	BUZZER_LEVEL_2
};

//蜂鸣器控制结构体
typedef struct
{
	unsigned char devBuzzerEnable;		//使能
	unsigned char devBuzzerLevel;		//音调水平
	unsigned char devBuzzerNumber;		//连续鸣响次数
	unsigned int devBuzzerDuty;			//单次鸣响时长
	unsigned int devBuzzerPeriod;		//单次鸣响控制周期
	unsigned int devBuzzerCount;		//计数用于控制
} devBuzzer_t;

void devBuzzerSetNum(unsigned char num);		//设置鸣响次数
void devBuzzerSetLevel(unsigned char level);	//设置音调等级

#endif
相关推荐
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
Lester_11014 天前
STM32霍尔传感器输入口设置为复用功能输入口时,还能用GPIO函数直接读取IO的状态吗
stm32·单片机·嵌入式硬件·电机控制
LCG元4 天前
低功耗显示方案:STM32L0驱动OLED,动态波形绘制与优化
stm32·嵌入式硬件·信息可视化
三佛科技-187366133974 天前
120W小体积碳化硅电源方案(LP8841SC极简方案12V10A/24V5A输出)
单片机·嵌入式硬件
z20348315204 天前
STM32F103系列单片机定时器介绍(二)
stm32·单片机·嵌入式硬件
古译汉书5 天前
【IoT死磕系列】Day 7:只传8字节怎么控机械臂?学习工业控制 CANopen 的“对象字典”(附企业级源码)
数据结构·stm32·物联网·http
Alaso_shuang5 天前
STM32 核心输入、输出模式
stm32·单片机·嵌入式硬件
脚后跟5 天前
AI助力嵌入式物联网项目全栈开发
嵌入式硬件·物联网·ai编程
2501_918126915 天前
stm32死锁是怎么实现的
stm32·单片机·嵌入式硬件·学习·个人开发
z20348315205 天前
STM32F103系列单片机定时器介绍(一)
stm32·单片机