void TIM1_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //①時鍾 TIM1 使能
//定時器 TIM1 初始化
TIM_TimeBaseStructure.TIM_Period = arr; //設置自動重裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置時鍾頻率除數的預分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設置時鍾分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上計數
TIM_TimeBaseStructure.TIM_RepetitionCounter=0; //高級定時器1是用定時器功能配置這個才可以是正常的計數頻率一開始的72mhz 值得注意的地方
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //②初始化 TIM1
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE ); //③允許更新中斷
//中斷優先級 NVIC 設置
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; //TIM1 中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占優先級 1 級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //從優先級 3 級
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
NVIC_Init(&NVIC_InitStructure); //④初始化 NVIC 寄存器
TIM_Cmd(TIM1, ENABLE); //⑤使能 TIM1
}
void TIM1_UP_IRQHandler(void) //TIM1 中斷
{
if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) //檢查 TIM1 更新中斷發生與否
{
TIM_ClearFlag(TIM1, TIM_IT_Update ); //清除 TIM1 更新中斷標志
LED1=!LED1;
}
}
上面紅字必須注意 因為高級定時器的時基是四個 比通用定時器多一個:


順便再來一個通用定時器的配置:
void TIM4_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //時鍾使能
//定時器TIM4初始化
TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鍾頻率除數的預分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設置時鍾分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根據指定的參數初始化TIMx的時間基數單位
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM4中斷,允許更新中斷
//中斷優先級NVIC設置
NVIC_InitStructure.NVIC_IRQChannel = TIM4_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(TIM4, ENABLE); //使能TIMx
}
//定時器4中斷服務程序
void TIM4_IRQHandler(void) //TIM3中斷
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //檢查TIM4更新中斷發生與否
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //清除TIMx更新中斷標志
LED0=!LED0;
// Get_Angle();
}
}