STM32F10X系列有高级控制定时器(TIM1和TIM8)>通用定时器(TIMx)>基本定时器(TIM6和TIM7)。TIM6 和 TIM7,没有有输入捕获功能
主要有三个用途:普通的定时器中断、产生PWM波、输入捕获。
//“产生UEV事件”有待商榷,还关系到下面要说的“屏蔽”、“重复计数器RCR”
一、打开时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
二、初值、分频、变化模式
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
第一个参数用于选择TIM外设,可以是TIM3、TIM4、TIM5。
第二个参数是一个指向TIM_TimeBaseInitTypeDef的结构体指针,他包含了时间基数的配置信息。
typedef
struct
{
u16
TIM_Period;
u16
TIM_Prescaler;
u8
TIM_ClockDivision;
u16 TIM_CounterMode;
}
TIM_TimeBaseInitTypeDef;
TIM_Period:设置自动重装载寄存器ARR的值,0×0000到0xFFFF;
TIM_Prescaler: 设置定时器的预分频系数, 0×0000到0xFFFF;
TIM_ClockDivision:设置时钟分频系数,TIM_CKD_DIVx (x = 1、2、4);??不知??目测和采样滤波有关
TIM_CounterMode:定时器计数方式,因人而异,我一般使用向上计数,取值如下
TIM_CounterMode_Up TIM 向上计数模式
TIM_CounterMode_Down TIM 向下计数模式
TIM_CounterMode_CenterAligned1 TIM 中央对齐模式 1 计数模式
TIM_CounterMode_CenterAligned2 TIM 中央对齐模式 2 计数模式
TIM_CounterMode_CenterAligned3 TIM 中央对齐模式 3 计数模式
三、TIM中断
void TIM_ITConfig(TIM_TypeDef* TIMx, u16 TIM_IT, FunctionalState NewState);
第一个参数用于选择TIM外设,可以是TIM3、TIM4、TIM5。发现3.5库只有TIM1-4的中断通道???
第二个参数用于指定TIM中断源,这里我们指定整个中断源(TIM_IT_Update )
TIM_IT_Update TIM 中断源 //计数溢出时
TIM_IT_CC1 TIM 捕获/ 比较 1 中断源
TIM_IT_CC2 TIM 捕获/ 比较 2 中断源
TIM_IT_CC3 TIM 捕获/ 比较 3 中断源
TIM_IT_CC4 TIM 捕获/ 比较 4 中断源
TIM_IT_Trigger TIM 触发中断源
第三个参数用于指定的中断使失能,取值ENABLE、DISABLE;
四、使能TIM定时器( 使能前最好清除TIM3更新中断标志 TIM_ClearITPendingBit(TIM3, TIM_IT_Update); )
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
第一个参数用于选择TIM外设,同上。
第二个参数ENABLE或DISABLE。
五、设置NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel =
TIM3_IRQn;
//TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =
0;
//先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority =
3;
//从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//IRQ
通道被使能
NVIC_Init(&NVIC_InitStructure);
//初始化NVIC寄存器
六、编写中断函数
void TIM3_IRQHandler(void)
//TIM3中断
{
if (TIM_GetITStatus(TIM3,
TIM_IT_Update) != RESET)
//检查TIM3更新中断发生与否
{
TIM_ClearITPendingBit(TIM3,
TIM_IT_Update ); //清除TIM3更新中断标志
//add your
code
}
}
七、额外
TIM_DeInit(TIM4);//最好在设置开始处调用
TIM_InternalClockConfig(TIM4);//使用内部时钟:【规则:若APB1分频为1则直接采用APB时钟,否则使用APB时钟X2】
上面的TIM_Prescaler是定时器内部的再分频
原文:http://www.cnblogs.com/2cats/p/3579185.html