首页 > 代码库 > 定时器中断
定时器中断
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 }
定时器中断