STM32通用定时器TIM3中断初始化及应用详解
这段代码实现了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;
}
}
}
代码解析:
-
头文件包含:
- 'timer.h': 定义了通用定时器相关函数和结构体
- 'led.h': 定义了LED相关函数和结构体
-
全局变量定义:
time50ms: 用于记录定时器中断的次数,每个中断间隔为50ms
-
外部变量定义:
disFlag: 用于控制某个功能的状态firstin: 可能用于记录某个事件的首次发生Count: 可能用于计数uartbusy: 可能用于判断串口是否繁忙
-
定时器中断初始化函数:
TIM3_Int_Init- 使能TIM3时钟
- 设置TIM3参数:
TIM_Period: 自动重装值,决定中断周期TIM_Prescaler: 时钟预分频值,决定计数频率TIM_ClockDivision: 时钟分割TIM_CounterMode: 计数模式(向上计数)
- 初始化TIM3时间基数单位
- 配置NVIC中断优先级
- 使能TIM3外设
-
中断服务函数:
TIM3_IRQHandler- 检查TIM3中断标志位
- 清除中断标志位
- 执行定时任务:
- 每隔50ms将
time50ms加1 - 如果
time50ms是偶数,则设置disFlag为1 - 如果
uartbusy大于0,则减1,否则重置firstin和Count
- 每隔50ms将
总结: 这段代码展示了STM32通用定时器TIM3的中断初始化过程,并在中断函数中实现了一些定时任务,包括时间片计数、状态标志位控制等。通过使用定时器中断,可以实现各种定时功能,例如:
- 延时
- 定时器
- 事件计时
- 信号频率测量
- PWM控制
应用场景:
这段代码可以应用于各种需要定时任务的应用场景,例如:
- 嵌入式系统
- 物联网设备
- 控制系统
- 数据采集系统
原文地址: https://www.cveoy.top/t/topic/jzDQ 著作权归作者所有。请勿转载和采集!