这段代码实现了STM32通用定时器TIM3的中断初始化,并在中断函数中实现了一些定时任务。

首先,在头文件中引入了'timer.h'和'led.h'两个文件。

其次,定义了一个全局变量time50ms,用于记录定时器中断的次数,即50ms的时间片。

然后,定义了一些外部变量,包括disFlag、firstin、Count、uartbusy,这些变量可能在其他文件中定义。

接着,定义了一个函数TIM3_Int_Init,用于初始化TIM3定时器的中断。其中,arr表示自动重装值,psc表示时钟预分频数。在函数中,首先使能了TIM3的时钟,然后设置了TIM3的各种参数,最后使能了TIM3外设。

最后,定义了一个中断函数TIM3_IRQHandler。在中断函数中,首先检查TIM3的中断是否发生,如果发生了,就清除中断待处理位,并将time50ms加1。然后,如果time50ms是偶数,就将disFlag设置为1。接着,如果uartbusy大于0,就将uartbusy减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;
			}					
		}
}

代码解析:

  1. 头文件包含:

    • 'timer.h': 定义了通用定时器相关函数和结构体
    • 'led.h': 定义了LED相关函数和结构体
  2. 全局变量定义:

    • time50ms: 用于记录定时器中断的次数,每个中断间隔为50ms
  3. 外部变量定义:

    • disFlag: 用于控制某个功能的状态
    • firstin: 可能用于记录某个事件的首次发生
    • Count: 可能用于计数
    • uartbusy: 可能用于判断串口是否繁忙
  4. 定时器中断初始化函数: TIM3_Int_Init

    • 使能TIM3时钟
    • 设置TIM3参数:
      • TIM_Period: 自动重装值,决定中断周期
      • TIM_Prescaler: 时钟预分频值,决定计数频率
      • TIM_ClockDivision: 时钟分割
      • TIM_CounterMode: 计数模式(向上计数)
    • 初始化TIM3时间基数单位
    • 配置NVIC中断优先级
    • 使能TIM3外设
  5. 中断服务函数: TIM3_IRQHandler

    • 检查TIM3中断标志位
    • 清除中断标志位
    • 执行定时任务:
      • 每隔50ms将time50ms加1
      • 如果time50ms是偶数,则设置disFlag为1
      • 如果uartbusy大于0,则减1,否则重置firstinCount

总结: 这段代码展示了STM32通用定时器TIM3的中断初始化过程,并在中断函数中实现了一些定时任务,包括时间片计数、状态标志位控制等。通过使用定时器中断,可以实现各种定时功能,例如:

  • 延时
  • 定时器
  • 事件计时
  • 信号频率测量
  • PWM控制

应用场景:

这段代码可以应用于各种需要定时任务的应用场景,例如:

  • 嵌入式系统
  • 物联网设备
  • 控制系统
  • 数据采集系统
STM32通用定时器TIM3中断初始化及应用详解

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

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