timer4.c
1.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include "timer4.h"
Uart_Timer timer4;
static void TIM4_Init(uint16_t arr,uint16_t psc)//定时器2中断初始化
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//TIM4时钟使能
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler = psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM4, TIM_FLAG_Update);//解决了定时器初始化后立即进入中断的bug(无论是否定时器启动)!!!!!!!!!!!!!!!!!!!!
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM4中断,允许更新中断
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM4, DISABLE); //关闭TIM4
}
static void TIM4_Start(void)
{
TIM_Cmd(TIM4, ENABLE); //关闭TIM4
}
static void TIM4_Stop(void)
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);//清除TIM4更新中断标志
TIM_Cmd(TIM4, DISABLE); //关闭TIM4
}
static void TIM4_Clear(void)
{
TIM_SetCounter(TIM4,0);//计数器清空
}
void timer4_init(void (*callback)())
{
timer4.callback =callback;
timer4.start=TIM4_Start;
timer4.stop=TIM4_Stop;
timer4.timeclear=TIM4_Clear;
TIM4_Init(10*20-1,7200-1); //设置最大超时时间为40ms
}
void TIM4_IRQHandler(void)//定时器4中断服务程序
{
if(TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)//是更新中断
{
timer4.stop();
timer4.callback();
}
else
{
}
}