定时中断模板子程序

// 启用 TIM2 外设时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

// 配置 TIM2 内部时钟
TIM_InternalClockConfig(TIM2);

// 定义 TIM 时间基础结构体
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

// 配置 TIM 时间基础结构体参数
TIM_TimeBaseStructure.TIM_Period = 999;                     // 设置计数器周期为 1000
TIM_TimeBaseStructure.TIM_Prescaler = 71;                   // 设置预分频器为 72
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     // 设置时钟分频为不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 设置计数器模式为向上计数
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;            // 设置重复计数器为 0
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);             // 初始化 TIM2

// 清除 TIM2 的更新标志位
TIM_ClearFlag(TIM2, TIM_FLAG_Update);

// 启用 TIM2 的更新中断
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

// 配置 NVIC 的优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

// 定义 NVIC 初始化结构体
NVIC_InitTypeDef NVIC_InitStructure;

// 配置 NVIC 初始化结构体参数
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;           // 设置 TIM2 的中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 设置抢占优先级为 0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        // 设置子优先级为 0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           // 使能中断通道
NVIC_Init(&NVIC_InitStructure);                           // 初始化 NVIC

// 启动 TIM2 计数器
TIM_Cmd(TIM2, ENABLE);

子程序调用

// 定义 TIM2 中断处理函数
void TIM2_IRQHandler(void)
{
    // 检查 TIM2 更新中断是否发生
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
    {

        // 在这里编写定时中断触发时的处理代码

        // 清除 TIM2 更新中断标志位
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    }
}

TIM_ClearFlag(TIM2, TIM_FLAG_Update);TIM_ClearITPendingBit(TIM2, TIM_IT_Update); 都是用于清除定时器2的更新事件标志位,但它们的实现方式略有不同,适用于不同的情况。

  1. TIM_ClearFlag(TIM2, TIM_FLAG_Update);:

    • 这个函数用于清除指定定时器的特定事件标志位,其中 TIM_FLAG_Update 表示定时器的更新事件标志位。

    • 这个函数不仅可以用于清除中断标志位,还可以用于清除定时器的其他类型的事件标志位。

    • 如果需要清除多个不同类型的事件标志位,可以多次调用这个函数并传入相应的事件标志位。

  2. TIM_ClearITPendingBit(TIM2, TIM_IT_Update);:

    • 这个函数专门用于清除指定定时器的更新事件中断标志位,其中 TIM_IT_Update 表示定时器的更新事件中断标志位。

    • 这个函数仅用于清除更新事件中断标志位,不能用于清除其他类型的事件标志位。

    • 如果只需清除定时器更新事件中断标志位,建议使用这个函数,因为它更加专用和精确。

综上所述,两者的区别在于 TIM_ClearFlag 可以清除定时器的所有类型的事件标志位,而 TIM_ClearITPendingBit 仅用于清除特定类型的中断标志位。

往事堪堪亦澜澜,前路漫漫亦灿灿。