stm32 tim2 输出四路pwm
时间: 2025-05-22 22:37:47 浏览: 25
### STM32 TIM2 实现四路 PWM 输出配置
要使用 STM32 的 TIM2 定时器实现四路 PWM 输出,可以通过配置定时器的多个通道(TIM_CHANNEL_1 至 TIM_CHANNEL_4),并启用相应的中断或 DMA 功能。以下是详细的说明以及代码示例。
#### 1. 配置基础
STM32 的 TIM2 是一个通用定时器,支持最多四个独立的 PWM 输出通道。每个通道可以单独设置占空比和极性[^1]。为了实现四路 PWM 输出,需要完成以下几个步骤:
- **初始化定时器**: 设置预分频器 (PSC) 和自动重装载值 (ARR),以定义 PWM 波形的频率。
- **配置 GPIO 引脚**: 将 TIM2 的输出通道映射到对应的 GPIO 引脚。
- **启动 PWM 模式**: 使用 HAL 库函数 `HAL_TIM_PWM_Start` 或者底层宏 `__HAL_TIM_SET_COMPARE` 来控制各通道的占空比。
---
#### 2. 初始化代码示例
以下是一个基于 HAL 库的完整代码示例,用于配置 TIM2 的四路 PWM 输出:
```c
#include "stm32f1xx_hal.h"
// 定义全局变量
TIM_HandleTypeDef htim2;
void MX_TIM2_Init(void) {
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
// 配置 TIM2 处理句柄结构体
htim2.Instance = TIM2;
htim2.Init.Prescaler = 83; // 假设系统时钟为 72MHz,则此值对应 9kHz 的计数频率
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 999; // 自动重载值,决定 PWM 周期
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK) {
Error_Handler();
}
// 配置时钟源
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) {
Error_Handler();
}
// 配置主控模式
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) {
Error_Handler();
}
}
void ConfigurePWMChannels(void) {
TIM_OC_InitTypeDef sConfigOC = {0};
// 配置所有通道为 PWM 模式
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 500; // 初始占空比 50%
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) {
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) {
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) {
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK) {
Error_Handler();
}
}
int main(void) {
HAL_Init(); // 初始化 HAL 库
SystemClock_Config(); // 配置系统时钟
MX_GPIO_Init(); // 初始化 GPIO
MX_TIM2_Init(); // 初始化 TIM2
ConfigurePWMChannels(); // 配置 PWM 通道
// 启动 TIM2 中断和 PWM 输出
HAL_TIM_Base_Start(&htim2);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4);
while (1) {
// 主循环逻辑
}
}
```
---
#### 3. 关键点解释
- **Prescaler 和 Period 参数的选择**:
- Prescaler 控制计数器的工作频率,其计算公式为 \( f_{\text{CNT}} = \frac{f_{\text{CLK\_TIM}}}{{(\text{Prescaler} + 1)}} \)[^1]。
- Period 决定 PWM 的周期长度,单位为计数值。
- **GPIO 映射**:
- 确保 TIM2 的 CH1~CH4 对应的 GPIO 引脚已正确定义为复用功能,并启用了 AFIO 配置[^2]。
- **动态调整占空比**:
- 可以通过调用 `__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_X, value)` 函数实时修改某个通道的占空比[^2]。
---
#### 4. 注意事项
- 如果使用的是 STM32F1 系列芯片,请注意某些型号可能不支持全部四个通道的同时输出[^1]。
- 在实际应用中,需根据具体需求合理分配资源,例如避免与其他外设争抢同一组 GPIO 资源。
---
###
阅读全文
相关推荐


















