STM32F407学习笔记(一) CubeMX、CubeIDE配置按键控制PWM波使蜂鸣器播放音乐

这篇博客介绍了如何利用STM32F407的通用定时器TIM13生成PWM波,通过设置ARR和CCR寄存器控制PWM频率和占空比,从而控制蜂鸣器播放音乐。博主详细阐述了PWM生成原理,并通过CubeMX配置定时器和GPIO,接着在CubeIDE中编写代码实现《天空之城》的音乐播放。
摘要由CSDN通过智能技术生成

PWM生成及歌曲实现原理

STM32F407有两类定时器:基础定时器和通用定时器(关于定时器可以看这里)。

通用定时器具有生成PWM波的功能,因此本例中使用通用定时器中的TIM13生成PWM波。

在定时器中时基单元有三种寄存器:计数寄存器(CNT)、 预分频寄存器(PSC)、自动重载寄存器(ARR)。

PWM波生成,通过设置ARR寄存器和CCR寄存器的值,在计数器的值CNT变化过程中,输出PWM波。PWM波的频率由ARR寄存器决定,占空比由CCR寄存器决定。

单片机输出高低不同的脉冲信号来控制蜂鸣器发音,要想产生音频脉冲信号,需要算出某音频的周期(1/频率)关键是每个音阶对应频率的方波如何求.在歌曲中,音调就是PWM波的频率(ARR),音量是其占空比(CCR),节拍通过delay延时函数实现。

f P W M = f 时 钟 频 率 ( P S C + 1 ) ( A R R + 1 ) f_{PWM}=\frac{f_{时钟频率}}{(PSC+1)(ARR+1)} fPWM=(PSC+1)(ARR+1)

  • 9
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
以下是利用STM32CubeMX和Keil μVision5软件在STM32F407ZGT6芯片上使用PWM使蜂鸣器播放音乐的步骤: 1. 在STM32CubeMX软件中选择STM32F407ZGT6芯片,并打开“Pinout”选项卡。 2. 在“Pinout”选项卡中,选择要用于控制蜂鸣器的GPIO引脚,并将其模式设置为“Alternate Function”模式,功能为“TIMx_CHy”。 3. 打开“Clock Configuration”选项卡,使能TIM时钟,并设置TIM时钟频率为84MHz。 4. 在“Configuration”选项卡中,选择“TIMx”模块,并启用PWM模式。 5. 设置PWM的周期和占空比,以产生所需的音乐频率和持续时间。 6. 在Keil μVision5软件中创建一个新的STM32F4工程,并将生成的代码导入到工程中。 7. 在main.c文件中添加PWM初始化代码,并在主函数中循环播放音乐。 下面是一个示例代码,用于播放蜂鸣器: ```c #include "stm32f4xx_hal.h" /* TIM handle declaration */ TIM_HandleTypeDef htim2; /* TIM2 init function */ void MX_TIM2_Init(void) { TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC; htim2.Instance = TIM2; htim2.Init.Prescaler = 0; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 10000; // PWM周期为10ms,对应100Hz htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(&htim2); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 5000; // PWM占空比为50% sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1); } int main(void) { /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_TIM2_Init(); /* Start PWM output */ HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); /* Infinite loop */ while (1) { HAL_Delay(500); // 短暂停顿 __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 8000); // 发出响亮的音符 HAL_Delay(500); // 持续时间500ms __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 0); // 发出停顿音 } } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; /**Configure the main internal regulator output voltage */ __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /**Initializes the CPU, AHB and APB busses clocks */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 4; HAL_RCC_OscConfig(&RCC_OscInitStruct); /**Initializes the CPU, AHB and APB busses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); /**Configure the Systick interrupt time */ HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); /**Configure the Systick */ HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* SysTick_IRQn interrupt configuration */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } ``` 在上述示例代码中,利用TIM2模块的PWM输出控制蜂鸣器,产生持续时间为500ms、频率为100Hz的响亮音符。其中,占空比为50%,对应的PWM输出为5000。利用短暂的停顿音和响亮的音符循环播放,就可以演奏简单的音乐了。 需要注意的是,由于蜂鸣器的声音大小和频率受电路和终端电阻的影响,可能存在一定的误差。因此,在设计嵌入式音乐系统时应该根据实际应用需求进行实验和调试。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值