自学留用
定时器中断实现步骤
void TIM3_Int_Init(u16 arr, u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period = arr;
TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM3,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
}
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update) == SET)
{
LED1 =! LED1;
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
TIM_TimeBaseInitTypeDef配置
TDTS和TDTG解释
TDTG为系统周期时长乘以倍数,这个值用于计算最终死区时间,也叫作步长。

1.为什么需要分频器
例如stm32f407中主频为168MHz,但是定时器为16位定时器(即0~65535)
分频之后
//对于168MHZ的频率,500ms中断一次,这两个参数设置如下:
TIM_Prescaler=16799; //预分频值
TIM_Period=4999; //下一个更新事件装入活动的自动重装载寄存器周期的值
分频16799,用168000000/7200=10000Hz
此时的周期就是1/10000=0.0001s
500ms=0.0001s*5000次
5000-1=4999次
即通过4999次系统的运行,就是500ms
2.TIM_ClockDivision是什么,如何配置
tDTS为tCK_INT的时钟分频因子的倍数
不分割就是说明CK_INT=167/167=1MHz,那么fDTS=1MHZ,tDTS=1us,即分频系数为n,tTDS为tCK_INT的n倍。
常用于读取电平信号持续多长时间才是有效信号。
被采样频率应至少为采样频率的1/2。
3.TIM_OCInit();和TIM_ICInit();解释
TIM_OCInit():用于初始化输出比较通道参数,如输出模式、极性、脉冲宽度等。
TIM_ICInit():用于初始化输入捕获通道参数,如输入捕获模式、捕获极性、滤波器设置等。
几种定时器介绍(高级定时器、通用定时器、基本定时器)

通用定时器内部结构图

