stm32hal输出pwm
时间: 2025-03-30 17:02:03 浏览: 36
### STM32 HAL 库实现 PWM 输出
通过 STM32 HAL 库实现 PWM 输出是一个常见的应用需求。以下是基于 HAL 库的详细说明以及示例代码。
#### 配置定时器和通道
为了实现 PWM 输出,需要配置通用定时器的相关寄存器。例如,在 TIM3 的 CH2 上输出 PWM 波形时,需设置 `OC2M` 和其他相关位来定义工作模式[^1]。具体来说:
- **OC2M[2:0]** 设置为 110 或 111 来启用 PWM 模式 1 或 PWM 模式 2。
- **OC2PE** 启用预装载功能以确保 CCR2 寄存器的内容被正确更新。
- **CC2S[1:0]** 默认设为 0 表明该通道作为输出使用。
这些参数可以通过 HAL 函数间接完成初始化。
---
#### 示例代码:PWM 输出配置
以下代码展示了如何利用 HAL 库在 TIM3_CH2 上生成 PWM 波形。
```c
#include "stm32f1xx_hal.h"
// 定义全局变量
TIM_HandleTypeDef htim3;
void MX_TIM3_Init(void) {
__HAL_RCC_TIM3_CLK_ENABLE(); // 开启 TIM3 时钟
// 初始化结构体
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
htim3.Instance = TIM3;
htim3.Init.Prescaler = 83; // 设定分频系数 (假设系统时钟为 72MHz, 则计数频率为 900kHz)
htim3.Init.CounterMode = TIM_COUNTERMODE_UP; // 计数向上模式
htim3.Init.Period = 999; // 自动重载值 (周期为 1ms)
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim3) != HAL_OK) {
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) {
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim3) != HAL_OK) {
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) {
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1; // 使用 PWM 模式 1
sConfigOC.Pulse = 500; // 占空比初始值 (占空比=脉冲宽度/自动重载值 * 100%)
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; // 极性高有效
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) {
Error_Handler();
}
}
void StartPWM() {
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); // 启动 TIM3_CH2 的 PWM 功能
}
```
上述代码实现了如下功能:
1. 配置 TIM3 的基本属性(分频、计数方式、周期等)。
2. 将 TIM3 的 CH2 配置为 PWM 模式 1 并设定初始占空比。
3. 调用函数启动 PWM 输出。
---
#### 修改占空比动态调整亮度
如果希望动态改变 LED 的亮度,则可通过修改 `Pulse` 参数重新加载比较值。例如:
```c
uint32_t newDutyCycle = 750; // 新的占空比对应的脉冲宽度
if (HAL_TIM_PWM_SetCompare(&htim3, TIM_CHANNEL_2, newDutyCycle) != HAL_OK) {
Error_Handler();
}
```
此方法允许实时调节 PWM 的占空比从而达到呼吸灯的效果。
---
#### 错误处理机制
当任何 HAL API 返回错误状态时,应调用自定义的 `Error_Handler()` 进行异常管理。通常情况下可在此处停止程序运行或触发中断提示用户注意硬件连接等问题。
---
阅读全文
相关推荐

















