106 lines
1.4 KiB
C
106 lines
1.4 KiB
C
/*
|
|
* buzzer.c
|
|
*
|
|
* Created on: Mar 6, 2022
|
|
* Author: wuwen
|
|
*/
|
|
|
|
|
|
#include "buzzer.h"
|
|
|
|
struct notes *notes;
|
|
|
|
void play_ones(uint16_t freq,uint8_t dutya)
|
|
{
|
|
//寄存器写法 需要根据单片机的时钟来写。
|
|
TIM4->ARR = (uint32_t)((72000000/freq)-1);TIM4->CCR3 = (uint32_t)(((72000000/freq)-1)*((float)dutya/100));
|
|
}
|
|
|
|
|
|
|
|
void add_a_note(uint16_t freq,uint8_t duty,uint16_t deley)//添加一个音符
|
|
{
|
|
struct notes* buff;
|
|
buff = (struct notes*)malloc(sizeof(struct notes));
|
|
if (buff != NULL)
|
|
{
|
|
buff->freq = freq;
|
|
buff->duty = duty;
|
|
buff->deley = deley;
|
|
buff->next_note = NULL;
|
|
|
|
if (notes == NULL)
|
|
{
|
|
notes = buff;
|
|
}
|
|
else
|
|
{
|
|
struct notes *t = notes;
|
|
while (t->next_note != NULL)
|
|
{
|
|
t = t->next_note;
|
|
}
|
|
t->next_note = buff;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void delhead() //删除第一个音符 一般用户不需要调用
|
|
{
|
|
if (notes == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
|
|
if (notes->next_note == NULL)
|
|
{
|
|
free(notes);
|
|
notes = NULL;
|
|
}
|
|
else
|
|
{
|
|
struct notes *t = notes;
|
|
notes = notes->next_note;
|
|
free(t);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
char buzzer_play_server() //放在主循环 只有有音符添加进来就会播放,播放完自动释放
|
|
{
|
|
|
|
|
|
static char busy_flag=0;
|
|
static uint32_t play_delay;
|
|
|
|
if(notes == NULL)
|
|
{
|
|
//play_ones(0,0);
|
|
}else
|
|
{
|
|
if(busy_flag==0)
|
|
{
|
|
busy_flag=1;
|
|
play_delay=HAL_GetTick()+notes->deley;
|
|
play_ones(notes->freq,notes->duty);
|
|
}
|
|
if(busy_flag==1)
|
|
{
|
|
if(HAL_GetTick()>play_delay)
|
|
{
|
|
busy_flag=0;
|
|
delhead();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return busy_flag;
|
|
}
|