cancel
Showing results for 
Search instead for 
Did you mean: 

STM32F3 skips one period of input signal

krdmitry
Associate II
Posted on November 08, 2015 at 23:52

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
0 REPLIES 0