/** CAN interrupt handle . * * @param can_periph CAN0 or CAN1. * @param id the CANx index . */ static void dev_can_irq_handle(uint32_t periph, int id) { uint32_t flag0 = 0, flag1 = 0, flag2 = 0; flag0 = can_interrupt_flag_get(periph, CAN_INT_FLAG_MTF0); flag1 = can_interrupt_flag_get(periph, CAN_INT_FLAG_MTF1); flag2 = can_interrupt_flag_get(periph, CAN_INT_FLAG_MTF2); if (flag0) { can_flag_clear(periph, CAN_FLAG_MTF0); } if (flag1) { can_flag_clear(periph, CAN_FLAG_MTF1); } if (flag2) { can_flag_clear(periph, CAN_FLAG_MTF2); } /* CAN transmit complete interrupt handle */ if (flag0 || flag1 || flag2) { irq_callback(can_irq_ids[id], IRQ_TX); } /* CAN receive complete interrupt handle */ if (CAN_INTEN_RFNEIE0 == (CAN_INTEN(periph) & CAN_INTEN_RFNEIE0)) { if (0 != can_receive_message_length_get(periph, CAN_FIFO0)) { irq_callback(can_irq_ids[id], IRQ_RX); } } /* CAN error interrupt handle */ if (SET == can_interrupt_flag_get(periph, CAN_INT_FLAG_ERRIF)) { /* passive error interrupt handle */ if (CAN_INTEN_PERRIE == (CAN_INTEN(periph) & CAN_INTEN_PERRIE)) { if (SET == can_flag_get(periph, CAN_FLAG_PERR)) { irq_callback(can_irq_ids[id], IRQ_PASSIVE); } } /* bus-off interrupt handle */ if (CAN_INTEN_BOIE == (CAN_INTEN(periph) & CAN_INTEN_BOIE)) { if (SET == can_flag_get(periph, CAN_FLAG_BOERR)) { irq_callback(can_irq_ids[id], IRQ_BUS); } } irq_callback(can_irq_ids[id], IRQ_ERROR); } }
/*! \brief get CAN interrupt flag state \param[in] can_periph \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL \param[in] flag: CAN interrupt flags, refer to can_interrupt_flag_enum only one parameter can be selected which is shown as below: \arg CAN_INT_FLAG_SLPIF: status change interrupt flag of sleep working mode entering \arg CAN_INT_FLAG_WUIF: status change interrupt flag of wakeup from sleep working mode \arg CAN_INT_FLAG_ERRIF: error interrupt flag \arg CAN_INT_FLAG_MTF2: mailbox 2 transmit finished interrupt flag \arg CAN_INT_FLAG_MTF1: mailbox 1 transmit finished interrupt flag \arg CAN_INT_FLAG_MTF0: mailbox 0 transmit finished interrupt flag \arg CAN_INT_FLAG_RFO0: receive FIFO0 overfull interrupt flag \arg CAN_INT_FLAG_RFF0: receive FIFO0 full interrupt flag \arg CAN_INT_FLAG_RFO1: receive FIFO1 overfull interrupt flag \arg CAN_INT_FLAG_RFF1: receive FIFO1 full interrupt flag \param[out] none \retval FlagStatus: SET or RESET */ FlagStatus can_interrupt_flag_get(uint32_t can_periph, can_interrupt_flag_enum flag) { FlagStatus ret1 = RESET; FlagStatus ret2 = RESET; /* get the staus of interrupt flag */ ret1 = (FlagStatus)(CAN_REG_VALS(can_periph, flag) & BIT(CAN_BIT_POS0(flag))); /* get the staus of interrupt enale bit */ ret2 = (FlagStatus)(CAN_INTEN(can_periph) & BIT(CAN_BIT_POS1(flag))); if(ret1 && ret2){ return SET; }else{ return RESET; } }
/*! \brief disable CAN interrupt \param[in] can_periph \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL \param[in] interrupt \arg CAN_INT_TME: transmit mailbox empty interrupt enable \arg CAN_INT_RFNE0: receive FIFO0 not empty interrupt enable \arg CAN_INT_RFF0: receive FIFO0 full interrupt enable \arg CAN_INT_RFO0: receive FIFO0 overfull interrupt enable \arg CAN_INT_RFNE1: receive FIFO1 not empty interrupt enable \arg CAN_INT_RFF1: receive FIFO1 full interrupt enable \arg CAN_INT_RFO1: receive FIFO1 overfull interrupt enable \arg CAN_INT_WERR: warning error interrupt enable \arg CAN_INT_PERR: passive error interrupt enable \arg CAN_INT_BO: bus-off interrupt enable \arg CAN_INT_ERRN: error number interrupt enable \arg CAN_INT_ERR: error interrupt enable \arg CAN_INT_WU: wakeup interrupt enable \arg CAN_INT_SLPW: sleep working interrupt enable \param[out] none \retval none */ void can_interrupt_disable(uint32_t can_periph, uint32_t interrupt) { CAN_INTEN(can_periph) &= ~interrupt; }
/*! \brief enable CAN interrupt \param[in] can_periph \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL \param[in] interrupt \arg CAN_INT_TME: transmit mailbox empty interrupt enable \arg CAN_INT_RFNE0: receive FIFO0 not empty interrupt enable \arg CAN_INT_RFF0: receive FIFO0 full interrupt enable \arg CAN_INT_RFO0: receive FIFO0 overfull interrupt enable \arg CAN_INT_RFNE1: receive FIFO1 not empty interrupt enable \arg CAN_INT_RFF1: receive FIFO1 full interrupt enable \arg CAN_INT_RFO1: receive FIFO1 overfull interrupt enable \arg CAN_INT_WERR: warning error interrupt enable \arg CAN_INT_PERR: passive error interrupt enable \arg CAN_INT_BO: bus-off interrupt enable \arg CAN_INT_ERRN: error number interrupt enable \arg CAN_INT_ERR: error interrupt enable \arg CAN_INT_WU: wakeup interrupt enable \arg CAN_INT_SLPW: sleep working interrupt enable \param[out] none \retval none */ void can_interrupt_enable(uint32_t can_periph, uint32_t interrupt) { CAN_INTEN(can_periph) |= interrupt; }