/*! \file gd32f3x0_it.c \brief interrupt service routines */ /* Copyright (C) 2017 GigaDevice 2017-06-06, V1.0.0, firmware for GD32F3x0 */ #include "gd32f3x0_it.h" #include "gd32f3x0_eval.h" #include "systick.h" /* array1 transmission */ uint8_t senddata1[2] = {0xA5,0x5A}; /* array2 transmission */ uint8_t senddata2[2] = {0x5A,0xA5}; /* receive array buffer */ uint8_t rcvdata[10]; /* sent data pointer */ uint8_t *transdata; __IO uint8_t rcvstatus = 0U; __IO uint8_t send_inc = 0U, rcv_inc = 0U; uint16_t senderrorcode = 0U; uint16_t rcverrorcode = 0U; __IO uint8_t bytenum = 0U; /*! \brief this function handles NMI exception \param[in] none \param[out] none \retval none */ void NMI_Handler(void) { } /*! \brief this function handles HardFault exception \param[in] none \param[out] none \retval none */ void HardFault_Handler(void) { /* if Hard Fault exception occurs, go to infinite loop */ while (1); } /*! \brief this function handles MemManage exception \param[in] none \param[out] none \retval none */ void MemManage_Handler(void) { /* if Memory Manage exception occurs, go to infinite loop */ while (1); } /*! \brief this function handles BusFault exception \param[in] none \param[out] none \retval none */ void BusFault_Handler(void) { /* if Bus Fault exception occurs, go to infinite loop */ while (1); } /*! \brief this function handles UsageFault exception \param[in] none \param[out] none \retval none */ void UsageFault_Handler(void) { /* if Usage Fault exception occurs, go to infinite loop */ while (1); } /*! \brief this function handles SVC exception \param[in] none \param[out] none \retval none */ void SVC_Handler(void) { } /*! \brief this function handles DebugMon exception \param[in] none \param[out] none \retval none */ void DebugMon_Handler(void) { } /*! \brief this function handles PendSV exception \param[in] none \param[out] none \retval none */ void PendSV_Handler(void) { } /*! \brief this function handles SysTick exception \param[in] none \param[out] none \retval none */ void SysTick_Handler(void) { delay_decrement(); } /*! \brief this function handles EXTI0_1 interrupt request \param[in] none \param[out] none \retval none */ void EXTI0_1_IRQHandler(void) { if(RESET != exti_flag_get(WAKEUP_KEY_EXTI_LINE)){ /* Tamper key press */ bytenum = 2U; /* send CEC address */ cec_data_send(0x12U); /* start transmission */ transdata = senddata1; /* start transmission */ cec_transmission_start(); exti_flag_clear(WAKEUP_KEY_EXTI_LINE); } } /*! \brief this function handles EXTI4_15 interrupt request \param[in] none \param[out] none \retval none */ void EXTI4_15_IRQHandler(void) { if(RESET != exti_flag_get(TAMPER_KEY_EXTI_LINE)){ /* Tamper key press */ bytenum = 2U; /* send CEC address */ cec_data_send(0x12U); /* start transmission */ transdata = senddata2; /* start transmission */ cec_transmission_start(); exti_flag_clear(TAMPER_KEY_EXTI_LINE); } } /*! \brief this function handles CEC interrupt request \param[in] none \param[out] none \retval none */ void CEC_IRQHandler(void) { /* check if a reception error occured */ if(cec_interrupt_flag_get(CEC_INTF_RO | CEC_INTF_BRE | CEC_INTF_BPSE | CEC_INTF_BPLE | CEC_INTF_RAE)){ rcverrorcode = CEC_INTF; cec_interrupt_flag_clear(CEC_INTF_RO | CEC_INTF_BRE | CEC_INTF_BPSE | CEC_INTF_BPLE | CEC_INTF_RAE); rcvstatus = 2U; } /* receive data */ if(cec_interrupt_flag_get(CEC_INTF_BR)){ rcvdata[rcv_inc] = cec_data_receive(); rcv_inc++; cec_interrupt_flag_clear(CEC_INTF_BR); } /* check if the byte received is the last one of the message */ if(cec_interrupt_flag_get(CEC_INTF_REND)){ rcvstatus = 1U; rcv_inc = 0U; cec_interrupt_flag_clear(CEC_INTF_REND); } /* check if a transmission error occurred */ if(cec_interrupt_flag_get(CEC_INTF_ARBF | CEC_INTF_TU | CEC_INTF_TERR | CEC_INTF_TAERR)){ senderrorcode = CEC_INTF; cec_interrupt_flag_clear(CEC_INTF_ARBF | CEC_INTF_TU | CEC_INTF_TERR | CEC_INTF_TAERR); } /* check if end of message bit is set in the data to be transmitted */ if(cec_interrupt_flag_get(CEC_INTF_TEND)){ cec_interrupt_flag_clear(CEC_INTF_TEND| CEC_INTF_TBR); send_inc = 0U; }else if(cec_interrupt_flag_get(CEC_INTF_TBR)){ /* set EOM bit if the byte to be transmitted is the last one of the senddata */ if(send_inc++ == (bytenum - 1U)){ cec_transmission_end(); cec_data_send(*transdata++); }else{ /* send the byte in the transdata */ cec_data_send(*transdata++); } cec_interrupt_flag_clear(CEC_INTF_TBR); } }