stm32f207 ethernet interrumpe el problema

1

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.

    
pregunta Igor1488

1 respuesta

1

La respuesta a mi pregunta es simple: me olvidé de la función básica para habilitar las interrupciones DMA.

ETH_DMAITConfig(ETH_DMA_IT_NIS | ETH_DMA_IT_R, ENABLE);

donde es necesaria la interrupción ETH_DMA_IT_NIS para incluir, de lo contrario no funcionaría para recibir (y transmitir si es necesario)

    
respondido por el Igor1488

Lea otras preguntas en las etiquetas