定时器中断

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;            //设置初始值,定时1s
31     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 }
当你坚持做一件完全正确的事情,有可能在很长一段时间内,你的价值都是零。
原文地址:https://www.cnblogs.com/lweleven/p/tim2.html