本代码是通用定时器中断初始化,使用的是定时器3。时钟选择为APB1的2倍,而APB1为36M。arr是自动重装值,psc是时钟预分频数。50ms的时间片。在中断服务函数中,检查指定的TIM中断发生与否,清除TIMx的中断待处理位。time50ms累加,如果时间片能被2整除,disFlag置1。如果uartbusy大于0,减1,否则firstin置0,Count清0。

#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;
			}					
		}
}

代码中使用定时器3,时钟源选择为APB1的2倍,即36MHz。通过设置自动重装值和预分频值实现50ms的时间片。在中断服务函数中,每当定时器溢出,时间片计数器time50ms加1。当时间片为偶数时,设置标志位disFlag。同时,根据uartbusy标志位判断UART是否繁忙,并进行相应的处理。

代码说明:

  • TIM3_Int_Init(u16 arr,u16 psc) 函数用于初始化定时器3中断,包括时钟使能、设置自动重装值、预分频值、中断优先级等。
  • TIM3_IRQHandler(void) 函数为定时器3中断服务函数,在中断发生时进行时间片计数、标志位处理、UART状态管理等操作。

应用场景:

该代码可应用于各种需要定时任务或周期性执行任务的场合,例如:

  • 计时器
  • 周期性数据采集
  • 周期性控制信号输出
  • 延时操作

注意事项:

  • 需要根据实际应用场景修改代码中的参数,例如自动重装值、预分频值、标志位等。
  • 建议在初始化定时器中断后,开启定时器3。
  • 中断服务函数应尽量简洁高效,避免长时间的运算或阻塞操作。

其他:

  • 可以通过修改代码中的参数来调整时间片的大小。
  • 可以根据需要添加其他标志位或进行其他操作。
  • 可以使用其他定时器来实现不同的功能。

总结:

本代码提供了STM32通用定时器3中断初始化的示例,并展示了在中断服务函数中实现一些常用功能的应用。通过理解该代码,可以更好地掌握STM32定时器中断的使用方法,并将其应用于实际项目中。

STM32通用定时器3中断初始化代码详解及应用

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

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