STM32定时器中断详解:基于定时器3的代码示例
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;
}
}
}
代码解析:
- 时钟设置: 代码中将APB1时钟的2倍作为定时器3的时钟源,APB1的频率为36MHz。
- 定时器初始化: 使用
TIM_TimeBaseInit()函数初始化定时器,设置自动重装值 (TIM_Period) 和预分频数 (TIM_Prescaler) 来控制中断周期。 - 中断使能: 通过
NVIC结构体设置中断优先级,并使能定时器3中断。 - 中断处理函数:
TIM3_IRQHandler()函数在每次定时器中断触发时执行,例如每50ms。 在中断处理函数中,可以执行各种操作,例如更新标志位 (disFlag)、处理串口数据 (uartbusy,firstin,Count) 等等。
总结:
这段代码演示了如何使用STM32的定时器3产生周期性中断,并提供了一个简单的中断处理函数示例。通过修改定时器参数和中断处理函数的内容,可以实现各种定时任务。
原文地址: https://www.cveoy.top/t/topic/jzDP 著作权归作者所有。请勿转载和采集!