#include "Timer.h"
#include "LED.h"
/*
*@breif 定时器3_中断_初始化函数
1、使能定时器时钟:APB1
2、初始化定时器,配置ARR,PSC
3、开启定时器中断,配置NVIC(嵌套中断向量控制器)
4、使能定时器
5、编写中断服务函数
*@param ARR:自动装载值;PSC:分频系数
计算公式:t(延迟时间) = (ARR+1)(PSC+1)/TCLK 其中TCKL为72MHz
*@retval 无
*/
void TIM3_Int_Init(uint16_t ARR,uint16_t PSC)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //使能定时器3
TIM_TimeBaseInitStructure.TIM_Period = ARR; //自动装载值
TIM_TimeBaseInitStructure.TIM_Prescaler = PSC; //预分频系数
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //"没有太大关系,随便选?"
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure); //初始化定时器3
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //使能定时器的更新中断(更新中断属于中断种类的一种)
//中断优先级NVIC设置
NVIC_InitTypeDef NVIC_InitStructure;
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寄存器
TIM_Cmd(TIM3,ENABLE); //设置完所有后,使能定时器
}
//中断服务函数,与51不同,不需要写在main中,也不需要中断号,需要去启动文件中寻找
void TIM3_IRQHandler(void) //定时器3中断服务函数,在这里面执行if语句
{
//首先判断该中断是否为先前所使能的中断,也就使判断是否为更新中断
if(TIM_GetITStatus(TIM3,TIM_IT_Update) == SET) //TIM_GetITStatus()函数,获取中断状态,SET表示发生,RESET表示不发生
{//也可以写为:if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
LED_Turn();
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //使用完之后,还要清除更新中断位
}
}
注意:中断函数中的LED_Turn()函数为自己撰写的翻转IO口函数