时间记录:2024/1/30
一、时钟介绍(TIM2-TIM5)
(1)通用定时器时钟频率介绍
内部时钟AHB为72MHz,经过APB1预分频器2分频变为36MHz,TIMxClk定时器时钟由时钟树可以看出,如果APB1预分频系数不为1则频率x2,所以频率为72MHz
(2)定时时间计算
1.2.1 TIMxCLK的频率为72MHz,一个时钟周期时间为1/TIMxCLK=1/72M(s)
1.2.2 然后经过定时器预分频器对TIMxCLK进行分频,频率为F=TIMxCLK/(TIM_Prescaler+1),TIM_Prescaler为预分频系数,值可以为0x0000-0xFFFF,是一个16位寄存器,经过分频后一个时钟周期时间为(TIM_Prescaler+1)/TIMxCLK(s)
1.2.3 然后根据自动重装载值的数确定计数多少个周期到达指定时间,计时时间time=(TIM_Period+1)/F,TIM_Period为自动重装载值,同样是一个16位寄存器,值可以为0x0000-0xFFFF
1.2.4 计时1s示例,定时器预分频器值设置7199,自动重装载值寄存器值设置9999
F=72M/7200=10K
time=10000/10K=1s
二、TIM通用定时器示例代码
(1)头文件
#ifndef __TIMER_H__
#define __TIMER_H__
#include <stm32f10x.h>
void vTim2Init(u16 psc,u16 arr);
extern void (*vTim2Callback)(void);
#endif
(2)源文件
#include "timer.h"
void (*vTim2Callback)(void);
void vTim2Init(u16 psc,u16 arr)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能时钟
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//计数模式,向上计数
TIM_TimeBaseInitStruct.TIM_Period=arr-1;//自动重装载值寄存器
TIM_TimeBaseInitStruct.TIM_Prescaler=psc-1;//定时器预分频器寄存器
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);//初始化timer配置timer参数,配置时基参数
//配置中断管理NVIC
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;//主优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;//子优先级
NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志,使能前先进行清除中断,不然可能会引发错误
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//配置定时器中断
TIM_Cmd(TIM2,ENABLE);//使能/开启定时器
}
//定时器中断函数
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET){//发生中断
vTim2Callback();//到达时间触发中断,调用回调函数
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志
}
}