/** * @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; } } }
/** * @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); }
/** * @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); }
/** * @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 */ }