stm32f103c8t6定时器2配置
时间: 2025-05-01 13:41:28 浏览: 41
### STM32F103C8T6 定时器2 配置教程与示例代码
#### 初始化配置说明
STM32F103C8T6 的定时器2 是一个通用定时器,具有多种功能,包括捕获/比较、输入捕获、输出比较以及 PWM 输出等功能。为了正确配置 TIM2,需要完成以下几个方面的设置:
1. **使能时钟**
使用 `__HAL_RCC_TIM2_CLK_ENABLE()` 函数启用 TIM2 外设的时钟。
2. **初始化结构体定义**
创建并填充 `TIM_HandleTypeDef` 结构体变量,用于存储定时器的相关参数。
3. **时间基数初始化**
设置自动重装载寄存器(ARR)和计数器周期值(PSC),以控制定时器的时间间隔。
4. **中断或 DMA 请求配置(可选)**
如果需要使用中断,则需配置 NVIC 和回调函数。
5. **启动定时器**
调用 `HAL_TIM_Base_Start_IT(&htim2)` 或者 `HAL_TIM_PWM_Start(&htim2, Channel)` 启动定时器。
---
#### 示例代码:TIM2 基本配置
以下是一个完整的 TIM2 初始配置示例代码,假设我们希望生成一个固定频率的信号:
```c
#include "stm32f1xx_hal.h"
// 定义全局句柄
TIM_HandleTypeDef htim2;
void TIM2_Init(void) {
// 使能 TIM2 时钟
__HAL_RCC_TIM2_CLK_ENABLE();
// 配置 TIM2 参数
htim2.Instance = TIM2;
htim2.Init.Prescaler = 7199; // 设定预分频器,系统时钟为 72MHz,此处设定为 7200Hz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP; // 计数模式向上计数
htim2.Init.Period = 999; // 自动重载值,决定溢出周期
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK) {
// 初始化错误处理
Error_Handler();
}
// 开启 IT 中断(如果需要)
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); // 设置优先级
HAL_NVIC_EnableIRQ(TIM2_IRQn); // 使能 TIM2 中断
}
// 更新中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance == TIM2) {
// 添加自定义逻辑代码
}
}
```
上述代码实现了 TIM2 的基础配置,并设置了更新事件触发的中断回调函数[^1]。
---
#### 示例代码:TIM2 PWM 功能配置
如果需要利用 TIM2 实现 PWM 输出,可以按照如下方式进行配置:
```c
#include "stm32f1xx_hal.h"
TIM_HandleTypeDef htim2;
void TIM2_PWM_Init(uint16_t period, uint16_t pulse) {
__HAL_RCC_TIM2_CLK_ENABLE(); // 使能 TIM2 时钟
// 配置 TIM2
htim2.Instance = TIM2;
htim2.Init.Prescaler = 71; // 预分频器,72 MHz / (72 + 1) ≈ 1 MHz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = period; // 设置 ARR 寄存器值
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) {
Error_Handler();
}
// 配置通道 1 的 PWM 模式
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1; // PWM 模式 1
sConfigOC.Pulse = pulse; // 占空比初始值
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) {
Error_Handler();
}
// 启动 PWM 输出
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
}
int main() {
TIM2_PWM_Init(999, 500); // 设置周期为 1ms,占空比为 50%
while (1) {}
}
```
此代码片段展示了如何通过 TIM2 的通道 1 来实现 PWM 输出的功能[^2]。
---
#### 关于中断使用的补充说明
对于需要中断的应用场景,可以通过修改 `HAL_TIM_PeriodElapsedCallback` 函数来响应特定事件。例如,在主程序中判断当前定时器实例是否为 TIM2 并执行相应操作[^3]。
---
#### 注意事项
- 确保 GPIO 引脚已正确定义为复用功能(AFIO)。例如,TIM2_CH1 对应 PA0。
- 若使用高级外设(如 USART 或 SPI)占用某些通道资源,则可能需要调整至其他可用通道[^4]。
---
阅读全文
相关推荐


















