diff options
Diffstat (limited to 'os/hal/platforms')
| -rw-r--r-- | os/hal/platforms/STM32/icu_lld.c | 14 | ||||
| -rw-r--r-- | os/hal/platforms/STM32/icu_lld.h | 27 | 
2 files changed, 12 insertions, 29 deletions
diff --git a/os/hal/platforms/STM32/icu_lld.c b/os/hal/platforms/STM32/icu_lld.c index 5d3bb284d..f950a5eb6 100644 --- a/os/hal/platforms/STM32/icu_lld.c +++ b/os/hal/platforms/STM32/icu_lld.c @@ -91,12 +91,18 @@ ICUDriver ICUD5;  static void icu_lld_serve_interrupt(ICUDriver *icup) {
    uint16_t sr;
 -  sr = TIM1->SR & TIM1->DIER;
 +  sr = icup->tim->SR & icup->tim->DIER;
    icup->tim->SR = 0;
 -  if ((sr & TIM_SR_CC1IF) != 0)
 -    icup->config->period_cb(icup);
 -  if ((sr & TIM_SR_CC2IF) != 0)
 +  if ((sr & TIM_SR_CC1IF) != 0) {
 +    icustate_t previous_state = icup->state;
 +    icup->state = ICU_ACTIVE;
 +    if (previous_state != ICU_WAITING)
 +      icup->config->period_cb(icup);
 +  }
 +  if ((sr & TIM_SR_CC2IF) != 0) {
 +    icup->state = ICU_IDLE;
      icup->config->width_cb(icup);
 +  }
  }
  /*===========================================================================*/
 diff --git a/os/hal/platforms/STM32/icu_lld.h b/os/hal/platforms/STM32/icu_lld.h index 437390d52..b98b8bf86 100644 --- a/os/hal/platforms/STM32/icu_lld.h +++ b/os/hal/platforms/STM32/icu_lld.h @@ -223,7 +223,6 @@ struct ICUDriver {  /* Driver macros.                                                            */
  /*===========================================================================*/
 -
  /**
   * @brief   Returns the width of the latest pulse.
   * @details The pulse width is defined as number of ticks between the start
 @@ -234,7 +233,7 @@ struct ICUDriver {   *
   * @notapi
   */
 -#define icu_lld_get_width(icup) ((icup)->tim->CCR2)
 +#define icu_lld_get_width(icup) ((icup)->tim->CCR2 + 1)
  /**
   * @brief   Returns the width of the latest cycle.
 @@ -246,29 +245,7 @@ struct ICUDriver {   *
   * @notapi
   */
 -#define icu_lld_get_period(icup) ((icup)->tim->CCR1)
 -
 -/**
 - * @brief   ICU clock prescaler initialization utility.
 - * @note    The real clock value is rounded to the lower valid value, please
 - *          make sure that the source clock frequency is a multiple of the
 - *          requested ICU clock frequency.
 - * @note    The calculated value must fit into an unsigned 16 bits integer.
 - *
 - * @param[in] clksrc    clock source frequency, depending on the target timer
 - *                      cell it can be one of:
 - *                      - STM32_TIMCLK1
 - *                      - STM32_TIMCLK2
 - *                      .
 - *                      Please refer to the STM32 HAL driver documentation
 - *                      and/or the STM32 Reference Manual for the right clock
 - *                      source.
 - * @param[in] icuclk    ICU clock frequency in cycles
 - * @return              The value to be stored in the @p psc field of the
 - *                      @p ICUConfig structure.
 - */
 -#define ICU_COMPUTE_PSC(clksrc, icuclk)                                     \
 -  ((uint16_t)(((clksrc) / (icuclk)) - 1))
 +#define icu_lld_get_period(icup) ((icup)->tim->CCR1 + 1)
  /*===========================================================================*/
  /* External declarations.                                                    */
  | 
