在研究stm32定時器時發現,當進入定時器的中斷時,定時器計數器以及中斷接收時正常運行的,並沒有因爲進入中斷而停止
具體看以下分析:
定時器初始化代碼:
//TIM捕獲通道開啓宏定義,1:開啓 0:關閉
#define TIM_ICCH1 1
#define TIM_ICCH2 1
#define TIM_ICCH3 1
#define TIM_ICCH4 1
//最小捕獲頻率:72000000/(120*60000)=10Hz
#define TIM_ICARR 60000 //重裝載寄存器填充值
#define TIM_ICPSC 720 //分頻係數
#define TIM_ICFIT 0x00 //定時器捕獲濾波係數
#define TIM_OverF (10-1) //最大ARR溢出次數
#define TIM_ICSR (u16 *)&TIM3->SR //選擇定時器的SR寄存器地址
#define TIM_ICCCR (u16 *)&TIM3->CCR1 //選擇定時器的CCR寄存器地址
void TIM3_PWMICInit(void)
{
u8 i=0;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_ICInitTypeDef TIM_ICInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
/***********************NVIC配置*****************************/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
NVIC_Init(&NVIC_InitStruct);
/**********************TIM3 GPIO配置*****************************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
/**********************初始化TIM3*******************************/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period = TIM_ICARR-1;
TIM_TimeBaseInitStruct.TIM_Prescaler = TIM_ICPSC-1;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
/**********************初始化TIM3 IC*******************************/
TIM_ICInitStruct.TIM_ICFilter = TIM_ICFIT;
TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Falling;
TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI ;
if(TIM_ICCH1==1)
{
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_Init(GPIOA,&GPIO_InitStruct);
TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;
TIM_ICInit(TIM3, &TIM_ICInitStruct);
}
if(TIM_ICCH2==1)
{
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
GPIO_Init(GPIOA,&GPIO_InitStruct);
TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;
TIM_ICInit(TIM3, &TIM_ICInitStruct);
}
if(TIM_ICCH3==1)
{
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOB,&GPIO_InitStruct);
TIM_ICInitStruct.TIM_Channel = TIM_Channel_3;
TIM_ICInit(TIM3, &TIM_ICInitStruct);
}
if(TIM_ICCH4==1)
{
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
GPIO_Init(GPIOB,&GPIO_InitStruct);
TIM_ICInitStruct.TIM_Channel = TIM_Channel_4;
TIM_ICInit(TIM3, &TIM_ICInitStruct);
}
TIM_ITConfig(TIM3, TIM_IcChannel,ENABLE);
TIM_Cmd(TIM3, ENABLE);
TIM_Ic.Ccr1=0;
}
中斷代碼:
void TIM3_IRQHandler(void)
{
u8 j = 0;
u16 i = 0, *pTimFre, *pTimCcrT, *pTimOver, *pTimSR, *pTimCCR;
TIM_Ic.Ccr1++;
TIM3->SR = 0;
if(TIM_Ic.Ccr1>100)
{
while( (TIM3->SR&0x001f) != 0x001f){}
LCD_ClearPart(Clear_ALL,RED);
while(1);
}
else return;
...........(省略)
}
仿真圖中,CC1F中斷狀態位是爲0的,其他爲1,。這是引文CH1的PWM被斷開了,而其他的則是連接。具體看圖中黃色與紅色
的線:
然後,連接CH1與PWM,再次仿真運行,結果如下圖:
可見CC1F標誌位已經被置1了,說明在中斷函數中,定時器時正常運行的,並沒有因爲進入中斷而停止。