开启你的编程学习之旅

云课堂提供高质量的编程课程,从入门到精通,助你成为技术大牛

立即开始学习

stm32开发板教程

作者: 孙老师 更新: 2025-10-28 阅读: 32 难度: 初级
学习工具

4. STM32 定时器应用

STM32 拥有丰富的定时器资源,可用于精确计时、PWM 输出、输入捕获等功能。

定时器类型

  • 基本定时器(TIM6/TIM7):简单计数
  • 通用定时器(TIM2-TIM5):多功能定时器
  • 高级定时器(TIM1/TIM8):带死区控制的复杂应用

定时器基础配置

定时器初始化
TIM_HandleTypeDef htim2; // 配置定时器2 htim2.Instance = TIM2; htim2.Init.Prescaler = 7199; // 预分频器 htim2.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数 htim2.Init.Period = 9999; // 自动重装载值 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; // 初始化定时器 if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { Error_Handler(); } // 启动定时器 HAL_TIM_Base_Start(&htim2);

定时器中断

定时器中断配置
// 配置定时器中断 HAL_TIM_Base_Start_IT(&htim2); // 启动定时器并使能中断 // 设置 NVIC 优先级 HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM2_IRQn); // 定时器中断服务函数 void TIM2_IRQHandler(void) { HAL_TIM_IRQHandler(&htim2); } // 定时器溢出回调函数 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) { // 定时器2溢出处理 HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); } }

PWM 输出配置

PWM 生成
TIM_OC_InitTypeDef sConfigOC = {0}; // 配置 PWM 通道 sConfigOC.OCMode = TIM_OCMODE_PWM1; // PWM 模式1 sConfigOC.Pulse = 500; // 占空比 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; // 输出极性 sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; // 初始化 PWM 通道 if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } // 启动 PWM 输出 HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); // 动态调整占空比 __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 750);

定时器计算公式

定时时间计算
定时器时钟频率 = 系统时钟 / (预分频器 + 1) 定时器计数周期 = (自动重装载值 + 1) 定时时间 = 计数周期 / 定时器时钟频率 示例:系统时钟 72MHz,预分频器 7199,自动重装载值 9999 定时器时钟 = 72MHz / (7199 + 1) = 10kHz 计数周期 = 9999 + 1 = 10000 定时时间 = 10000 / 10kHz = 1秒
提示: 这是一个重要的概念,需要特别注意理解和掌握。
注意: 这是一个常见的错误点,请避免犯同样的错误。