shoot/User/module/buzzer.c

80 lines
3.1 KiB
C
Raw Normal View History

2025-03-13 19:23:24 +08:00
#include "buzzer.h"
uint32_t Frequency = 0;
uint32_t CLOCK = 10500000;
int i;
int pwm = MIN_BUZZER_PWM;
int psc = 0;
unsigned int notes[] = {
G3,C4,D4s,D4,C4,D4s,C4,D4,C4,G3s,A3s,G3,
G3,C4,D4s,D4,C4,D4s,C4,D4,C4,G3,F3s,F3,
F3,G3s,B3,D4, F3,G3s,B3,C4,
C4,D4s,A4s,G4s,G4,A4s,G4s,G4s,G4,G4,B3,C4,
C5,C5,B4,A4s, A4s,D5,C5,G4s,G4,
G4,A4s,G4,F4, F4,G4s,G4,F4,G4
};
unsigned int duration[] = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5,
1, 1, 1, 5, 1, 1, 1, 4,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5,
1, 1, 1, 3, 1, 2, 1, 1, 4,
1, 1, 1, 3, 1, 2, 1, 1, 4
};
void buzzer_on(uint16_t note) {
Frequency = CLOCK / note; // 计算定时器的重载值
htim4.Init.Prescaler = 0; // 预分频器设置为0
htim4.Init.Period = Frequency; // 设置定时器的重载值
// 设置PWM的占空比为50%
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, Frequency / 2);
// 启动PWM
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3);
}
void noTone(void){
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 0);
HAL_Delay(30);
}
void playSong(void){
for (i = 0; i < sizeof(notes)/sizeof(notes[0]); i++) {
Frequency = CLOCK / notes[i]; // 计算定时器的重载值
htim4.Instance->ARR = Frequency; // 设置定时器的重载值
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, Frequency / 2);// 设置PWM的占空比为50%
HAL_Delay(400*duration[i]);
noTone();
}
}
void set_buzzer_frequency(uint32_t freq){
__HAL_TIM_SetAutoreload(&htim4, freq);
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, freq/2);
}
uint32_t music[3][205]={{9, 10, 9, 6, 9, 0, 6, 10, 9, 10, 12, 10, 9, 10, 9, 6, 8, 0, 10, 9, 12, 10}, {5, 9, 8, 3, 0, 8, 9, 10, 9, 8, 9, 5, 9, 8, 3, 0, 8, 9, 10, 9, 8, 9, 5, 9, 8, 3, 0, 8, 9, 10, 9, 8, 9, 5, 9, 8, 3, 0, 8, 10, 12, 13, 12, 0, 8, 9, 9, 8, 9, 10, 0, 10, 12, 13, 14, 13, 12, 10, 9, 9, 8, 9, 9, 9, 8, 0, 8, 10, 12, 13, 12, 0, 8, 9, 9, 8, 10, 0, 9, 10, 12, 13, 15, 16, 17, 16, 15, 12, 13, 15, 17, 17, 17, 16, 0, 12, 13, 15, 17, 17, 17, 16, 0}};
uint32_t lst[3][205]={{ 1, 1, 1, 1, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 2, 2, 1, 1, 2}, {2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 3, 1, 2, 2, 2, 2, 4, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 1, 1, 1, 6, 6, 3, 1, 2, 2, 2, 2, 4, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 4, 1, 1, 2, 2, 2, 2, 2, 8}};
uint32_t tones[]={21000000, 262, 294, 330, 349, 392, 440, 494, 523, 587, 659, 698, 784, 880, 988, 1046, 1174, 1318, 1396, 1568, 1760, 1976};
uint32_t lenth[]={22, 103};
uint32_t frequency = 21000000;
uint32_t nw = 0, time_base = 125;
uint32_t song = 1;
void see_you_again(void)
{
set_buzzer_frequency(frequency/tones[music[song][nw]]);
/* USER CODE BEGIN 3 */
HAL_Delay(time_base*lst[song][nw]-time_base*1/4);
set_buzzer_frequency(frequency/tones[0]);
HAL_Delay(time_base*1/64);
nw = (nw + 1) % lenth[song];
}