这段代码是 STM32 微控制器中定时器3中断初始化和处理函数的示例。

代码首先包含了timer.hled.h两个头文件,这两个头文件分别定义了定时器和LED相关的宏定义、结构体和函数。

接着,定义了time50ms变量,该变量用于记录50ms时间片,并在中断处理函数中进行更新。

接着,定义了TIM3_Int_Init函数,该函数用于初始化定时器3中断。函数参数包括arrpsc,分别代表自动重装值和时钟预分频数。

函数首先使能定时器3时钟,然后设置定时器的时间基数参数,包括计数周期、预分频值、时钟分割和计数模式。接着,设置中断优先级,并使能中断。

最后,定义了TIM3_IRQHandler函数,该函数用于处理定时器3中断。函数中首先检查定时器中断是否发生,如果发生,清除中断标志位并执行相应的操作。

具体来说,中断处理函数中,每50ms将time50ms加1,并根据time50ms的值来设置disFlag的值。如果uartbusy大于0,将uartbusy减1,否则将firstinCount的值重置为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中断初始化:设置定时器时钟频率、计数周期、计数模式、中断优先级并使能中断。
  • 定时器3中断处理:每50ms执行一次,更新time50ms变量,根据time50ms的值设置disFlag的值,并根据uartbusy的值对firstinCount进行操作。

应用场景:

这段代码可以用于需要精确计时和周期性执行任务的场景,例如:

  • 50ms定时器:控制LED闪烁、PWM输出等
  • 计数器:统计按键按下次数、串口数据接收次数等
  • 任务调度:定时执行其他任务

注意事项:

  • 代码中使用了STM32标准库函数,需要先配置好STM32标准库。
  • 定时器3的配置参数需要根据实际应用需求进行调整。
  • 代码中定义的变量和函数名需要根据实际项目需求进行修改。

总结:

这段代码展示了STM32定时器3中断初始化和处理的基本流程,可以作为参考用于开发自己的应用程序。

更多学习资源:

  • STM32官方网站:https://www.st.com/
  • STM32中文社区:https://www.stmcu.org/
STM32 定时器3 中断初始化与处理代码解析

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

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