首页 > 代码库 > 定时器中断

定时器中断

STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。

TIM1和TIM8是能够产生3对PWM互补输出的高级定时器,常用于三相电机的驱动,时钟由APB2的输出产生;TIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。

通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。

通用TIMx定时器特性包括:
●16位向上,向下,向上/向下自动装载计数器
● 16位可编程预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
●4个独立通道:(定时器通道是什么意思?在PWM一节中有提到...
  − 输入捕获
  − 输出比较
  − PWM生成(边缘或中间对齐模式)
  − 单脉冲模式输出
● 使用外部信号控制定时器和定时器互连的同步电路
● 如下事件发生时产生中断/DMA:
  − 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
  − 触发事件(计数器启动,停止,初始化或者由内部/外部触发计数)
  − 输入捕获
  − 输出比较

定时器的RCC时钟部分:

APB1和APB2所连的外设如下:

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------->

定时器中断的一般步骤:(以TIM2为例)

1.定时器时钟使能    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

2.中断配置  定义结构体、清空定时器2的中断位、设置初始值、设置预分频、时钟分割、计数方式、使能、打开中断、打开定时器外设资源。

3.中断优先级配置   定义结构体、确定分组、设置IRQ通道、设置抢占优先级、设置从优先级、通道使能、使能。

4.中断服务程序

测试用例:(以TIM2为定时器控制LED发光状态)

 1 #include "pbdata.h" 2 #include "misc.h" 3 #include "stm32f10x_exti.h" 4 #include "stm32f10x_tim.h" 5  6 void RCC_Configration(void) 7 { 8      SystemInit(); 9      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);10      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);      //定时器时钟使能11 }12 13 void GPIO_Configration(void)14 {15     GPIO_InitTypeDef GPIO_InitStructure;16     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;17     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;18     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;19     GPIO_Init(GPIO_LED,&GPIO_InitStructure);20 }21 22 /*23   *中断配置*24             */25 void TIM_Configuration(void)26 {27     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;    28     TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清空定时器3的中断位29 30     TIM_TimeBaseStructure.TIM_Period = 2000;            //设置初始值,定时1s31     TIM_TimeBaseStructure.TIM_Prescaler = 35999;   //设置预分频32     TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割33     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //向上计数34     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);35 36     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);  //打开中断37     TIM_Cmd(TIM2,ENABLE);                 //定时器外设打开38 }39 40 void NVIC_Configuration(void)         //设置优先级41 {42        NVIC_InitTypeDef NVIC_InitStructure; 43     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);                                                      44     NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;       //使能指定的IRQ通道45     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //指定成员NVIC_IRQChannel的抢占优先级46     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;            //指定成员NVIC_IRQChannel的从优先级47     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 48     NVIC_Init(&NVIC_InitStructure);//初始化外设NVIC寄存器49 }50    51 int main(void)52 {53         RCC_Configration();54         GPIO_Configration();55         TIM_Configuration();56         NVIC_Configuration();57         while(1);58 }

 

定时器中断