定时中断模板子程序
// 启用 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的更新事件标志位,但它们的实现方式略有不同,适用于不同的情况。
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
:这个函数用于清除指定定时器的特定事件标志位,其中
TIM_FLAG_Update
表示定时器的更新事件标志位。这个函数不仅可以用于清除中断标志位,还可以用于清除定时器的其他类型的事件标志位。
如果需要清除多个不同类型的事件标志位,可以多次调用这个函数并传入相应的事件标志位。
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
:这个函数专门用于清除指定定时器的更新事件中断标志位,其中
TIM_IT_Update
表示定时器的更新事件中断标志位。这个函数仅用于清除更新事件中断标志位,不能用于清除其他类型的事件标志位。
如果只需清除定时器更新事件中断标志位,建议使用这个函数,因为它更加专用和精确。
综上所述,两者的区别在于 TIM_ClearFlag
可以清除定时器的所有类型的事件标志位,而 TIM_ClearITPendingBit
仅用于清除特定类型的中断标志位。