原子哥,因为要测设很多路信号,所以决定用输入捕获测频率,不用计数模式了。为了结果更精确,不打算用太大的分频系数,所以这样对于较小的频率来说计数器就会溢出了,所以我打算对定时器3采取两个中断处理,一个是信号捕获到上升沿时的中断,一个是计数器溢出时候的中断,溢出中断处理溢出次数再用来最后获得32位的计数器的值,下面是我的程序,麻烦原子哥看看,问题出在哪?现在中断都进不去了
void Tim3_Configuration(void)
{
/* TIM3 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 使能时钟
/* GPIOA clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* TIM3 channel 1 pin (PA.06) configuration */
GPIO_InitTypeDef GPIO_InitStructure; // GPIO 设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable the TIM3 global Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
//TIM_PrescalerConfig(TIM3, 287, TIM_PSCReloadMode_Immediate);
/* Enable the CC1 Interrupt Request */
TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE); // 使能TIM3 通道1上升沿中断
/* Enable the Overflow Interrupt Request */
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // 使能TIM3 定时器溢出中断
/* TIM enable counter */
TIM_Cmd(TIM3, ENABLE);
}
下面是两个中断函数
void TIM3_IRQHandler_Impuls(void)
{
static UINT32 _ui32tim3_ic1 = 0, _ui32tim3_ic2 = 0;
static UINT8 _ui8capture_mark = 0;
static UINT32 _ui32capture_wert = 0;
if(TIM_GetITStatus(TIM3, TIM_IT_CC1) == SET)
{
/* Clear TIM3 Capture compare interrupt pending bit */
TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
if(_ui8capture_mark == 0)
{
/* Get the Input Capture value */
_ui32tim3_ic1 = TIM_GetCapture1(TIM3); // 第一个上升沿捕获到的计数器的值
_ui8capture_mark = 1;
}
else if(_ui8capture_mark == 1)
{
/* Get the Input Capture value */
_ui32tim3_ic2 = TIM_GetCapture1(TIM3); // 第二个上升沿捕获到的计数器的值
/* Capture computation */
if (0 == ui16TIM3_overflow) // 无计数器溢出
{
_ui32capture_wert = (_ui32tim3_ic2 - _ui32tim3_ic1);
}
else // 计数器溢出
{
_ui32capture_wert = ((0xFFFF*ui16TIM3_overflow - _ui32tim3_ic1) + _ui32tim3_ic2);
}
/* Frequency computation */
fl32TIM3Freq = (UINT32) SystemCoreClock / _ui32capture_wert; // 计算信号频率
_ui8capture_mark = 0;
}
}
}
void TIM3_IRQHandler_Overflow(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
{
ui16TIM3_overflow++; // 计算中断次数
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
} |