/* interrupt service routine */ void ETH_IRQHandler(void) { rt_uint32_t status; status = ETH->DMASR; /* Frame received */ if ( ETH_GetDMAFlagStatus(ETH_DMA_FLAG_R) == SET) { rt_err_t result; //rt_kprintf("Frame comming\n"); /* Clear the interrupt flags. */ /* Clear the Eth DMA Rx IT pending bits */ ETH_DMAClearITPendingBit(ETH_DMA_IT_R); /* a frame has been received */ result = eth_device_ready(&(stm32_eth_device.parent)); if( result != RT_EOK ) rt_kprintf("RX err =%d\n", result ); //RT_ASSERT(result == RT_EOK); } if (ETH_GetDMAITStatus(ETH_DMA_IT_T) == SET) /* packet transmission */ { ETH_DMAClearITPendingBit(ETH_DMA_IT_T); } ETH_DMAClearITPendingBit(ETH_DMA_IT_NIS); // }
void ETH_IRQ_Handler(void) { portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; if( ETH_GetDMAFlagStatus(ETH_DMA_FLAG_AIS) == SET) { vTracePrintF(xTraceOpenLabel("ETH IRQ"), "AIS received"); ETH_DMAClearITPendingBit(ETH_DMA_IT_AIS); if(ETH_GetDMAFlagStatus(ETH_DMA_IT_RBU) == SET) { vTracePrintF(xTraceOpenLabel("ETH IRQ"), "RBU received"); ETH_DMAClearITPendingBit(ETH_DMA_IT_RBU); } if(ETH_GetDMAFlagStatus(ETH_DMA_IT_RPS) == SET) { vTracePrintF(xTraceOpenLabel("ETH IRQ"), "RPS received"); ETH_DMAClearITPendingBit(ETH_DMA_IT_RPS); } if(ETH_GetDMAFlagStatus(ETH_DMA_IT_RO) == SET) { vTracePrintF(xTraceOpenLabel("ETH IRQ"), "RO received"); ETH_DMAClearITPendingBit(ETH_DMA_IT_RO); } if(ETH_GetDMAFlagStatus(ETH_DMA_IT_FBE) == SET) { vTracePrintF(xTraceOpenLabel("ETH IRQ"), "FBE received"); ETH_DMAClearITPendingBit(ETH_DMA_IT_FBE); } } if( ETH_GetDMAFlagStatus(ETH_DMA_FLAG_NIS) == SET) { /* Frame received */ if ( ETH_GetDMAFlagStatus(ETH_DMA_FLAG_R) == SET) { //vTracePrintF(xTraceOpenLabel("ETH IRQ"), "R received"); /* Give the semaphore to wakeup LwIP task (ethernetif_input)*/ xSemaphoreGiveFromISR( s_xSemaphore, &xHigherPriorityTaskWoken ); /* Clear the interrupt flags. */ /* Clear the Eth DMA Rx IT pending bits */ ETH_DMAClearITPendingBit(ETH_DMA_IT_R); ETH_DMAClearITPendingBit(ETH_DMA_IT_NIS); } } /* Switch tasks if necessary. */ if( xHigherPriorityTaskWoken != pdFALSE ) { portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); } }
/** * @brief This function handles ethernet DMA interrupt request. * @param None * @retval None */ void ETH_IRQHandler(void) { portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; /* Frame received */ if ( ETH_GetDMAFlagStatus(ETH_DMA_FLAG_R) == SET) { /* Give the semaphore to wakeup LwIP task */ xSemaphoreGiveFromISR( s_xSemaphore, &xHigherPriorityTaskWoken ); } /* Clear the interrupt flags. */ /* Clear the Eth DMA Rx IT pending bits */ ETH_DMAClearITPendingBit(ETH_DMA_IT_R); ETH_DMAClearITPendingBit(ETH_DMA_IT_NIS); /* Switch tasks if necessary. */ if ( xHigherPriorityTaskWoken != pdFALSE ) { portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); } }