STM32 定时器3 中断初始化详解
该代码是一个STM32的定时器中断初始化函数 TIM3_Int_Init,用于初始化定时器3的中断。其中,时钟选择为APB1的2倍,而APB1为36M,'arr'表示自动重装值,'psc'表示时钟预分频数,这里使用的是定时器3。
在中断处理函数 TIM3_IRQHandler 中,首先通过检查指定的TIM中断发生与否来判断是否进入中断处理程序,然后清除TIMx的中断待处理位,并对'time50ms'进行累加。最后,根据条件进行相应的操作,如设置'disFlag'为1、减少'uartbusy'等。
代码解析
#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. 时钟配置:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);: 使能定时器3的时钟,APB1时钟频率为36M,选择APB1的2倍作为定时器3的时钟源,即72M。
2. 定时器参数配置:
TIM_TimeBaseStructure.TIM_Period = arr;: 设置自动重装值,计数器计数到这个值时会重新开始计数,决定中断周期的长度。TIM_TimeBaseStructure.TIM_Prescaler =psc;: 设置预分频值,将定时器3的时钟频率进行分频,决定计数器的计数频率。TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;: 设置计数模式为向上计数,从0开始计数直到自动重装值,然后重新开始计数。
3. 中断配置:
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;: 设置中断通道为TIM3中断。NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;: 设置先占优先级为0级。NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;: 设置从优先级为3级。NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;: 使能中断通道。
4. 中断处理函数:
TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET: 检查指定的TIM中断发生与否,即定时器3是否计数到自动重装值。TIM_ClearITPendingBit(TIM3, TIM_IT_Update);: 清除TIMx的中断待处理位,避免中断重复触发。time50ms++;: 对时间片计数变量进行累加,用来记录时间。- 根据'time50ms','uartbusy'等变量的值进行不同的操作,如设置'disFlag'、减少'uartbusy'、重置计数器等。
总结
通过以上代码解析,我们可以清楚地了解STM32定时器3中断初始化的步骤和流程,并理解中断处理函数中各个操作的意义和作用。此代码示例可以作为STM32定时器3中断应用开发的参考,可以根据具体的应用需求进行修改和扩展。
原文地址: https://www.cveoy.top/t/topic/jzDV 著作权归作者所有。请勿转载和采集!