基础知识
1.定时器分类
2.定时器时钟来自PCLK1(APB1),时钟源频率TIMxCLK=72M
3.真正计数用的时钟还需要进行分频,可进行1~65536之间的任何一个数进行分频。最终的计数频率为CK_CNT=TIMxCLK/(PSC+1) (对应库函数中TIM_TimeBaseInitTypeDef结构体中的TIM_Prescaler成员)
4.自动重装寄存器ARR是一个16位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。 (对应库函数中TIM_TimeBaseInitTypeDef结构体中的TIM_Period成员)
5.中断函数中切记要清除中断标志位,否则会出错!(对应库函数中的TIM_ClearITPendingBit函数)
编程步骤
1.配置NVIC中断控制器
2.初始化时基初始化结构体
3.使能定时器中断
4.打开定时器
5.编写中断服务函数
代码实现
(1)配置NVIC中断控制器
#define BASIC_TIM_IRQ TIM6_IRQn
static void Basetime_NVIC_Config()
{
NVIC_InitTypeDef NVIC_InitStructure;
// 设置中断组为0
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);
}
(2)配置基本定时器工作的相关参数以及打开中断,使能定时器
static void Basetime_Mode_Config()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
//自动重装寄存器中的值
TIM_TimeBaseInitTStructure.TIM_Period=1000-1;
//时钟预分频数为71,则驱动计数器的时钟CK_CNT=CK_INT/(71+1)=1M
TIM_TimeBaseInitTStructure.TIM_Prescaler=71;
//初始化定时器
TIM_TimeBaseInit(TIM6,&TIM_TimeBaseInitTStructure);
//清除定时器中断标志位
TIM_ClearFlag(TIM6,TIM_FLAG_Update);
//开启计数器中断
TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
//使能计数器
TIM_Cmd(TIM6, ENABLE);
//暂时关闭定时器的时钟,等待使用
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,DISABLE);
}
(3)编写中断服务函数(切记清除中断标志!)
#define BASIC_TIM_IRQHandler TIM6_IRQHandler
void BASIC_TIM_IRQHandler(void)
{
if(TIM_GetITStatus(TIM6,TIM_IT_Update)==SET)
{
TIM_ClearITPendingBit(TIM6,TIM_IT_Update);
Timer_count_1ms++;
}
}
基本定时器的用法较为简单,与8051的用法类似,无非这里用库函数封装起来了。