STM32通用定时器TIM3中断初始化及应用

本文将解读一段STM32的通用定时器TIM3中断初始化代码,并讲解其应用。

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

代码解读

这段代码实现了STM32的通用定时器TIM3的中断初始化,并展示了其在时间片计数、LED控制和串口通信处理中的应用。

1. 定时器初始化:

  • TIM3_Int_Init(u16 arr, u16 psc) 函数用于初始化TIM3。
  • arr 参数设置自动重装值,决定定时器的计数周期。
  • psc 参数设置时钟预分频数,与 arr 共同决定定时器的计数频率。
  • 函数内部首先使能TIM3的时钟,然后配置TIM3的工作模式,包括计数模式、时钟分频、自动重装值等。
  • 最后,配置NVIC中断控制器,使能TIM3中断,并设置中断优先级。

2. 定时器中断服务函数:

  • TIM3_IRQHandler() 函数是TIM3的中断服务函数。
  • 在中断服务函数中,首先判断TIM3更新中断标志位是否被置位,如果是,则清除该标志位,并执行以下操作:
    • time50ms 变量自增,用于记录时间片个数。
    • 根据 time50ms 的值控制 disFlag 变量,从而控制LED的闪烁。
    • 处理串口通信,判断是否有数据正在传输,并进行相应的处理。

应用场景

这段代码可以应用于需要定时执行任务的场合,例如:

  • LED闪烁控制:通过定时器中断改变LED的状态,实现LED的闪烁效果。
  • 按键消抖:通过定时器中断延时检测按键状态,消除按键抖动。
  • 数据采集:定时触发ADC进行数据采集,获取传感器数据。
  • 通信协议:利用定时器实现通信协议中的定时发送和接收数据。

总结

通过本文的讲解,相信读者对STM32通用定时器TIM3的中断初始化及应用有了更深入的了解。在实际应用中,可以根据具体需求修改代码,实现不同的功能。

STM32通用定时器TIM3中断初始化及应用

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

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