stm32TIM定时中断


中断优先级

配置NVIC来进行中断优先级配置(值越小,优先级越高)。

NVIC优先级分组

NVIC的优先级组通过NVIC_PriorityGroupConfig(NVIC_PriorityGroup_X)来配置X表示哪个分组。

NVIC组 抢占优先级 响应优先级
NVIC_PriorityGroup_0 0bits 4bits,可分为0-15
NVIC_PriorityGroup_1 1bits 3bits
NVIC_PriorityGroup_2 2bits 2bits
NVIC_PriorityGroup_3 3bits 1bits
NVIC_PriorityGroup_4 4bits 0bits
计数器计数频率

$$
CK_CNT = CK_PSC/(PSC+1)
$$

CK_CNT:定时器时钟,CK_PSC:定时器时钟源,PSC:预频分值。

计数器溢出频率

$$
CK_CNT_OV = CK_CNT/(ARR +1)=CK_PSC/(PSC+1)/(ARR+1)
$$

ARR:自动重装值。

PWM

PWM频率

$$
Freq =CK_CNT /(PSC+1)/(ARR+1)
$$

PWM占空比

$$
Duty=CCR/(ARR+1)
$$

PWM分辨率

$$
Reso = 1/(ARR+1)
$$

标准库PWM设置

以TIM2的通道4为例。

void TIM2_PWM_Config(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

    // 配置定时器周期为20ms(50Hz)
    TIM_TimeBaseStructure.TIM_Period = 2000 - 1; // 72MHz / 7200 = 10KHz (ARR)
    TIM_TimeBaseStructure.TIM_Prescaler = 720 - 1; // 10KHz / 720 = 50Hz (PSC)
    TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 时钟不分频
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 初始化TIM2

    // 配置PWM模式
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 输出使能
    TIM_OCInitStructure.TIM_Pulse = 150; // 初始位置1.5ms (初始值)
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 输出极性高
    TIM_OC4Init(TIM2, &TIM_OCInitStructure); // 使用通道4

    // 使能TIM2
    TIM_Cmd(TIM2, ENABLE);
    TIM_CtrlPWMOutputs(TIM2, ENABLE); // 主输出使能
}

PWM模式1和PWM模式2的区别

特性 PWM模式1 (TIM_OCMode_PWM1) PWM模式2 (TIM_OCMode_PWM2)
有效电平 计数器值 < TIM_Pulse 时有效 计数器值 ≥ TIM_Pulse 时有效
无效电平 计数器值 ≥ TIM_Pulse 时无效 计数器值 < TIM_Pulse 时无效
极性反转 通过 TIM_OCPolarity 配置 通过 TIM_OCPolarity 配置
适用场景 常规PWM控制 需要反向逻辑的PWM控制

文章作者: LsWorld
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 LsWorld !
评论
  目录