/* 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_IRQHandler(void) { while(ETH_GetRxPktSize(DMARxDescToGet)!=0) //检测是否收到数据包 { LwIP_Pkt_Handle(); } ETH_DMAClearITPendingBit(ETH_DMA_IT_R); ETH_DMAClearITPendingBit(ETH_DMA_IT_NIS); }
/** * @brief This function handles ETH interrupt request. * @param None * @retval None */ void ETH_IRQHandler(void) { /* Handles all the received frames */ while(ETH_GetRxPktSize(DMARxDescToGet) != 0) { LwIP_Pkt_Handle(); } /* Clear the Eth DMA Rx IT pending bits */ ETH_DMAClearITPendingBit(ETH_DMA_IT_R); ETH_DMAClearITPendingBit(ETH_DMA_IT_NIS); }
/** * @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 ); } }
/* Eth Isr routine */ static void Eth_Isr(void) { uint32_t res = 0; while((ETH_GetRxPktSize() != 0) && (res == 0)) { /* move received packet into a new pbuf */ struct pbuf *p = low_level_input(&netif); if(p!=NULL){ tcpip_input(p, &netif); }else{ res = 1; } } /* Clear the Eth DMA Rx IT pending bits */ ETH_DMAClearITPendingBit(ETH_DMA_IT_R); ETH_DMAClearITPendingBit(ETH_DMA_IT_NIS); ETH_DMAClearITPendingBit(ETH_DMA_IT_RO); ETH_DMAClearITPendingBit(ETH_DMA_IT_RBU); }
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 ); } }