STM32通用定时器TIM3中断初始化及应用
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的中断初始化及应用有了更深入的了解。在实际应用中,可以根据具体需求修改代码,实现不同的功能。
原文地址: https://www.cveoy.top/t/topic/jzDN 著作权归作者所有。请勿转载和采集!