stm32F103单片机PWM驱动蜂鸣器输出音调核心代码和main函数
时间: 2024-10-26 18:02:54 浏览: 61
STM32F103单片机的PWM(脉冲宽度调制)可以用于驱动蜂鸣器改变音调,这通常涉及到初始化GPIO、设置定时器和配置PWM通道。以下是一个基本的核心代码示例(假设我们使用的是 TIM2 和 GPIOA),以及一个简化的`main()`函数:
```c
#include "stm32f1xx_hal.h"
// 定义变量
uint16_t dutyCycle = 50; // 初始占空比,调整此值以改变音调
TIM_HandleTypeDef htim2;
GPIO_InitTypeDef gpio Pin;
// 初始化TIM2
void init_TIM2_PWM(void) {
htim2.Instance = TIM2;
htim2.Init.Prescaler = (系统频率 / 1000000) - 1; // 根据实际时钟频率计算预分频值
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 10000; // 蜂鸣器周期,可以根据需要调整
HAL_TIM_Base_Init(&htim2);
HAL_TIM_PWM_Init(&htim2);
HAL_TIM_MspPostInit(&htim2); // 启动时钟并初始化时钟资源
}
// 设置GPIO为推挽输出,连接到蜂鸣器
void init_GPIOA_PWM(void) {
gpio.Pin.PinNumber = GPIO_PIN_0; // 针对GPIOA,这里假设蜂鸣器连接到PA0
gpio.Pin.Mode = GPIO_MODE_AF_PP;
gpio.Pin.Pull = GPIO_NOPULL;
gpio.Pin.Alternate = GPIO_AF2_TIM2; // 使用TIM2的通道2
HAL_GPIO_Init(GPIOA, &gpio);
}
// PWM主函数,改变dutyCycle来调节音调
void pwm_duty_cycle(uint16_t newDutyCycle) {
dutyCycle = newDutyCycle;
HAL_TIM_PWM_SetCompare(&htim2, TIM_CHANNEL_1, dutyCycle); // TIM2 CH1对应GPIOA PA0
}
int main(void) {
HAL_Init(); // 系统初始化
SystemClock_Config(); // 配置系统时钟
init_TIM2_PWM();
init_GPIOA_PWM();
while (1) {
// 演示如何通过定时改变dutyCycle来调节音调
for (uint16_t i = 0; i <= 100; i++) {
pwm_duty_cycle(i * 10); // 从0%到100%
HAL_Delay(100); // 暂停一段时间让蜂鸣器发出声音
}
}
return 0;
}
```
阅读全文