Instalé RTX (rtos de Keil) y la biblioteca de Ethernet de STM para stm32f207 MC. Configuré UDP usando ethernet + LwIP como en los ejemplos de STM.
Sin RTOS UDP funciona bien. Envío y recibo paquetes sin ningún problema, pero con RTOS (RTX en mi caso) solo puedo enviar paquetes con solicitud ARP pero no puedo obtener paquetes porque no tengo interrupciones de Ethernet en los paquetes que reciben (no puedo obtener la bandera ETH_DMA_FLAG_R) ). Sé que hay paquetes de recuperación porque los veo en Wireshark.
Entonces, así es como configuro las interrupciones de Ethernet:
extern ETH_DMADESCTypeDef DMARxDscrTab[ETH_RXBUFNB], DMATxDscrTab[ETH_TXBUFNB];
/* Ethernet Receive buffers */
extern uint8_t Rx_Buff[ETH_RXBUFNB][ETH_RX_BUF_SIZE];
/* Ethernet Transmit buffers */
extern uint8_t Tx_Buff[ETH_TXBUFNB][ETH_TX_BUF_SIZE];
...
ETH_DMATxDescChainInit(DMATxDscrTab, &Tx_Buff[0][0], ETH_TXBUFNB);
/* Initialize Rx Descriptors list: Chain Mode */
ETH_DMARxDescChainInit(DMARxDscrTab, &Rx_Buff[0][0], ETH_RXBUFNB);
/* Enable Ethernet Rx interrrupt */
for(i=0; i<ETH_RXBUFNB; i++)
{
ETH_DMARxDescReceiveITConfig(&DMARxDscrTab[i], ENABLE);
}
for(i=0; i<ETH_TXBUFNB; i++)
{
ETH_DMATxDescTransmitITConfig(&DMATxDscrTab[i], ENABLE);
}
NVIC_EnableIRQ(ETH_IRQn);
...
void ETH_IRQHandler(void)
{
/* CANNOT ENTER HERE */
if (ETH_GetDMAFlagStatus(ETH_DMA_FLAG_R) == SET)
{
/* Give the semaphore to wakeup LwIP task */
sys_sem_signal(&s_xRxSemaphore);
}
/* Clear the interrupt flags. */
/* Clear the Eth DMA Rx IT pending bits */
ETH_DMAClearITPendingBit(ETH_DMA_IT_R);
ETH_DMAClearITPendingBit(ETH_DMA_IT_NIS);
}
Entonces, como dije, Wireshark me muestra que hay respuestas con las solicitudes de ARP con dirección de Mac, pero no puedo ingresar la interrupción para procesarlas.