LWIP API UDP sin formato en STM32F2 / F7 generado por CubeMX que no se envía en el inicio, requiere una cantidad arbitraria de restablecimientos para funcionar

0

Estoy trabajando en un proyecto utilizando la API sin formato de LWIP con el stm32f2 y no puedo hacer que funcione. El concepto básico del proyecto es que el stm32f2 actúe como el actuador y reciba instrucciones de otra máquina a través de la conexión UDP.

Fui por la ruta habitual y configuré la interfaz RMII para Ethernet, configuré LWIP para incluir los módulos UDP, DHCP deshabilitado (estamos usando IPs estáticas), habilité la función arp y luego generé el código.

Para las pruebas conecté mi computadora portátil a un enrutador, conecté la placa a la del enrutador, y luego tuve una toma UDP en mi computadora portátil que arrojó datos a la placa que se suponía que la placa debía hacer eco, mientras miraba todo en Wireshark y enviar los datos repetidos al terminal.

Cuando ejecuté el programa no vi absolutamente nada saliendo del tablero y ninguna respuesta a las solicitudes de ARP que mi máquina local estaba generando.

Después de juguetear con algunas configuraciones sin éxito, encendí y apagué el tablero varias veces solo para encontrar que la aplicación cobró vida de repente sin ningún problema. Intenté ejecutarlo varias veces más y descubrí que después de presionar el botón de reinicio varias veces (la cantidad que cambiaba cada vez que lo ejecutaba) eventualmente respondería a la solicitud de ARP y las cosas funcionarían bien desde allí, pero esa es la suma total de Mi progreso hasta ahora.

He podido ejecutar el ejemplo de la API de NETCONN sin incluir con el paquete stm32f2 sin ningún problema y verifiqué las configuraciones de registro y reloj de LAN Phy y no encontré problemas.

He intentado usar sockets TCP, ejecutando ejemplos básicos para un servidor de eco desde la página LWIP, y todos tienen el mismo problema.

Luego intenté que funcionara en mi STM32F7 y tuve exactamente el mismo problema. Hasta que reinicie el tablero es absolutamente silencioso. Me preocupa haber olvidado algo en la configuración, pero realmente estoy un poco perdido aquí ... ¿Alguien tiene alguna idea?

A continuación se encuentra mi lwip.c donde se implementan las estructuras y la función principal en main.c, que llama a LWIP_INIT () y LWIP_Process ():

lwip.c

long total_msgs;
uint8_t data[100];
struct udp_pcb* upcb;
ip4_addr_t destIPAddr;
/* USER CODE END 0 */
/* Private function prototypes -----------------------------------------------*/
/* ETH Variables initialization ----------------------------------------------*/
void _Error_Handler(char * file, int line);

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/* Variables Initialization */
struct netif gnetif;
ip4_addr_t ipaddr;
ip4_addr_t netmask;
ip4_addr_t gw;
uint8_t IP_ADDRESS[4];
uint8_t NETMASK_ADDRESS[4];
uint8_t GATEWAY_ADDRESS[4];

/* USER CODE BEGIN 2 */
void udp_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port){
      struct pbuf *p;
      sprintf((char*)data, "sending udp client message %d", (int)message_count);
      /* allocate pbuf from pool*/
      p = pbuf_alloc(PBUF_TRANSPORT,strlen((char*)data), PBUF_POOL);
      if (p != NULL)
      {
        /* copy data to pbuf */
        pbuf_take(p, (char*)data, strlen((char*)data));

        /* send udp data */
        udp_send(upcb, p);

        /* free pbuf */
        pbuf_free(p);
      }
}


err_t create_udp_socket(){
    err_t err = ERR_OK;
    upcb = udp_new();

    if (upcb == NULL){
        return ERR_MEM;
    }
    // Load the static IP of the destination address
    IP4_ADDR(&destIPAddr,192,168,1,10);
    upcb->local_port = 4004; // Set our local port to 4004
    // Should bind to the local ip and port
    err = udp_bind(upcb,IP4_ADDR_ANY,4004);
    if (err != ERR_OK){
        return err;
    }
    // Connect to the other port
    err = udp_connect(upcb,&destIPAddr,1234);
    if (err != ERR_OK){
        return err;
    }
    // Set the receive function
    udp_recv(upcb,udp_receive_callback,NULL);
    return err;
}

err_t send_msg_to_dest(){
    struct pbuf *p;

    sprintf((char*)data, "sending udp client message %d", (int)total_msgs);

    /* allocate pbuf from pool*/
    p = pbuf_alloc(PBUF_TRANSPORT,strlen((char*)data), PBUF_POOL);

    if (p != NULL)
    {
        /* copy data to pbuf */
        pbuf_take(p, (char*)data, strlen((char*)data));

        /* send udp data */
        udp_send(upcb, p);

        /* free pbuf */
        pbuf_free(p);
        return ERR_OK;
    }
    return ERR_MEM;
}
/* USER CODE END 2 */

/**
  * LwIP initialization function
  */
void MX_LWIP_Init(void)
{
  /* IP addresses initialization */
  IP_ADDRESS[0] = 192;
  IP_ADDRESS[1] = 168;
  IP_ADDRESS[2] = 1;
  IP_ADDRESS[3] = 100;
  NETMASK_ADDRESS[0] = 255;
  NETMASK_ADDRESS[1] = 255;
  NETMASK_ADDRESS[2] = 255;
  NETMASK_ADDRESS[3] = 0;
  GATEWAY_ADDRESS[0] = 192;
  GATEWAY_ADDRESS[1] = 168;
  GATEWAY_ADDRESS[2] = 1;
  GATEWAY_ADDRESS[3] = 1;

  /* Initilialize the LwIP stack without RTOS */
  lwip_init();

  /* IP addresses initialization without DHCP (IPv4) */
  IP4_ADDR(&ipaddr, IP_ADDRESS[0], IP_ADDRESS[1], IP_ADDRESS[2], IP_ADDRESS[3]);
  IP4_ADDR(&netmask, NETMASK_ADDRESS[0], NETMASK_ADDRESS[1] , NETMASK_ADDRESS[2], NETMASK_ADDRESS[3]);
  IP4_ADDR(&gw, GATEWAY_ADDRESS[0], GATEWAY_ADDRESS[1], GATEWAY_ADDRESS[2], GATEWAY_ADDRESS[3]);

  /* add the network interface (IPv4/IPv6) without RTOS */
  netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &ethernet_input);

  /* Registers the default network interface */
  netif_set_default(&gnetif);

  if (netif_is_link_up(&gnetif))
  {
    /* When the netif is fully configured this function must be called */
    netif_set_up(&gnetif);
  }
  else
  {
    /* When the netif link is down this function must be called */
    netif_set_down(&gnetif);
  }

  /* Set the link callback function, this function is called on change of link status*/
  netif_set_link_callback(&gnetif, ethernetif_update_config);

  // Setup the udp port
  create_udp_socket();
}
void MX_LWIP_Process(void)
{
  ethernetif_set_link(&gnetif);
  ethernetif_input(&gnetif);

  send_msg_to_dest();
  sys_check_timeouts();
}

main.c

int main(void)
{
  HAL_Init();

  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_LWIP_Init();
  /* USER CODE BEGIN 2 */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
      MX_LWIP_Process();
      HAL_Delay(800);
  }
  /* USER CODE END 3 */

}
    
pregunta Nic_Hemstreet

0 respuestas

Lea otras preguntas en las etiquetas