diff --git a/os/hal/dox/icu.dox b/os/hal/dox/icu.dox index 1d3fe092e..76506c10a 100644 --- a/os/hal/dox/icu.dox +++ b/os/hal/dox/icu.dox @@ -54,6 +54,7 @@ ready -> waiting [label="\nicuEnable()"]; waiting -> active [label="\nStart Front"]; waiting -> ready [label="\nicuDisable()"]; + waiting -> waiting [label="\nStop Front"]; active -> idle [label="\nStop Front\n>width_cb<"]; active -> ready [label="\nicuDisable()\nicuDisableI()"]; idle -> active [label="\nStart Front\n>period_cb<"]; @@ -83,6 +84,7 @@ ready -> waiting [label="\nicuEnable()"]; waiting -> active [label="\nStart Front"]; waiting -> ready [label="\nicuDisable()"]; + waiting -> waiting [label="\nStop Front"]; active -> idle [label="\nStop Front\n>width_cb<"]; active -> ready [label="\nicuDisable()\nicuDisableI()"]; idle -> active [label="\nStart Front\n>period_cb<"]; diff --git a/os/hal/include/icu.h b/os/hal/include/icu.h index ef42470cb..7db895fbf 100644 --- a/os/hal/include/icu.h +++ b/os/hal/include/icu.h @@ -140,8 +140,10 @@ typedef void (*icucallback_t)(ICUDriver *icup); * @notapi */ #define _icu_isr_invoke_width_cb(icup) { \ - (icup)->state = ICU_IDLE; \ - (icup)->config->width_cb(icup); \ + if ((icup)->state != ICU_WAITING) { \ + (icup)->state = ICU_IDLE; \ + (icup)->config->width_cb(icup); \ + } \ } /** diff --git a/os/hal/platforms/STM32/TIMv1/icu_lld.c b/os/hal/platforms/STM32/TIMv1/icu_lld.c index b407d33ae..0b1013a23 100644 --- a/os/hal/platforms/STM32/TIMv1/icu_lld.c +++ b/os/hal/platforms/STM32/TIMv1/icu_lld.c @@ -614,6 +614,7 @@ void icu_lld_stop(ICUDriver *icup) { */ void icu_lld_enable(ICUDriver *icup) { + icup->tim->EGR |= STM32_TIM_EGR_UG; icup->tim->SR = 0; /* Clear pending IRQs (if any). */ if (icup->config->channel == ICU_CHANNEL_1) { if (icup->config->period_cb != NULL) diff --git a/readme.txt b/readme.txt index f2e2b9d19..075376917 100644 --- a/readme.txt +++ b/readme.txt @@ -89,6 +89,8 @@ ***************************************************************************** *** 2.7.0 *** +- FIX: Fixed spurious callback in ICU driver (bug #461)(backported to 2.6.3 + and 2.4.6). - FIX: Fixed compile error in STM32F0xx ADC driver when STM32F0XX_LD devices are selected (bug #460)(backported to 2.6.3). - FIX: Fixed race condition in STM32 SDC driver (bug #458)(backported