定时器有高级定时器、通用定时器、基本定时器三种类型。具体功能如下。上面是每种定时器所具有的功能。
我们可以看到每种定时器都有一个定时功能,(可能是名字的由来吧)。当然,每个定时器都可以来使用定时功能,但是我们往往在基本定时器和通用定时器上面使用。其实,当我们学过外部中断后,理解定时器的定时功能可能比较容易,就是将我们的外部信号变成了一个时间断,一样要配置中断,一样要配置优先级。下面的讲述,更加偏向应用,诚然,我们需要了解定时器的结构原理,注意我这里说的是了解,如果你要去完完全全搞懂需要花一定的时间和精力,而我们需要的是更快的上手,在实践中去慢慢一点点消化。
我这里不讨论那个寄存器那个位啥的巴拉巴拉。大家也不爱听,我直接介绍需要配置的参数。
流程就是
1开启定时器时钟,即内部时钟
ADVANCE_TIM_APBxClock_FUN
2配置的参数
TIM_TimeBaseStructure.TIM_Period 初始值,计数完的时候自动变成这个数TIM_TimeBaseStructure.TIM_Prescaler? ?让传进来的信号除以自己想要的数
TIM_TimeBaseStructure.TIM_ClockDivision时钟分频因子 ,没用到不用管
TIM_TimeBaseStructure.TIM_CounterMode?计数器计数模式,设置为向上计数或者向下
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;??重复计数器的值,没用到不用管 ?
3初始化定时器
? TIM_TimeBaseIni
4清除计数器中断标志位
?TIM_ClearFlag清除计数器中断标志位
?TIM_ITConfig开启计数器中断
?5配置中断优先级
代码省略??
6写中断服务函数
代码省略??
? 注意事项
1.基本定时器中代码和高级定时器还有通用定时器中需要配置的参数有区别,我们有两种方法第一种我们先给定时器赋一个初始值然后改我们需要的就行,第二种,我们把全部参数都配置一遍,不需要的配置为0就行 ,还有以下几种注意
tatic void BASIC_TIM_NVIC_Config(void)//参数按自己的要求
{
NVIC_InitTypeDef NVIC_InitStructure;
// 抢占优先级的位
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
// 设置中断来源
NVIC_InitStructure.NVIC_IRQChannel = BASIC_TIM_IRQ ;
// 设置主优先级为 0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
// 设置抢占优先级为3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*
* 注意:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有
* TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,
* 另外三个成员是通用定时器和高级定时器才有.
static void BASIC_TIM_Mode_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// 开启定时器时钟,即内部时钟CK_INT=72M
BASIC_TIM_APBxClock_FUN(, ENABLE);
// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
TIM_TimeBaseStructure.TIM_Period = 1000-1;
// 时钟预分频数为
TIM_TimeBaseStructure.TIM_Prescaler= 71;//0-71就是32
// 时钟分频因子 ,基本定时器没有,不用管
//TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
// 计数器计数模式,基本定时器只能向上计数,没有计数模式的设置
//TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
// 重复计数器的值,基本定时器没有,不用管
//TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
// 初始化定时器
TIM_TimeBaseInit(, &TIM_TimeBaseStructure);
// 清除计数器中断标志位
TIM_ClearFlag(, );
// 开启计数器中断
TIM_ITConfig(,,ENABLE);
// 使能计数器
TIM_Cmd(, ENABLE);
}
下面是中断服务函数写在stm32f10x_it.c中
void BASIC_TIM_IRQHandler (void)//这个函数名在stm32f10x.h中去找
{
if ( )
{
TIM_ClearITPendingBit(BASIC_TIM , TIM_FLAG_Update);
} //都叫更新中断就是重新开始呗 TIM_IT_Update
}
有些配置自己去按需求填写。