STM32定时器中断详解:基于定时器3的代码示例

这篇博客提供了一个基于STM32的通用定时器中断初始化代码示例,使用定时器3,每50ms触发一次中断,并讲解了如何设置时钟频率、预分频数、自动重装值等参数。代码中还包含了中断处理函数,演示了如何进行标志位设置、串口数据处理等操作。

#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. 时钟设置: 代码中将APB1时钟的2倍作为定时器3的时钟源,APB1的频率为36MHz。
  2. 定时器初始化: 使用 TIM_TimeBaseInit() 函数初始化定时器,设置自动重装值 (TIM_Period) 和预分频数 (TIM_Prescaler) 来控制中断周期。
  3. 中断使能: 通过 NVIC 结构体设置中断优先级,并使能定时器3中断。
  4. 中断处理函数: TIM3_IRQHandler() 函数在每次定时器中断触发时执行,例如每50ms。 在中断处理函数中,可以执行各种操作,例如更新标志位 (disFlag)、处理串口数据 (uartbusy, firstin, Count) 等等。

总结:

这段代码演示了如何使用STM32的定时器3产生周期性中断,并提供了一个简单的中断处理函数示例。通过修改定时器参数和中断处理函数的内容,可以实现各种定时任务。

STM32定时器中断详解:基于定时器3的代码示例

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

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