定時器中斷只進入一次
void TIM3_Int_Init(u16 arr,u16 psc)
{
? ? TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
? ? NVIC_InitTypeDef NVIC_InitStructure;
? ? RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);? ? ? ? ? ? //使能TIM3時鐘
? ? TIM_TimeBaseStructure.TIM_Period = arr;? ? ? ? ? ? ? ? ? ? ? ? ?//指定下次更新事件時要加載到活動自動重新加載寄存器中的周期值
? ? TIM_TimeBaseStructure.TIM_Prescaler = psc;? ? ? ? ? ? ? ? ? ? ? //指定用于劃分TIM時鐘的預分頻值
? ? TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_1;? ? ? ? ? ? //時鐘分頻因子
? ? TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;? ? ?//TIM計數(shù)模式,向上計數(shù)模式
? ? TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);? ? ? ? ? ? ? ? ?//根據(jù)指定的參數(shù)初始化TIMx的時間基數(shù)單位
? ? TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);? ? ? ? ? ? ? ? ? ? ? //使能TIM3中斷,允許更新中斷
? ? //初始化TIM NVIC,設置中斷優(yōu)先級分組
? ? NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;? ? ? ? ? ? ? ? ?//TIM3中斷
? ? NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;? ? ? ?//設置搶占優(yōu)先級0
? ? NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;? ? ? ? ? ? ? //設置響應優(yōu)先級3
? ? NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;? ? ? ? ? ? ? ? ?//使能通道1中斷
? ? NVIC_Init(&NVIC_InitStructure);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//初始化NVIC
? ? TIM_Cmd(TIM3, ENABLE);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //TIM3使能
}
void TIM3_IRQHandler(void)
{
? ? static u8 i=0;
? ? if (TIM_GetITStatus(TIM3, TIM_IT_Update)!=RESET)? ? //檢查TIM3中斷是否發(fā)生
? ? {
? ? ? ? TIM_ClearITPendingBit(TIM3, TIM_IT_Update);? ? ?//清除TIM3的中斷掛起位
? ? ? ? GPIO_WriteBit(GPIOA, GPIO_Pin_1, (i==0) ? (i=Bit_SET):(i=Bit_RESET));
? ? ? ? printf("GPIO Toggle\r\n");
? ? }
}