74 lines
2.2 KiB
C
74 lines
2.2 KiB
C
#include "bsp_buzzer.h"
|
|
#include "main.h"
|
|
|
|
const uint16_t note_frequency_table[] = {
|
|
//Low do do# re re# mi fa fa# so so# ra ra# si
|
|
262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494,
|
|
//Med do do# re re# mi fa fa# so so# ra ra# si
|
|
523, 554, 587, 622, 659, 698, 740, 784, 831, 880, 932, 988,
|
|
//High do do# re re# mi fa fa# so so# ra ra# si
|
|
1046, 1109, 1175, 1245, 1318, 1397, 1480, 1568, 1661, 1760, 1865, 1976,
|
|
// Beep
|
|
2700,
|
|
};
|
|
|
|
const uint8_t song_happy_birthday[58] = {
|
|
M5, 50, STOP, 1, M5, 20, M6, 60, M5, 60, H1, 60, M7, 120,
|
|
M5, 40, STOP, 1, M5, 20, M6, 60, M5, 60, H2, 60, H1, 120,
|
|
M5, 40, STOP, 1, M5, 20, H5, 60, H3, 60, H1, 60, M7, 60, M6, 120,
|
|
H4, 40, STOP, 1, H4, 20, H3, 60, H1, 60, H2, 60, H1, 120,
|
|
};
|
|
|
|
|
|
//unsigned char code SkyCastle[] = {
|
|
//l6,t8, l7,t8, m1,t4_l, l7,t8, m1,t4, m3,t4, l7,t2_l,
|
|
//l3,t4, l6,t4_l, l5,t8, l6,t4, m1,t4, l5,t2_l,
|
|
//l3,t4, l4,t8, l3,t8, m1,t4, m1,t4, l3,t2_l,
|
|
//STOP
|
|
//};
|
|
|
|
static uint8_t bsp_buzzer_volume_percent = 30;
|
|
|
|
void bsp_buzzer_start(void)
|
|
{
|
|
HAL_TIM_Base_Start(&BSP_BUZZER_PWM_TIM);
|
|
}
|
|
|
|
void bsp_buzzer_play_note(bsp_buzzer_key key)
|
|
{
|
|
if (key == STOP) {
|
|
HAL_TIM_PWM_Stop(&BSP_BUZZER_PWM_TIM, BSP_BUZZER_PWM_CH);
|
|
return;
|
|
} else {
|
|
uint32_t psc = SystemCoreClock / note_frequency_table[key];
|
|
uint32_t oc = psc * bsp_buzzer_volume_percent / 100;
|
|
|
|
__HAL_TIM_SET_AUTORELOAD(&BSP_BUZZER_PWM_TIM, psc); //32位定时器
|
|
__HAL_TIM_SET_COMPARE(&BSP_BUZZER_PWM_TIM, BSP_BUZZER_PWM_CH, oc);
|
|
|
|
HAL_TIM_PWM_Start(&BSP_BUZZER_PWM_TIM, BSP_BUZZER_PWM_CH);
|
|
}
|
|
}
|
|
|
|
void bsp_buzzer_play_song(const uint8_t *note_table, uint32_t note_count)
|
|
{
|
|
for (uint32_t i = 0; i < note_count; i ++) {
|
|
bsp_buzzer_play_note(note_table[i * 2]);
|
|
HAL_Delay(note_table[i * 2 + 1] * 8);
|
|
}
|
|
|
|
bsp_buzzer_play_note(STOP);
|
|
}
|
|
|
|
//#define TICK 60
|
|
|
|
//#define t1 TICK*4//全音符
|
|
//#define t2_l TICK*3//长二分音符
|
|
//#define t2 TICK*2//二分音符
|
|
//#define t4_l TICK*1.5//长四分音符
|
|
//#define t4 TICK//四分音符
|
|
//#define t8 TICK/2//八分音符
|
|
//#define t16 TICK/4//十六分音符
|
|
|
|
|