该代码是一个STM32的定时器中断初始化函数 TIM3_Int_Init,用于初始化定时器3的中断。其中,时钟选择为APB1的2倍,而APB1为36M,'arr'表示自动重装值,'psc'表示时钟预分频数,这里使用的是定时器3。

在中断处理函数 TIM3_IRQHandler 中,首先通过检查指定的TIM中断发生与否来判断是否进入中断处理程序,然后清除TIMx的中断待处理位,并对'time50ms'进行累加。最后,根据条件进行相应的操作,如设置'disFlag'为1、减少'uartbusy'等。

代码解析

#include 'timer.h'
#include 'led.h'

//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!

u32 time50ms=0;		//50ms  时间片

extern u8 disFlag ;

extern unsigned char firstin;
extern unsigned char Count;
extern unsigned char  uartbusy;

void TIM3_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 计数到5000为500ms
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

//**All notes can be deleted and modified**//
	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_InitStruct中指定的参数初始化外设NVIC寄存器

	TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
	
	
}

void ctrlPwmTime(void);
void TIM3_IRQHandler(void)   //TIM3中断
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
		{
			TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
			time50ms++;
			
			if(time50ms%2==0)
			{
				disFlag =1;	
			}
			
			if(uartbusy>0)
			{
				uartbusy--;
			}
			else
			{
				firstin =0;
				Count=0;
			}					
		}
}

详细解释

1. 时钟配置:

  • RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); : 使能定时器3的时钟,APB1时钟频率为36M,选择APB1的2倍作为定时器3的时钟源,即72M。

2. 定时器参数配置:

  • TIM_TimeBaseStructure.TIM_Period = arr;: 设置自动重装值,计数器计数到这个值时会重新开始计数,决定中断周期的长度。
  • TIM_TimeBaseStructure.TIM_Prescaler =psc;: 设置预分频值,将定时器3的时钟频率进行分频,决定计数器的计数频率。
  • TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;: 设置计数模式为向上计数,从0开始计数直到自动重装值,然后重新开始计数。

3. 中断配置:

  • NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;: 设置中断通道为TIM3中断。
  • NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;: 设置先占优先级为0级。
  • NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;: 设置从优先级为3级。
  • NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;: 使能中断通道。

4. 中断处理函数:

  • TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET: 检查指定的TIM中断发生与否,即定时器3是否计数到自动重装值。
  • TIM_ClearITPendingBit(TIM3, TIM_IT_Update);: 清除TIMx的中断待处理位,避免中断重复触发。
  • time50ms++;: 对时间片计数变量进行累加,用来记录时间。
  • 根据'time50ms','uartbusy'等变量的值进行不同的操作,如设置'disFlag'、减少'uartbusy'、重置计数器等。

总结

通过以上代码解析,我们可以清楚地了解STM32定时器3中断初始化的步骤和流程,并理解中断处理函数中各个操作的意义和作用。此代码示例可以作为STM32定时器3中断应用开发的参考,可以根据具体的应用需求进行修改和扩展。

STM32 定时器3 中断初始化详解

原文地址: https://www.cveoy.top/t/topic/jzDV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录