stm32f103zet6pwm输出引脚hal
时间: 2025-05-14 07:59:37 浏览: 17
### STM32F103ZET6 使用 HAL 库实现 PWM 输出
STM32F103ZET6 是一款基于 ARM Cortex-M3 内核的高性能微控制器,其内置多个定时器可以用于生成 PWM 信号。通过 HAL 库,开发者能够轻松配置并启用这些功能强大的外设。
#### 定时器分类及其适用场景
STM32F103 的定时器分为三种类型:基本定时器、通用定时器和高级定时器[^1]。对于 PWM 功能而言,通常会使用 **通用定时器** 或 **高级定时器**,因为它们支持更多通道和复杂的 PWM 模式。
以下是利用 HAL 库在 STM32F103ZET6 上实现 PWM 输出的具体方法:
---
#### GPIO 和 TIM 配置流程概述
为了使能 PWM 功能,需完成以下几个关键步骤:
1. 初始化 GPIO 引脚作为复用功能 (Alternate Function, AF)。
2. 配置定时器的工作模式为 PWM 输出模式。
3. 设置定时器参数(如预分频系数、计数周期等),以定义所需的频率和占空比。
4. 启动定时器并激活相应的 PWM 通道。
---
#### 示例代码:TIM2 生成单路 PWM 波形
假设我们希望从 PA0 引脚输出一个固定频率的 PWM 信号,则可以通过以下方式实现:
```c
#include "stm32f1xx_hal.h"
void MX_TIM2_Init(void)
{
TIM_HandleTypeDef htim2;
TIM_OC_InitTypeDef sConfigOC;
__HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟
__HAL_RCC_TIM2_CLK_ENABLE(); // 使能TIM2时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_0; // 配置PA0引脚
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出
GPIO_InitStruct.Pull = GPIO_NOPULL; // 不带上下拉电阻
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 高速模式
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
htim2.Instance = TIM2; // 使用TIM2实例
htim2.Init.Prescaler = 8399; // 设定预分频值(系统时钟72MHz -> 计数频率约8.4kHz)
htim2.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数模式
htim2.Init.Period = 999; // 自然溢出周期设定为1ms
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if(HAL_TIM_Base_Init(&htim2) != HAL_OK){
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1; // PWM Mode 1
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();
}
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); // 开启PWM通道1
}
// 错误处理函数
void Error_Handler(void)
{
while(1);
}
```
上述代码实现了如下功能:
- 将 `PA0` 配置为 TIM2_CH1 的 PWM 输出引脚。
- 设置定时器工作于向上计数模式,自然溢出时间为 1 ms (`Period=999`)。
- 默认占空比被设置为 50% (`Pulse=500`)。
- 调整 `Prescaler` 值可改变实际输出波形的频率;调整 `Pulse` 可动态修改占空比。
---
#### 扩展应用案例
如果需要多路独立控制的 PWM 输出,可以选择其他通用或高级定时器资源,并重复类似的初始化过程。例如,在机器人底盘控制系统中,可通过调节不同电机驱动模块上的 PWM 占空比来实现速度闭环控制[^4]。
此外,当涉及复杂任务调度时,建议结合 RTOS 技术优化程序架构设计。比如 uC/OS 移植教程提到的内容可以帮助开发者更好地管理硬件资源与软件逻辑之间的交互关系[^3]。
---
阅读全文
相关推荐


















