定时器中断

本文详细介绍了STM32中TIM3定时器的配置过程及计算方法。通过设置TIM3的预分频器和自动重装载寄存器,实现500ms的定时周期,并展示了中断服务函数的具体实现。
系统初始化的时候在默认的系统初始化函数 SystemInit 函数里面已经初始化 APB1 的时钟为 2 分频,

所以 APB1 的时钟为 36M。当 APB1 的时钟分频数为 1 的时候,TIM2~7 的时钟为 APB1 的时钟,而如果 APB1 的时钟分频数不为 1,那么 TIM2~7 的时钟频率将为 APB1 时钟的两倍。因此, TIM3 的时钟为 72M。

Tout= ((arr+1)*(psc+1))/Tclk;
其中:
Tclk:TIM3 的输入时钟频率(单位为 Mhz)。
Tout:TIM3 溢出时间(单位为 us)。
TIM1 & TIM8为高级定时器,挂载在APB2上。
下面以TIM3为例讲诉库函数下定时器中断的配置。


void TIM3_Init(u16 arr,u16 psc)  //arr重载计数周期 psc分频系数
{
		
	TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); 
	
	TIM_TimeBaseStructure.TIM_Period = arr;    
	TIM_TimeBaseStructure.TIM_Prescaler =psc;  
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 	
	IM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;    //计数模式向上计数
	
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 
	
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );   //使能TIM3外设
	//中断优先级配置
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;			
  	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;	//抢占优先级3
  	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;		//响应优先级1
  	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								
  	NVIC_Init(&NVIC_InitStructure); 
	
	TIM_Cmd(TIM3, ENABLE);  //使能中断
}

void TIM3_IRQHandler(void)    //中断服务函数
{
	if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //判断中断使能和标志位
	{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update   );   //清除标志位
		LED1=!LED1;
	}
}

TIM_GetITStatus 函数中会先判断这种中断是否使能,使能了才去判断中断标志位,而TIM_GetFlagStatus 直接用来判断状态标志位。
在main函数中调用TIM3_Init(4999,7199);
Tout= ((4999+1)*( 7199+1))/72=500000us=500ms。
所以TIM3溢出时间周期为500ms。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值