1.定时中断基本结构
1.1 定时中断流程:
(1)先时钟使能。
(2)内外时钟源选择。
(3)配置时基单元。
(4)定时器中断配置。
(5)配置NVIC。
(5)使能定时器外设。
1.2 定时中断内部解析
预分频器之前,连接的是基准计数时钟的输入,由于基本定时器只能选择内部时钟,所以可以看作内部时钟(CK_INT)直接连接的预分频器,来着RCC的TIMxclk一般是72MHZ;定时器实际分频系数 = 预分频器数值 + 1,预分频器为16位,所以最大为65535,因此最大分配系数为65536。计数器是对分频后的时钟进行计数,每来个上升沿,计数值+1,计数器是16位的,因此最大计数值的范围是0~65535,当计数器的值等于自动重装的值时,产生了一次中断信号,并计数器的值清零,CPU响应更新中断,也会产生一个更新事件。
2.定时器中断计算
(1)计数器计数频率:CK_CNT = CK_PSC / (PSC+1)
(2)计数器溢出频率:CK_CNT_OUT = CK_CNT / (ARR+1)
= CK_PSC / (PSC+1) / (ARR+1)
注:CK_PSC = 72MHZ(CK_PSC的定时器时钟TIMxclk,经过APB1预分频器后分频提供)
PSC:预分频值。
ARR:自动重装值。
3.定时中断流程相关函数(利用内部时钟)
3.1.开启定时器时钟(TIM2为例)
RCC_APB1PerphClockCmd(TIM2,ENABLE);
3.2.定时器选择内部时钟源
void TIM_InternalClockConfig(TIM_TypeDef * TIMx);
3.3.配置时基单元
void TIM_TimeBaseInit(TIM_TypeDef * TIMx,TIM_TimeBaseInitStructure)
3.4.配置输出中断,允许更新中断输出到NVIC
void TIM_ITConfig(TIM_TypeDef * TIMx,uint16_t TIM_IT,FunctionalState NewState);
3.5.配置NVIC
(1)进行优先级分配
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
(2)初始化NVIC
void NVIC_Init(NVIC_InitTypeDef *NVIC_InitStruct);
3.6.运行控制
void TIM_Cmd(TIM_TypeDef * TIMx,FunctionalState NewState);
3.7.读取,清除标志位函数
FlagStatus TIM_GetFlagStatus(TIM_TypeDef * TIMx,uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef * TIMx,uint16_t TIM_FLAG);
ITStatus TIM_GetFlagStatus(TIM_TypeDef * TIMx,uint16_t TIM_IT);
void TIM_ClearITPendingBit=(TIM_TypeDef * TIMx,uint16_t TIM_IT);
3.8.定时中断的中断函数模板
void TIMx_IRQHandler(void)
{
if(FlagStatus TIM_GetFlagStatus(TIMx,TIM_IT_Updata == SET))
{
..........
TIM_ClearITPendingBit=(TIMx,TIM_IT_Updata);
}
}
4.定时中断功能
1.定时执行任务。
2.精确定时。
3.节约系统资源。
4.实现复杂功能。
5.提高系统性能。