登录/注册

stm32使用pwm播放音乐

更多

在STM32上使用PWM播放音乐,可以通过调整PWM频率生成不同音调,结合定时器控制音符时长。以下是实现步骤和示例代码:


1. 硬件连接


2. 配置PWM定时器

以TIM3通道1为例(PA6引脚):

// PWM初始化函数
void PWM_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    TIM_TimeBaseInitTypeDef TIM_InitStruct = {0};
    TIM_OCInitTypeDef TIM_OC_InitStruct = {0};

    // 使能时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 配置PA6为复用推挽输出
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    // 定时器基础配置
    TIM_InitStruct.TIM_Period = 0;      // 初始ARR值(后续动态调整)
    TIM_InitStruct.TIM_Prescaler = 72 - 1; // 72MHz / 72 = 1MHz
    TIM_InitStruct.TIM_ClockDivision = 0;
    TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_InitStruct);

    // PWM模式配置(通道1)
    TIM_OC_InitStruct.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OC_InitStruct.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OC_InitStruct.TIM_Pulse = 0;    // 初始CCR值(占空比50%)
    TIM_OC_InitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM3, &TIM_OC_InitStruct);

    TIM_Cmd(TIM3, ENABLE);
}

3. 定义音符频率表

// 音符频率表(单位:Hz)
const uint16_t note_freq[] = {
    262, // C4
    294, // D4
    330, // E4
    349, // F4
    392, // G4
    440, // A4
    494  // B4
};

// 示例音乐:《小星星》简谱(C4调)
const uint8_t melody[] = {
    0, 0, 4, 4, 5, 5, 4, // 音符索引
    // 添加更多音符...
};

// 音符时长(单位:毫秒)
const uint16_t duration[] = {
    500, 500, 500, 500, 500, 500, 1000,
    // 对应时长...
};

4. 定时器中断控制音符切换

// 配置SysTick定时器(1ms中断)
void SysTick_Init(void) {
    SysTick_Config(SystemCoreClock / 1000); // 1ms中断
}

volatile uint16_t note_index = 0;
volatile uint32_t time_counter = 0;

void SysTick_Handler(void) {
    if (time_counter >= duration[note_index]) {
        time_counter = 0;
        note_index++;
        if (note_index >= sizeof(melody)) note_index = 0;

        // 更新PWM频率
        uint16_t freq = note_freq[melody[note_index]];
        TIM3->ARR = (1000000 / freq) - 1; // ARR = 1MHz / freq - 1
        TIM3->CCR1 = TIM3->ARR / 2;       // 占空比50%
    }
    time_counter++;
}

5. 主函数

int main(void) {
    PWM_Init();
    SysTick_Init();

    while (1) {
        // 主循环无需操作,由中断处理音乐播放
    }
}

6. 关键说明


优化建议

通过以上步骤,即可实现STM32的PWM音乐播放功能。

请问用蜂鸣器播放音乐的时候如何同时播放两段音乐

我用 PWM 控制的音乐播放,可以按照乐谱播放音符 但现在有个需求,是在

2024-06-14 08:23:03

arduino能用pwm播放音乐吗?

arduino能用pwm播放音乐吗,歌曲通过外部的flash存储

2023-11-08 08:19:54

CH32V103基础教程93-PWM播放音乐 (1个TIM)

本章教程主要在第八章PWM输出的基础上进行,主要使用CH32V103的PWM播放音乐,可直接接喇叭使用,但声音较小,可通过功放接喇叭来提高音量。

2023-05-11 16:10:08

如何制作可以播放音乐的步进电机

电子发烧友网站提供《如何制作可以播放音乐的步进电机.zip》资料免费下载

资料下载 池鹄展 2023-06-07 10:44:28

基于51单片机的蜂鸣器播放音乐源代码

基于51单片机的蜂鸣器播放音乐例程源代码

资料下载 木头1233 2023-05-12 16:16:20

用Ameba播放音乐

电子发烧友网站提供《用Ameba播放音乐.zip》资料免费下载

资料下载 李明聪 2022-11-07 16:09:53

STM32 控制蜂鸣器播放音乐的原理和实例

STM32 控制蜂鸣器播放音乐的原理和实例本文通过将乐谱里的每个音符的声音频率和声音时长保存在两个数组里面。1.使用通用定时器TIM4实现无中断的微秒级延时函数,控制每个音符的发声时长。2.使用系统

资料下载 佚名 2021-12-03 15:06:15

蜂鸣器播放音乐设计与实现(附源码)

蜂鸣器播放音乐设计与实现(附源码)

资料下载 佚名 2021-04-24 11:00:34

求助,用蜂鸣器播放音乐的时候如何同时播放两段音乐

我用 PWM 控制的音乐播放,可以按照乐谱播放音符但现在有个需求,是在

2023-03-06 07:44:32

求助,用蜂鸣器播放音乐的时候如何同时播放两段音乐

我用 PWM 控制的音乐播放,可以按照乐谱播放音符但现在有个需求,是在

2023-02-13 08:56:49

如何使用STM32F103控制蜂鸣器发声播放音乐

例程主要参考的是这一篇《使用STM32F103控制蜂鸣器发声播放音乐》,地址如下:https://blog.csdn.net/qq_36355662/article/details/80606753看起来代码比较简洁

2022-01-07 08:19:58

了解蜂鸣器可以播放音乐的原理

一.音乐播放原理蜂鸣器分为有源和无源,经测试均可正常播放音乐。(网上有些回答说有源不可

2021-11-22 07:17:46

STM32控制蜂鸣器播放音乐的原理是什么?

STM32控制蜂鸣器播放音乐的原理是什么?如何使用通用定时器TIM4实现无中断的微秒级延时函数?如何使用系统滴答时钟Systick实现带有中断的输出控制?

2021-11-16 07:23:58

STM32 控制蜂鸣器播放音乐的原理和实例 精选资料推荐

STM32 控制蜂鸣器播放音乐的原理和实例本文通过将乐谱里的每个音符的声音频率和声音时长保存在两个数组里面。1.使用通用定时器TIM4实现无中断的微秒级延时函数,控制每个音符的发声时长。2.使用系统

2021-08-16 08:00:51

创建自己的乐器并在VR中播放音乐

创建自己的乐器并在VR中播放音乐

2020-05-31 09:20:00

7天热门专题 换一换
相关标签