stm32-code/stm32f0_clock/Bsp/Src/bsp_buzzer.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//十六分音符