STM32通用定时器3中断初始化代码详解及应用
本代码是通用定时器中断初始化,使用的是定时器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定时器中断的使用方法,并将其应用于实际项目中。
原文地址: https://www.cveoy.top/t/topic/jzDL 著作权归作者所有。请勿转载和采集!