STM32 cubemx下配置无源蜂鸣器输出PWM波并放音乐代码两只老虎

上一篇文章代码
链接:https://blog.csdn.net/qq_42153903/article/details/88714155
enum
{
UNUSED=0,
DO,
RE,
MI,
FA,
SO,
LA,
XI,
DO1,
RI1,
TONE_MAX,
};
uint16_t tone_freq[TONE_MAX] = {0, 1047, 1175, 1319, 1397, 1568, 1760, 1967, 4186, 4698 };
typedef struct tone_s
{
int tone;
int delay_ms;

} tone_t;

#define DEF_DELAY 350
static tone_t tiger_notation[]=
{
{DO, DEF_DELAY},
{RE, DEF_DELAY},
{MI, DEF_DELAY},
{DO, DEF_DELAY*2},

{DO, DEF_DELAY},
{RE, DEF_DELAY},
{MI, DEF_DELAY},
            {DO, DEF_DELAY*2},

            {MI, DEF_DELAY},
            {FA, DEF_DELAY},
            {SO, DEF_DELAY*2},

            {MI, DEF_DELAY},
            {FA, DEF_DELAY},
            {SO, DEF_DELAY*2},

            {SO, DEF_DELAY},
            {LA, DEF_DELAY},
            {SO, DEF_DELAY},
            {FA, DEF_DELAY},
            {MI, DEF_DELAY},
            {DO, DEF_DELAY*2},

            {SO, DEF_DELAY},
            {LA, DEF_DELAY},
            {SO, DEF_DELAY},
            {FA, DEF_DELAY},
            {MI, DEF_DELAY},
            {DO, DEF_DELAY*2},

            {RE, DEF_DELAY},
            {SO, DEF_DELAY},
            {DO, DEF_DELAY*2},

            {RE, DEF_DELAY},
            {SO, DEF_DELAY},
            {DO, DEF_DELAY*2},

};
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
int turn_passive_beep(int cmd, int freq)
{
int range;
if(OFF == cmd)
{
HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_2) ;
}
else
{
if(freq<1000 || freq>5000)
{
printf(“Beep set invalid PWM frequency[%d]!\n”, freq);
return -1;
}

    /* Set PWM clock: 80MHz/169=500KHz */
                    htim2.Init.Prescaler = 160-1;



    /* Set PWM frequency */
                    range=500000/freq;
                    htim2.Init.Period = range;
                    if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
                    {
                            Error_Handler();
                    }
    /* Set PWM duty 50% */
                    TIM_OC_InitTypeDef sConfigOC;

                    sConfigOC.OCMode = TIM_OCMODE_PWM1;
                    sConfigOC.Pulse = (htim2.Init.Period/3);
                    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
                    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
                    if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
                    {
                            Error_Handler();
                    }
                    HAL_TIM_MspPostInit(&htim2);

                    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
}
    return 0;

}
static inline void play_tone(int tone, int delay)
{
if(tone<DO || tone>RI1)
return ;

            turn_passive_beep(ON, tone_freq[tone]);

            Delay_ms(delay);
turn_passive_beep(OFF, 0);

}
void play_tiger(void)
{
int i;

for(i=0; i<ARRAY_SIZE(tiger_notation); i++)
{
    play_tone(tiger_notation[i].tone, tiger_notation[i].delay_ms);
    Delay_ms(30);
}

}

猜你喜欢

转载自blog.csdn.net/qq_42153903/article/details/88737012