Skip to main content
Bilge
Associate III
November 8, 2018
Question

.\STM32H743ZI-Nucleo\STM32H743ZI-Nucleo.axf: Error: L6218E: Undefined symbol sys_check_timeouts (referred from main.o).

  • November 8, 2018
  • 3 replies
  • 970 views

..

    This topic has been closed for replies.

    3 replies

    AvaTar
    Senior III
    November 8, 2018

    Add the source where this object is defined.

    Bilge
    BilgeAuthor
    Associate III
    November 8, 2018
    /* Includes ------------------------------------------------------------------*/
    #include "main.h"
    #include "ethernetif.h"
    #include "lwip/timeouts.h"
    #include "lwip/netif.h"
    #include "app_ethernet.h"
    #include "lwip/init.h"
    #include "udpecho.h"
    #include "netif/etharp.h"
    #include "lwip/opt.h"
    #if LWIP_DHCP 
    #include "lwip/dhcp.h"
    #endif
    /* Private typedef -----------------------------------------------------------*/
    /* Private define ------------------------------------------------------------*/
    /* Private macro -------------------------------------------------------------*/
    /* Private variables ---------------------------------------------------------*/
    struct netif gnetif; /* network interface structure */
     
    /* Private function prototypes -----------------------------------------------*/
    static void SystemClock_Config(void);
    static void BSP_Config(void);
    static void Netif_Config(void);
    static void MPU_Config(void);
    static void CPU_CACHE_Enable(void);
     
    /* Private functions ---------------------------------------------------------*/
     
    /**
     * @brief Main program
     * @param None
     * @retval None
     */
    int main(void)
    {
     /* Configure the MPU attributes as Device memory for ETH DMA descriptors */
     MPU_Config();
     
     /* Enable the CPU Cache */
     CPU_CACHE_Enable();
     
     /* STM32H7xx HAL library initialization:
     - Configure the SysTick to generate an interrupt each 1 msec
     - Set NVIC Group Priority to 4
     - Low Level Initialization
     */
     HAL_Init(); 
     
     /* Configure the system clock to 400 MHz */
     SystemClock_Config(); 
     
     /* Configure the LCD, LEDs, ...*/
     BSP_Config();
     
     /* Initialize the LwIP stack */
     lwip_init();
     
     /* Configure the Network interface */
     Netif_Config();
     
     /* UDP client connect */
     udp_echoclient_connect();
    	
     /* Infinite loop */
     while (1)
     { 
     /* Read a received packet from the Ethernet buffers and send it 
     to the lwIP for handling */
     ethernetif_input(&gnetif);
     
     /* Handle timeouts */
     sys_check_timeouts();
     
    #if LWIP_NETIF_LINK_CALLBACK 
     Ethernet_Link_Periodic_Handle(&gnetif);
    #endif
     
    #if LWIP_DHCP 
     DHCP_Periodic_Handle(&gnetif);
    #endif 
     } 
    }
     
    /**
     * @brief BSP Configuration 
     * @param None
     * @retval None
     */
    static void BSP_Config(void)
    {
     BSP_LED_Init(LED2);
     BSP_LED_Init(LED3);
    }
     
    /**
     * @brief Initializes the lwIP stack
     * @param None
     * @retval None
     */
    static void Netif_Config(void)
    {
     ip_addr_t ipaddr;
     ip_addr_t netmask;
     ip_addr_t gw;
     
    #if LWIP_DHCP
     ip_addr_set_zero_ip4(&ipaddr);
     ip_addr_set_zero_ip4(&netmask);
     ip_addr_set_zero_ip4(&gw);
    #else
     IP_ADDR4(&ipaddr,IP_ADDR0,IP_ADDR1,IP_ADDR2,IP_ADDR3);
     IP_ADDR4(&netmask,NETMASK_ADDR0,NETMASK_ADDR1,NETMASK_ADDR2,NETMASK_ADDR3);
     IP_ADDR4(&gw,GW_ADDR0,GW_ADDR1,GW_ADDR2,GW_ADDR3);
    #endif /* LWIP_DHCP */
     
     /* add the network interface */ 
     netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &ethernet_input);
     
     /* Registers the default network interface. */
     netif_set_default(&gnetif);
     
     ethernet_link_status_updated(&gnetif); 
     
    #if LWIP_NETIF_LINK_CALLBACK 
     netif_set_link_callback(&gnetif, ethernet_link_status_updated);
    #endif 
    }
    /**
     * @brief EXTI line detection callbacks
     * @param GPIO_Pin: Specifies the pins connected EXTI line
     * @retval None
     */
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
     
     if (GPIO_Pin == KEY_BUTTON_PIN)
     {
     /* send udp echo */ 
     udp_echoclient_send();
     }
    }
    /**
     * @brief System Clock Configuration
     * The system Clock is configured as follow : 
     * System Clock source = PLL (HSE BYPASS)
     * SYSCLK(Hz) = 400000000 (CPU Clock)
     * HCLK(Hz) = 200000000 (AXI and AHBs Clock)
     * AHB Prescaler = 2
     * D1 APB3 Prescaler = 2 (APB3 Clock 100MHz)
     * D2 APB1 Prescaler = 2 (APB1 Clock 100MHz)
     * D2 APB2 Prescaler = 2 (APB2 Clock 100MHz)
     * D3 APB4 Prescaler = 2 (APB4 Clock 100MHz)
     * HSE Frequency(Hz) = 8000000
     * PLL_M = 4
     * PLL_N = 400
     * PLL_P = 2
     * PLL_Q = 4
     * PLL_R = 2
     * VDD(V) = 3.3
     * Flash Latency(WS) = 4
     * @param None
     * @retval None
     */
    static void SystemClock_Config(void)
    {
     RCC_ClkInitTypeDef RCC_ClkInitStruct;
     RCC_OscInitTypeDef RCC_OscInitStruct;
     HAL_StatusTypeDef ret = HAL_OK;
     
     /*!< Supply configuration update enable */
     MODIFY_REG(PWR->CR3, PWR_CR3_SCUEN, 0);
     
     /* The voltage scaling allows optimizing the power consumption when the device is
     clocked below the maximum system frequency, to update the voltage scaling value
     regarding system frequency refer to product datasheet. */
     __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
     
     while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
     
     /* Enable D2 domain SRAM3 Clock (0x30040000 AXI)*/
     __HAL_RCC_D2SRAM3_CLK_ENABLE();
     
     /* Enable HSE Oscillator and activate PLL with HSE as source */
     RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
     RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;
     RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
     RCC_OscInitStruct.CSIState = RCC_CSI_OFF;
     RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
     RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
     
     RCC_OscInitStruct.PLL.PLLM = 4;
     RCC_OscInitStruct.PLL.PLLN = 400;
     RCC_OscInitStruct.PLL.PLLP = 2;
     RCC_OscInitStruct.PLL.PLLR = 2;
     RCC_OscInitStruct.PLL.PLLQ = 4;
     
     RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
     RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
     ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
     if(ret != HAL_OK)
     {
     while(1);
     }
     
     /* Select PLL as system clock source and configure bus clocks dividers */
     RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \
     RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_D3PCLK1);
     
     RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
     RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
     RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
     RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2; 
     RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2; 
     RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2; 
     RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2; 
     ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);
     if(ret != HAL_OK)
     {
     while(1);
    		
     }
    }
     
    /**
     * @brief Configure the MPU attributes 
     * @param None
     * @retval None
     */
    static void MPU_Config(void)
    {
     MPU_Region_InitTypeDef MPU_InitStruct;
     
     /* Disable the MPU */
     HAL_MPU_Disable();
     
     /* Configure the MPU attributes as Device not cacheable 
     for ETH DMA descriptors */
     MPU_InitStruct.Enable = MPU_REGION_ENABLE;
     MPU_InitStruct.BaseAddress = 0x30040000;
     MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
     MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
     MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
     MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
     MPU_InitStruct.Number = MPU_REGION_NUMBER0;
     MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
     MPU_InitStruct.SubRegionDisable = 0x00;
     MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
     
     HAL_MPU_ConfigRegion(&MPU_InitStruct);
     
     /* Configure the MPU attributes as Cacheable write through 
     for LwIP RAM heap which contains the Tx buffers */
     MPU_InitStruct.Enable = MPU_REGION_ENABLE;
     MPU_InitStruct.BaseAddress = 0x30044000;
     MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;
     MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
     MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
     MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
     MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
     MPU_InitStruct.Number = MPU_REGION_NUMBER1;
     MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
     MPU_InitStruct.SubRegionDisable = 0x00;
     MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
     
     HAL_MPU_ConfigRegion(&MPU_InitStruct);
     
     /* Enable the MPU */
     HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
    }
     
    /**
     * @brief CPU L1-Cache enable.
     * @param None
     * @retval None
     */
    static void CPU_CACHE_Enable(void)
    {
     /* Enable I-Cache */
     SCB_EnableICache();
     
     /* Enable D-Cache */
     SCB_EnableDCache();
    }
     
    #ifdef USE_FULL_ASSERT
     
    /**
     * @brief Reports the name of the source file and the source line number
     * where the assert_param error has occurred.
     * @param file: pointer to the source file name
     * @param line: assert_param error line source number
     * @retval None
     */
    void assert_failed(uint8_t* file, uint32_t line)
    { 
     /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
     
     /* Infinite loop */
     while (1)
     {
     }
    }
    #endif
     
    /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

    AvaTar
    Senior III
    November 8, 2018

    This function is part of LWIP. I suggest to add all relevant file to your project.