2015-11-08 02:52 PM
Hi, all!
Does anyone faced with a skipping one period of input signal without ovrcapture flag setting? The setup is: * STM32F3 Discovery board with STM32F303 MCU. * TIM2 used for input / capture the input signal from external source. * input / capture interrupt generation is enabled. * MCU & TIM frequency is 48 MHz, * input signal - sqare wave near 50%, frequency from 3 kHz to 63 kHz - result is the same. I use TIM2 to accurate input frequency measurement, and found that about one period per 10K - 100K measurement has been lost (means that I got 12000 timer cycles per measurement instead of normal 6000, for example). This looks very strange, because I don't get overcapture flag for this time! I tried to: * increase interrupt priority to highest (althought it is not requried in theory for this frequences) * disable all another interrupts * reduce timer handler code to minimun. And all this steps can't help. Here is a reduced TIM2 handler code:void
TIM2_IRQHandler(
void
)
{
uint32_t readval;
static
uint32_t readval_old = 0;
if
(__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_CC4) != RESET && __HAL_TIM_GET_ITSTATUS(&htim2, TIM_IT_CC4) != RESET)
{
__HAL_TIM_CLEAR_IT(&htim2, TIM_IT_CC4);
readval = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_4);
if
(tim_meas_cb.ic_counter > 2)
{
//!!! period skip test
if
((readval - readval_old) < 500 || (readval - readval_old) > 1000)
{
__nop();
}
}
readval_old = readval;
if
(tim_meas_cb.ic_counter < 100)
tim_meas_cb.ic_counter++;
//!!! overcapture test
if
(__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_CC4OF) != RESET)
{
__nop();
__HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_CC4OF);
}
}
}
Have any ideas?
#timers #stm32f3