stm32G431通用定时器
时间: 2025-06-06 10:33:05 浏览: 25
### STM32G431 微控制器中通用定时器的用法与配置
#### 什么是通用定时器?
STM32G431 中的通用定时器是一种多功能外设,能够实现计数、捕获输入信号的时间戳以及生成精确的 PWM 输出等功能。这些定时器通常由一个自动重载寄存器和预分频器组成,允许灵活调整计时周期和分辨率。
#### 定时器的主要组成部分
- **计数器 (Counter)**:负责递增或递减操作。
- **预分频器 (Prescaler)**:用于降低计数器时钟频率。
- **自动重装载寄存器 (Auto Reload Register)**:定义计数器的最大值。
- **捕获/比较寄存器 (Capture/Compare Registers)**:存储捕获到的计数值或者设置要匹配的值。
#### 配置流程概述
以下是通过 HAL 库配置 STM32G431 的通用定时器的一个典型示例:
```c
#include "stm32g4xx_hal.h"
TIM_HandleTypeDef htim;
void TIM_Config(void) {
__HAL_RCC_TIM2_CLK_ENABLE(); // 启用 TIM2 时钟
htim.Instance = TIM2; // 设置使用的定时器实例
htim.Init.Prescaler = 63999; // 设定预分频器值为 63999, 即系统时钟除以 64000
htim.Init.CounterMode = TIM_COUNTERMODE_UP; // 计数模式向上计数
htim.Init.Period = 999; // 自动重装载值设定为 999, 对应于 1ms 周期
htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim) != HAL_OK) { // 初始化定时器基本参数
Error_Handler();
}
}
```
上述代码片段展示了如何初始化一个通用定时器(此处为 TIM2),并将其配置为每毫秒触发一次中断[^2]。
#### 使用场景举例
##### 场景一:延时功能
利用通用定时器可以轻松实现精准延时效果而无需阻塞 CPU 资源。当达到指定条件时,会触发回调函数来通知应用程序继续执行下一步逻辑。
```c
uint32_t delay_ms(uint32_t ms){
uint32_t tickstart = HAL_GetTick();
while((HAL_GetTick() - tickstart ) < ms);
}
// 或者使用定时器中断方式代替轮询等待...
__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
static uint8_t counter=0;
if(htim->Instance==TIM2 && ++counter>=desired_count){
Counter_reset();// 清零计数变量
Do_something_after_delayed_time(); // 执行延迟后的动作
}
}
```
##### 场景二:脉宽调制(PWM)
除了作为简单的计时工具之外,还可以借助该模块输出不同占空比的方波信号给外部负载比如LED灯泡亮度调节或是直流电机速度控制等场合下非常有用。
```c
static void MX_TIM_PWM_Init(void){
GPIO_InitTypeDef GPIO_InitStruct={};
/* Enable the clock */
__HAL_RCC_GPIOA_CLK_ENABLE();
/** Configure pin PA_5 as alternate function push-pull output type for generating pwm signal on this line */
GPIO_InitStruct.Pin =GPIO_PIN_5 ;
GPIO_InitStruct.Mode =GPIO_MODE_AF_PP ;
GPIO_InitStruct.Pull =GPIO_NOPULL ;
GPIO_InitStruct.Speed =GPIO_SPEED_FREQ_LOW ;
GPIO_InitStruct.Alternate =GPIO_AF2_TIM2 ;
HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);
/* Initialize timer handle structure and set its properties according to our needs*/
htim_pwm.Instance =TIM2 ;
htim_pwm.State =HAL_TIM_STATE_RESET ;
htim_pwm.Init.Prescaler =(SystemCoreClock /1000)-1;// Set prescale value so that we get one kHz frequency at output pins.
htim_pwm.Init.CounterMode =TIM_COUNTERMODE_UP ;
htim_pwm.Init.Period =ARR_Value_for_duty_cycle_of_fifty_percent -(1);/* ARR Value should be less than or equal maximum allowed by hardware.*/
htim_pwm.Init.ClockDivision =TIM_CLOCKDIVISION_DIV1 ;
htim_pwm.Init.AutoReloadPreload =TIM_AUTORELOAD_PRELOADED ;
/* Call actual initialization routine provided within STMicroelectronics' Standard Peripheral Library*/
HAL_TIM_PWM_Init (&htim_pwm );
/* Start counting upwards from zero towards auto-reloaded register content whenever an update event occurs inside channel configuration block below.. Note here also how duty cycle percentage affects both CCRx registers values accordingly! */
HAL_TIM_PWM_Start (&htim_pwm ,TIM_CHANNEL_1 );
}
```
以上程序段说明了怎样开启一个PWM通道,并且设置了相应的引脚映射关系以便实际硬件电路连接起来之后可以看到预期的效果即点亮某个发光二极管元件并且改变其闪烁速率取决于所选参数的不同组合情况之下产生的结果表现形式各异而已[^3].
#### 注意事项
在设计具体项目之前,请务必查阅最新的《STM32G4系列参考手册》获取最权威的技术细节描述信息[^1]。
阅读全文
相关推荐


















