STM32 定时器3 中断初始化与处理代码解析
这段代码是 STM32 微控制器中定时器3中断初始化和处理函数的示例。
代码首先包含了timer.h和led.h两个头文件,这两个头文件分别定义了定时器和LED相关的宏定义、结构体和函数。
接着,定义了time50ms变量,该变量用于记录50ms时间片,并在中断处理函数中进行更新。
接着,定义了TIM3_Int_Init函数,该函数用于初始化定时器3中断。函数参数包括arr和psc,分别代表自动重装值和时钟预分频数。
函数首先使能定时器3时钟,然后设置定时器的时间基数参数,包括计数周期、预分频值、时钟分割和计数模式。接着,设置中断优先级,并使能中断。
最后,定义了TIM3_IRQHandler函数,该函数用于处理定时器3中断。函数中首先检查定时器中断是否发生,如果发生,清除中断标志位并执行相应的操作。
具体来说,中断处理函数中,每50ms将time50ms加1,并根据time50ms的值来设置disFlag的值。如果uartbusy大于0,将uartbusy减1,否则将firstin和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中断初始化:设置定时器时钟频率、计数周期、计数模式、中断优先级并使能中断。
- 定时器3中断处理:每50ms执行一次,更新
time50ms变量,根据time50ms的值设置disFlag的值,并根据uartbusy的值对firstin和Count进行操作。
应用场景:
这段代码可以用于需要精确计时和周期性执行任务的场景,例如:
- 50ms定时器:控制LED闪烁、PWM输出等
- 计数器:统计按键按下次数、串口数据接收次数等
- 任务调度:定时执行其他任务
注意事项:
- 代码中使用了STM32标准库函数,需要先配置好STM32标准库。
- 定时器3的配置参数需要根据实际应用需求进行调整。
- 代码中定义的变量和函数名需要根据实际项目需求进行修改。
总结:
这段代码展示了STM32定时器3中断初始化和处理的基本流程,可以作为参考用于开发自己的应用程序。
更多学习资源:
- STM32官方网站:https://www.st.com/
- STM32中文社区:https://www.stmcu.org/
原文地址: https://www.cveoy.top/t/topic/jzAL 著作权归作者所有。请勿转载和采集!