了解STM32定时器中断,首先要知道定时器的基本原理,如下图
从上图可知,来自内部的时钟信号通过触发控制器或控制器到达时基单元,从而产生了中断或者事件或者DMA请求。其中事件又可以通过TRGO主模式触发DAC的转换,此模式避免了系统频繁进中断,从而影响其他程序的运行。定时器中断的代码如下:
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//滤波器的采样时钟分频
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInitStructure.TIM_Period=10000-1; // 自动重装载值ARR
TIM_TimeBaseInitStructure.TIM_Prescaler=7200-1; //预分频系数
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0; //高级定时器专用
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //定时器中断使能
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn; //指定中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; //响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能
NVIC_Init(&NVIC_InitStructure); ///NVIC初始化
TIM_Cmd(TIM2,ENABLE);
其中时钟信号通过滤波器修整以后,到达触发器控制器模块。再进入时基单元,产生中断。
通用定时器在基本定时器的基础上,增加了更多的时钟输入方式还有输入捕获和输出比较模块,相应模块的增多导致中断类型的增多,所以要增加中断的控制,来选择需要输出的中断。注意定时器的核心是时基单元,通过预分频,自动重装和计数器,输出中断事件或者DMA请求,同时配合下方的输出比较寄存器和相应的输入输出电路,来输出比较或者输入捕获。注意此处输出比较和输入捕获共用了通道还有捕获比较寄存器。对于输出比较和输入捕获,会有具体的章节来详细说明。