Beispiel #1
0
/**
 * @brief               ICU IRQ handler.
 *
 * @param[in] icup      pointer to the @p ICUDriver object
 */
static void icu_lld_serve_interrupt(ICUDriver *icup) {
  uint32_t gfr = icup->emiosp->GFR.R;

  if (gfr && (1 << icup->ch_number)) {
    uint32_t sr = icup->emiosp->CH[icup->ch_number].CSR.R;

    if(sr && EMIOSS_OVFL && icup->config->overflow_cb != NULL){
      icup->emiosp->CH[icup->ch_number].CSR.R |= EMIOSS_OVFLC;
      _icu_isr_invoke_overflow_cb(icup);
    }
    if (sr && EMIOSS_FLAG) {
      icup->emiosp->CH[icup->ch_number].CSR.R |= EMIOSS_FLAGC;
      if (icup->config->mode == ICU_INPUT_ACTIVE_HIGH) {
        if (icup->emiosp->CH[icup->ch_number].CSR.B.UCIN == 1U  &&        \
            icup->config->period_cb != NULL) {
          A2_3 = icup->emiosp->CH[icup->ch_number].CADR.R;
          period = A2_3 - A2_1;
          _icu_isr_invoke_period_cb(icup);
          A2_1 = A2_3;
        } else if (icup->emiosp->CH[icup->ch_number].CSR.B.UCIN == 0 &&   \
            icup->config->width_cb != NULL) {
          A2_2 = icup->emiosp->CH[icup->ch_number].CADR.R;
          width = A2_2 - A2_1;
          _icu_isr_invoke_width_cb(icup);
        }
      } else if (icup->config->mode == ICU_INPUT_ACTIVE_LOW) {
        if (icup->emiosp->CH[icup->ch_number].CSR.B.UCIN == 1U &&         \
            icup->config->width_cb != NULL) {
          A2_2 = icup->emiosp->CH[icup->ch_number].CADR.R;
          width = A2_2 - A2_1;
          _icu_isr_invoke_width_cb(icup);
        } else if (icup->emiosp->CH[icup->ch_number].CSR.B.UCIN == 0 &&   \
            icup->config->period_cb != NULL) {
          A2_3 = icup->emiosp->CH[icup->ch_number].CADR.R;
          period = A2_3 - A2_1;
          _icu_isr_invoke_period_cb(icup);
          A2_1 = A2_3;
        }
      }
    }
    if (sr && EMIOSS_OVR) {
      icup->emiosp->CH[icup->ch_number].CSR.R |= EMIOSS_OVRC;
    }

  }
}
Beispiel #2
0
/**
 * @brief   Shared IRQ handler.
 *
 * @param[in] icup      pointer to the @p ICUDriver object
 */
static void icu_lld_serve_interrupt(ICUDriver *icup) {
  uint16_t sr;

  sr = icup->tim->SR & icup->tim->DIER;
  icup->tim->SR = ~sr;
  if (icup->config->channel == ICU_CHANNEL_1) {
    if ((sr & TIM_SR_CC1IF) != 0)
      _icu_isr_invoke_period_cb(icup);
    if ((sr & TIM_SR_CC2IF) != 0)
      _icu_isr_invoke_width_cb(icup);
  } else {
    if ((sr & TIM_SR_CC1IF) != 0)
      _icu_isr_invoke_width_cb(icup);
    if ((sr & TIM_SR_CC2IF) != 0)
      _icu_isr_invoke_period_cb(icup);
  }
  if ((sr & TIM_SR_UIF) != 0)
    _icu_isr_invoke_overflow_cb(icup);
}
Beispiel #3
0
/**
 * @brief   Shared IRQ handler.
 *
 * @param[in] icup      pointer to the @p ICUDriver object
 */
static void icu_lld_serve_interrupt(ICUDriver *icup) {
    uint16_t sr;

    sr = icup->tim->SR & icup->tim->DIER;
    icup->tim->SR = 0;
    if ((sr & TIM_SR_CC1IF) != 0)
        _icu_isr_invoke_period_cb(icup);
    if ((sr & TIM_SR_CC2IF) != 0)
        _icu_isr_invoke_width_cb(icup);
}
Beispiel #4
0
/**
 * @brief   Shared IRQ handler.
 *
 * @param[in] icup      pointer to the @p ICUDriver object
 */
static void icu_lld_serve_interrupt(ICUDriver *icup) {
  uint16_t sr = icup->etimerp->CHANNEL[icup->smod_number].STS.R &
                icup->etimerp->CHANNEL[icup->smod_number].INTDMA.R;

  if (ICU_SKIP_FIRST_CAPTURE) {
    if ((sr & 0x0008) != 0) { /* TOF */
      icup->etimerp->CHANNEL[icup->smod_number].STS.B.TOF = 1U;
      _icu_isr_invoke_overflow_cb(icup);
    }
    if ((sr & 0x0040) != 0) { /* ICF1 */
      if (icup->etimerp->CHANNEL[icup->smod_number].CTRL.B.CNTMODE ==
          SPC5_ETIMER_CNTMODE_RFE_SIHA) {
        icup->etimerp->CHANNEL[icup->smod_number].STS.B.ICF1 = 1U;
        icup->etimerp->CHANNEL[icup->smod_number].CTRL.B.CNTMODE =
            SPC5_ETIMER_CNTMODE_RE;
      }
      else {
        icup->etimerp->CHANNEL[icup->smod_number].STS.B.ICF1 = 1U;
        if (icup->etimerp->CHANNEL[icup->smod_number].CTRL3.B.C1FCNT == 2) {
          period = icup->etimerp->CHANNEL[icup->smod_number].CAPT1.R;
          period = icup->etimerp->CHANNEL[icup->smod_number].CAPT1.R;
        } else {
          period = icup->etimerp->CHANNEL[icup->smod_number].CAPT1.R;
        }
        _icu_isr_invoke_period_cb(icup);
      }
    }
    else if ((sr & 0x0080) != 0) { /* ICF2 */
      if (icup->etimerp->CHANNEL[icup->smod_number].CTRL.B.CNTMODE ==
          SPC5_ETIMER_CNTMODE_RFE_SIHA) {
        icup->etimerp->CHANNEL[icup->smod_number].STS.B.ICF2 = 1U;
        icup->etimerp->CHANNEL[icup->smod_number].CNTR.R = 0;
      }
      else {
        icup->etimerp->CHANNEL[icup->smod_number].STS.B.ICF2 = 1U;
        if (icup->etimerp->CHANNEL[icup->smod_number].CTRL3.B.C2FCNT == 2) {
          width = icup->etimerp->CHANNEL[icup->smod_number].CAPT2.R;
          width = icup->etimerp->CHANNEL[icup->smod_number].CAPT2.R;
        } else {
          width = icup->etimerp->CHANNEL[icup->smod_number].CAPT2.R;
        }
        _icu_isr_invoke_width_cb(icup);
      }
    }
  } else { /* ICU_SKIP_FIRST_CAPTURE = TRUE*/
    if ((sr & 0x0008) != 0) { /* TOF */
      icup->etimerp->CHANNEL[icup->smod_number].STS.B.TOF = 1U;
      _icu_isr_invoke_overflow_cb(icup);
    }
    if ((sr & 0x0040) != 0) { /* ICF1 */
      icup->etimerp->CHANNEL[icup->smod_number].STS.B.ICF1 = 1U;
      if (icup->etimerp->CHANNEL[icup->smod_number].CTRL3.B.C1FCNT == 2) {
        period = icup->etimerp->CHANNEL[icup->smod_number].CAPT1.R;
        period = icup->etimerp->CHANNEL[icup->smod_number].CAPT1.R;
      } else {
        period = icup->etimerp->CHANNEL[icup->smod_number].CAPT1.R;
      }
      _icu_isr_invoke_period_cb(icup);
    }
    else if ((sr & 0x0080) != 0) { /* ICF2 */
      icup->etimerp->CHANNEL[icup->smod_number].STS.B.ICF2 = 1U;
      if (icup->etimerp->CHANNEL[icup->smod_number].CTRL3.B.C2FCNT == 2) {
        width = icup->etimerp->CHANNEL[icup->smod_number].CAPT2.R;
        width = icup->etimerp->CHANNEL[icup->smod_number].CAPT2.R;
      } else {
        width = icup->etimerp->CHANNEL[icup->smod_number].CAPT2.R;
      }
      _icu_isr_invoke_width_cb(icup);
    }
  } /* ICU_SKIP_FIRST_CAPTURE = FALSE */
}