2017-12-20
已有 275 次阅读2017-12-20 20:27
|系统分类:兴趣爱好
1 #include "timer.h"
2 #include "led.h"
3 //通用定时器中断初始化
4 //这里时钟选择为APB1的2倍,而APB1为36M
5 //arr:自动重装值。
6 //psc:时钟预分频数
7 //这里使用的是定时器3!
8 void Timerx_Init(u16 arr,u16 psc)
9 {
10 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
11 NVIC_InitTypeDef NVIC_InitStructure;
12
13 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
14
15 TIM_TimeBaseStructure.TIM_Period = 5000; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值,计数到5000为500ms
16 TIM_TimeBaseStructure.TIM_Prescaler =(7200-1); //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率
17 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
18 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
19 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
20
21
22 TIM_ITConfig( //使能或者失能指定的TIM中断
23 TIM3, //TIM2
24 TIM_IT_Update | //TIM 中断源
25 TIM_IT_Trigger, //TIM 触发中断源
26 ENABLE //使能
27 );
28
29 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
30 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
31 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
32 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
33 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
34
35 TIM_Cmd(TIM3, ENABLE); //使能TIMx外设
36
37 }
38
39 void TIM3_IRQHandler(void) //TIM3中断
40 {
41 if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
42 {
43 TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
44
45 //GPIO_WriteBit(GPIOD, GPIO_Pin_2, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOD, GPIO_Pin_2)));
46 LED1=!LED1;
47 }
48 }