stm32f401rct6 PWM
时间: 2025-05-02 13:47:51 浏览: 23
### STM32F401RCT6 PWM 配置教程
#### 使用 HAL 库配置 STM32F401RCT6 的 PWM 功能
STM32F4 微控制器系列提供了多个定时器模块,这些模块可以用于生成脉宽调制 (PWM) 波形。通过 HAL 库,开发者能够轻松实现复杂的功能配置。
以下是基于 STM32F401RCT6 和 HAL 库的 PWM 配置方法:
---
#### 1. 定时器初始化
为了生成 PWM 输出信号,需要选择一个合适的定时器并对其进行初始化。STM32F401 提供了多种类型的定时器(基本、通用和高级),其中通用定时器通常适用于大多数应用需求。
```c
// 初始化 TIM2 外设结构体
TIM_HandleTypeDef htim2;
void MX_TIM2_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim2.Instance = TIM2;
htim2.Init.Prescaler = 839; // 设置预分频器值
htim2.Init.CounterMode = TIM_COUNTERMODE_UP; // 计数模式向上计数
htim2.Init.Period = 999; // 自动重装载寄存器值
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();
}
if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
}
```
上述代码完成了 TIM2 的基础初始化工作[^1]。`Prescaler` 值决定了输入时钟被分割的比例;`Period` 则定义了一个周期内的最大计数值。
---
#### 2. 启用 PWM 模式
在完成定时器的基础配置之后,需进一步启用特定通道上的 PWM 模式,并调整其占空比参数。
```c
// 配置 TIM2 CH2 为 PWM 模式
TIM_OC_InitTypeDef sConfigOC = {0};
void Configure_PWM_Channel(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t DutyCyclePercent)
{
sConfigOC.OCMode = TIM_OCMODE_PWM1; // 设定为 PWM Mode 1
sConfigOC.Pulse = (DutyCyclePercent * htim->Init.Period) / 100; // 脉冲宽度计算
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; // 极性高有效
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; // 关闭快速模式
if (HAL_TIM_PWM_ConfigChannel(htim, &sConfigOC, Channel) != HAL_OK)
{
Error_Handler();
}
}
int main()
{
// 初始化外设
MX_GPIO_Init(); // GPIO 初始化
MX_TIM2_Init(); // 定时器初始化
// 配置 TIM2_CH2 的占空比为 50%
Configure_PWM_Channel(&htim2, TIM_CHANNEL_2, 50);
// 开启中断和 PWM 输出
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
while (1)
{
// 主循环逻辑
}
}
```
此部分实现了对指定通道(如 TIM2_CH2)的具体配置操作[^3]。注意 `Pulse` 参数由目标占空比百分比决定。
---
#### 3. 中断处理程序
如果希望动态改变 PWM 占空比或其他属性,则可以通过中断服务例程来更新相关寄存器的内容。
```c
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2)
{
static int duty_cycle = 50; // 当前占空比
static int direction = 1; // 方向标志位 (+/-)
// 更新占空比
duty_cycle += direction;
if (duty_cycle >= 100 || duty_cycle <= 0)
direction *= -1;
__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, (uint32_t)((float)duty_cycle / 100 * htim->Init.Period));
}
}
```
该回调函数会在每次定时器溢出事件触发时执行一次,从而允许实时修改输出波形特性。
---
#### 总结
以上展示了如何利用 HAL 库在 STM32F401RCT6 上创建具有可变频率与占空比特性的多路 PWM 输出方案。实际项目中可能还需要考虑更多细节因素比如滤波电路设计以及软件同步机制等问题。
阅读全文
相关推荐








