diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c index 445e078..41390f3 100644 --- a/Core/Src/freertos.c +++ b/Core/Src/freertos.c @@ -64,6 +64,7 @@ osThreadId dac_taskHandle; osThreadId adc_taskHandle; osThreadId gpio_di_do_taskHandle; osThreadId ec11_taskHandle; +osThreadId uart_forwardingHandle; /* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN FunctionPrototypes */ @@ -158,6 +159,10 @@ void MX_FREERTOS_Init(void) osThreadDef(ec11_task, start_ec11_task, osPriorityNormal, 0, 512); ec11_taskHandle = osThreadCreate(osThread(ec11_task), NULL); + /* definition and creation of uart_forwarding */ + osThreadDef(uart_forwarding, start_uart_forwarding, osPriorityRealtime, 0, 512); + uart_forwardingHandle = osThreadCreate(osThread(uart_forwarding), NULL); + /* USER CODE BEGIN RTOS_THREADS */ /* add threads, ... */ /* USER CODE END RTOS_THREADS */ diff --git a/LWIP/App/lwip.c b/LWIP/App/lwip.c index 7ce8f9b..61a1c5b 100644 --- a/LWIP/App/lwip.c +++ b/LWIP/App/lwip.c @@ -22,7 +22,7 @@ #include "lwip.h" #include "lwip/init.h" #include "lwip/netif.h" -#if defined(__CC_ARM) /* MDK ARM Compiler */ +#if defined ( __CC_ARM ) /* MDK ARM Compiler */ #include "lwip/sio.h" #endif /* MDK ARM Compiler */ #include "ethernetif.h" @@ -53,8 +53,8 @@ uint8_t GATEWAY_ADDRESS[4]; /* USER CODE END 2 */ /** - * LwIP initialization function - */ + * LwIP initialization function + */ void MX_LWIP_Init(void) { /* IP addresses initialization */ @@ -71,7 +71,7 @@ void MX_LWIP_Init(void) GATEWAY_ADDRESS[2] = 1; GATEWAY_ADDRESS[3] = 29; - /* USER CODE BEGIN IP_ADDRESSES */ +/* USER CODE BEGIN IP_ADDRESSES */ uint8_t ip_address_flash[4] = {0,0,0,0}; flash_read_data(FLASH_USER_START_ADDR, ip_address_flash, 4); if (ip_address_flash[0] == 192) @@ -81,14 +81,14 @@ void MX_LWIP_Init(void) IP_ADDRESS[2] = ip_address_flash[2]; IP_ADDRESS[3] = ip_address_flash[3]; } - /* USER CODE END IP_ADDRESSES */ +/* USER CODE END IP_ADDRESSES */ /* Initilialize the LwIP stack with RTOS */ - tcpip_init(NULL, NULL); + tcpip_init( NULL, NULL ); /* 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(&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) with RTOS */ @@ -112,14 +112,14 @@ void MX_LWIP_Init(void) netif_set_link_callback(&gnetif, ethernet_link_status_updated); /* Create the Ethernet link handler thread */ - /* USER CODE BEGIN H7_OS_THREAD_DEF_CREATE_CMSIS_RTOS_V1 */ +/* USER CODE BEGIN H7_OS_THREAD_DEF_CREATE_CMSIS_RTOS_V1 */ osThreadDef(EthLink, ethernet_link_thread, osPriorityBelowNormal, 0, configMINIMAL_STACK_SIZE * 2); osThreadCreate(osThread(EthLink), &gnetif); - /* USER CODE END H7_OS_THREAD_DEF_CREATE_CMSIS_RTOS_V1 */ +/* USER CODE END H7_OS_THREAD_DEF_CREATE_CMSIS_RTOS_V1 */ - /* USER CODE BEGIN 3 */ +/* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ +/* USER CODE END 3 */ } #ifdef USE_OBSOLETE_USER_CODE_SECTION_4 @@ -130,25 +130,25 @@ void MX_LWIP_Init(void) #endif /** - * @brief Notify the User about the network interface config status - * @param netif: the network interface - * @retval None - */ + * @brief Notify the User about the network interface config status + * @param netif: the network interface + * @retval None + */ static void ethernet_link_status_updated(struct netif *netif) { if (netif_is_up(netif)) { - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ +/* USER CODE BEGIN 5 */ +/* USER CODE END 5 */ } else /* netif is down */ { - /* USER CODE BEGIN 6 */ - /* USER CODE END 6 */ +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ } } -#if defined(__CC_ARM) /* MDK ARM Compiler */ +#if defined ( __CC_ARM ) /* MDK ARM Compiler */ /** * Opens a serial device for communication. * @@ -159,9 +159,9 @@ sio_fd_t sio_open(u8_t devnum) { sio_fd_t sd; - /* USER CODE BEGIN 7 */ +/* USER CODE BEGIN 7 */ sd = 0; // dummy code - /* USER CODE END 7 */ +/* USER CODE END 7 */ return sd; } @@ -176,8 +176,8 @@ sio_fd_t sio_open(u8_t devnum) */ void sio_send(u8_t c, sio_fd_t fd) { - /* USER CODE BEGIN 8 */ - /* USER CODE END 8 */ +/* USER CODE BEGIN 8 */ +/* USER CODE END 8 */ } /** @@ -195,9 +195,9 @@ u32_t sio_read(sio_fd_t fd, u8_t *data, u32_t len) { u32_t recved_bytes; - /* USER CODE BEGIN 9 */ +/* USER CODE BEGIN 9 */ recved_bytes = 0; // dummy code - /* USER CODE END 9 */ +/* USER CODE END 9 */ return recved_bytes; } @@ -214,9 +214,10 @@ u32_t sio_tryread(sio_fd_t fd, u8_t *data, u32_t len) { u32_t recved_bytes; - /* USER CODE BEGIN 10 */ +/* USER CODE BEGIN 10 */ recved_bytes = 0; // dummy code - /* USER CODE END 10 */ +/* USER CODE END 10 */ return recved_bytes; } #endif /* MDK ARM Compiler */ + diff --git a/LWIP/Target/ethernetif.c b/LWIP/Target/ethernetif.c index ec81e4e..6acc308 100644 --- a/LWIP/Target/ethernetif.c +++ b/LWIP/Target/ethernetif.c @@ -38,7 +38,7 @@ /* Private define ------------------------------------------------------------*/ /* The time to block waiting for input. */ -#define TIME_WAITING_FOR_INPUT (portMAX_DELAY) +#define TIME_WAITING_FOR_INPUT ( portMAX_DELAY ) /* USER CODE BEGIN OS_THREAD_STACK_SIZE_WITH_RTOS */ /* Stack size of the interface thread */ #define INTERFACE_THREAD_STACK_SIZE (350) @@ -48,8 +48,8 @@ #define IFNAME1 't' /* ETH Setting */ -#define ETH_DMA_TRANSMIT_TIMEOUT (20U) -#define ETH_TX_BUFFER_MAX ((ETH_TX_DESC_CNT) * 2U) +#define ETH_DMA_TRANSMIT_TIMEOUT ( 20U ) +#define ETH_TX_BUFFER_MAX ((ETH_TX_DESC_CNT) * 2U) /* USER CODE BEGIN 1 */ @@ -81,8 +81,8 @@ /* Data Type Definitions */ typedef enum { - RX_ALLOC_OK = 0x00, - RX_ALLOC_ERROR = 0x01 + RX_ALLOC_OK = 0x00, + RX_ALLOC_ERROR = 0x01 } RxAllocStatusTypeDef; typedef struct @@ -92,40 +92,40 @@ typedef struct } RxBuff_t; /* Memory Pool Declaration */ -#define ETH_RX_BUFFER_CNT 12U +#define ETH_RX_BUFFER_CNT 12U LWIP_MEMPOOL_DECLARE(RX_POOL, ETH_RX_BUFFER_CNT, sizeof(RxBuff_t), "Zero-copy RX PBUF pool"); /* Variable Definitions */ static uint8_t RxAllocStatus; -ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */ -ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */ +ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */ +ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */ /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ -osSemaphoreId RxPktSemaphore = NULL; /* Semaphore to signal incoming packets */ -osSemaphoreId TxPktSemaphore = NULL; /* Semaphore to signal transmit packet complete */ +osSemaphoreId RxPktSemaphore = NULL; /* Semaphore to signal incoming packets */ +osSemaphoreId TxPktSemaphore = NULL; /* Semaphore to signal transmit packet complete */ /* Global Ethernet handle */ ETH_HandleTypeDef heth; ETH_TxPacketConfig TxConfig; /* Private function prototypes -----------------------------------------------*/ -static void ethernetif_input(void const *argument); +static void ethernetif_input(void const * argument); int32_t ETH_PHY_IO_Init(void); -int32_t ETH_PHY_IO_DeInit(void); +int32_t ETH_PHY_IO_DeInit (void); int32_t ETH_PHY_IO_ReadReg(uint32_t DevAddr, uint32_t RegAddr, uint32_t *pRegVal); int32_t ETH_PHY_IO_WriteReg(uint32_t DevAddr, uint32_t RegAddr, uint32_t RegVal); int32_t ETH_PHY_IO_GetTick(void); lan8742_Object_t LAN8742; -lan8742_IOCtx_t LAN8742_IOCtx = {ETH_PHY_IO_Init, - ETH_PHY_IO_DeInit, - ETH_PHY_IO_WriteReg, - ETH_PHY_IO_ReadReg, - ETH_PHY_IO_GetTick}; +lan8742_IOCtx_t LAN8742_IOCtx = {ETH_PHY_IO_Init, + ETH_PHY_IO_DeInit, + ETH_PHY_IO_WriteReg, + ETH_PHY_IO_ReadReg, + ETH_PHY_IO_GetTick}; /* USER CODE BEGIN 3 */ @@ -135,33 +135,33 @@ lan8742_IOCtx_t LAN8742_IOCtx = {ETH_PHY_IO_Init, void pbuf_free_custom(struct pbuf *p); /** - * @brief Ethernet Rx Transfer completed callback - * @param handlerEth: ETH handler - * @retval None - */ + * @brief Ethernet Rx Transfer completed callback + * @param handlerEth: ETH handler + * @retval None + */ void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *handlerEth) { osSemaphoreRelease(RxPktSemaphore); } /** - * @brief Ethernet Tx Transfer completed callback - * @param handlerEth: ETH handler - * @retval None - */ + * @brief Ethernet Tx Transfer completed callback + * @param handlerEth: ETH handler + * @retval None + */ void HAL_ETH_TxCpltCallback(ETH_HandleTypeDef *handlerEth) { osSemaphoreRelease(TxPktSemaphore); } /** - * @brief Ethernet DMA transfer error callback - * @param handlerEth: ETH handler - * @retval None - */ + * @brief Ethernet DMA transfer error callback + * @param handlerEth: ETH handler + * @retval None + */ void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *handlerEth) { - if ((HAL_ETH_GetDMAError(handlerEth) & ETH_DMASR_RBUS) == ETH_DMASR_RBUS) + if((HAL_ETH_GetDMAError(handlerEth) & ETH_DMASR_RBUS) == ETH_DMASR_RBUS) { - osSemaphoreRelease(RxPktSemaphore); + osSemaphoreRelease(RxPktSemaphore); } } @@ -187,7 +187,7 @@ static void low_level_init(struct netif *netif) ETH_MACConfigTypeDef MACConf = {0}; /* Start ETH HAL Init */ - uint8_t MACAddr[6]; + uint8_t MACAddr[6] ; heth.Instance = ETH; MACAddr[0] = 0x00; MACAddr[1] = 0x80; @@ -210,7 +210,7 @@ static void low_level_init(struct netif *netif) hal_eth_init_status = HAL_ETH_Init(&heth); - memset(&TxConfig, 0, sizeof(ETH_TxPacketConfig)); + memset(&TxConfig, 0 , sizeof(ETH_TxPacketConfig)); TxConfig.Attributes = ETH_TX_PACKETS_FEATURES_CSUM | ETH_TX_PACKETS_FEATURES_CRCPAD; TxConfig.ChecksumCtrl = ETH_CHECKSUM_IPHDR_PAYLOAD_INSERT_PHDR_CALC; TxConfig.CRCPadCtrl = ETH_CRC_PAD_INSERT; @@ -226,23 +226,23 @@ static void low_level_init(struct netif *netif) netif->hwaddr_len = ETH_HWADDR_LEN; /* set MAC hardware address */ - netif->hwaddr[0] = heth.Init.MACAddr[0]; - netif->hwaddr[1] = heth.Init.MACAddr[1]; - netif->hwaddr[2] = heth.Init.MACAddr[2]; - netif->hwaddr[3] = heth.Init.MACAddr[3]; - netif->hwaddr[4] = heth.Init.MACAddr[4]; - netif->hwaddr[5] = heth.Init.MACAddr[5]; + netif->hwaddr[0] = heth.Init.MACAddr[0]; + netif->hwaddr[1] = heth.Init.MACAddr[1]; + netif->hwaddr[2] = heth.Init.MACAddr[2]; + netif->hwaddr[3] = heth.Init.MACAddr[3]; + netif->hwaddr[4] = heth.Init.MACAddr[4]; + netif->hwaddr[5] = heth.Init.MACAddr[5]; /* maximum transfer unit */ netif->mtu = ETH_MAX_PAYLOAD; -/* Accept broadcast address and ARP traffic */ -/* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */ -#if LWIP_ARP - netif->flags |= NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP; -#else - netif->flags |= NETIF_FLAG_BROADCAST; -#endif /* LWIP_ARP */ + /* Accept broadcast address and ARP traffic */ + /* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */ + #if LWIP_ARP + netif->flags |= NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP; + #else + netif->flags |= NETIF_FLAG_BROADCAST; + #endif /* LWIP_ARP */ /* create a binary semaphore used for informing ethernetif of frame reception */ RxPktSemaphore = xSemaphoreCreateBinary(); @@ -251,14 +251,14 @@ static void low_level_init(struct netif *netif) TxPktSemaphore = xSemaphoreCreateBinary(); /* create the task that handles the ETH_MAC */ - /* USER CODE BEGIN OS_THREAD_DEF_CREATE_CMSIS_RTOS_V1 */ +/* USER CODE BEGIN OS_THREAD_DEF_CREATE_CMSIS_RTOS_V1 */ osThreadDef(EthIf, ethernetif_input, osPriorityRealtime, 0, INTERFACE_THREAD_STACK_SIZE); osThreadCreate(osThread(EthIf), netif); - /* USER CODE END OS_THREAD_DEF_CREATE_CMSIS_RTOS_V1 */ +/* USER CODE END OS_THREAD_DEF_CREATE_CMSIS_RTOS_V1 */ - /* USER CODE BEGIN PHY_PRE_CONFIG */ +/* USER CODE BEGIN PHY_PRE_CONFIG */ - /* USER CODE END PHY_PRE_CONFIG */ +/* USER CODE END PHY_PRE_CONFIG */ /* Set PHY IO functions */ LAN8742_RegisterBusIO(&LAN8742, &LAN8742_IOCtx); @@ -270,7 +270,7 @@ static void low_level_init(struct netif *netif) PHYLinkState = LAN8742_GetLinkState(&LAN8742); /* Get link state */ - if (PHYLinkState <= LAN8742_STATUS_LINK_DOWN) + if(PHYLinkState <= LAN8742_STATUS_LINK_DOWN) { netif_set_link_down(netif); netif_set_down(netif); @@ -301,20 +301,21 @@ static void low_level_init(struct netif *netif) break; } - /* Get MAC Config MAC */ - HAL_ETH_GetMACConfig(&heth, &MACConf); - MACConf.DuplexMode = duplex; - MACConf.Speed = speed; - HAL_ETH_SetMACConfig(&heth, &MACConf); + /* Get MAC Config MAC */ + HAL_ETH_GetMACConfig(&heth, &MACConf); + MACConf.DuplexMode = duplex; + MACConf.Speed = speed; + HAL_ETH_SetMACConfig(&heth, &MACConf); - HAL_ETH_Start_IT(&heth); - netif_set_up(netif); - netif_set_link_up(netif); + HAL_ETH_Start_IT(&heth); + netif_set_up(netif); + netif_set_link_up(netif); - /* USER CODE BEGIN PHY_POST_CONFIG */ +/* USER CODE BEGIN PHY_POST_CONFIG */ - /* USER CODE END PHY_POST_CONFIG */ +/* USER CODE END PHY_POST_CONFIG */ } + } else { @@ -322,9 +323,9 @@ static void low_level_init(struct netif *netif) } #endif /* LWIP_ARP || LWIP_ETHERNET */ - /* USER CODE BEGIN LOW_LEVEL_INIT */ +/* USER CODE BEGIN LOW_LEVEL_INIT */ - /* USER CODE END LOW_LEVEL_INIT */ +/* USER CODE END LOW_LEVEL_INIT */ } /** @@ -350,22 +351,22 @@ static err_t low_level_output(struct netif *netif, struct pbuf *p) err_t errval = ERR_OK; ETH_BufferTypeDef Txbuffer[ETH_TX_DESC_CNT] = {0}; - memset(Txbuffer, 0, ETH_TX_DESC_CNT * sizeof(ETH_BufferTypeDef)); + memset(Txbuffer, 0 , ETH_TX_DESC_CNT*sizeof(ETH_BufferTypeDef)); - for (q = p; q != NULL; q = q->next) + for(q = p; q != NULL; q = q->next) { - if (i >= ETH_TX_DESC_CNT) + if(i >= ETH_TX_DESC_CNT) return ERR_IF; Txbuffer[i].buffer = q->payload; Txbuffer[i].len = q->len; - if (i > 0) + if(i>0) { - Txbuffer[i - 1].next = &Txbuffer[i]; + Txbuffer[i-1].next = &Txbuffer[i]; } - if (q->next == NULL) + if(q->next == NULL) { Txbuffer[i].next = NULL; } @@ -380,7 +381,7 @@ static err_t low_level_output(struct netif *netif, struct pbuf *p) pbuf_ref(p); HAL_ETH_Transmit_IT(&heth, &TxConfig); - while (osSemaphoreWait(TxPktSemaphore, TIME_WAITING_FOR_INPUT) != osOK) + while(osSemaphoreWait(TxPktSemaphore, TIME_WAITING_FOR_INPUT)!=osOK) { } @@ -397,12 +398,12 @@ static err_t low_level_output(struct netif *netif, struct pbuf *p) * @param netif the lwip network interface structure for this ethernetif * @return a pbuf filled with the received packet (including MAC header) * NULL on memory error - */ -static struct pbuf *low_level_input(struct netif *netif) + */ +static struct pbuf * low_level_input(struct netif *netif) { struct pbuf *p = NULL; - if (RxAllocStatus == RX_ALLOC_OK) + if(RxAllocStatus == RX_ALLOC_OK) { HAL_ETH_ReadData(&heth, (void **)&p); } @@ -419,26 +420,26 @@ static struct pbuf *low_level_input(struct netif *netif) * * @param netif the lwip network interface structure for this ethernetif */ -static void ethernetif_input(void const *argument) +static void ethernetif_input(void const * argument) { struct pbuf *p = NULL; - struct netif *netif = (struct netif *)argument; + struct netif *netif = (struct netif *) argument; - for (;;) + for( ;; ) { if (osSemaphoreWait(RxPktSemaphore, TIME_WAITING_FOR_INPUT) == osOK) { do { - p = low_level_input(netif); + p = low_level_input( netif ); if (p != NULL) { - if (netif->input(p, netif) != ERR_OK) + if (netif->input( p, netif) != ERR_OK ) { pbuf_free(p); } } - } while (p != NULL); + } while(p!=NULL); } } } @@ -455,11 +456,12 @@ static err_t low_level_output_arp_off(struct netif *netif, struct pbuf *q, const err_t errval; errval = ERR_OK; - /* USER CODE BEGIN 5 */ +/* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ +/* USER CODE END 5 */ return errval; + } #endif /* LWIP_ARP */ @@ -522,13 +524,13 @@ err_t ethernetif_init(struct netif *netif) } /** - * @brief Custom Rx pbuf free callback - * @param pbuf: pbuf to be freed - * @retval None - */ + * @brief Custom Rx pbuf free callback + * @param pbuf: pbuf to be freed + * @retval None + */ void pbuf_free_custom(struct pbuf *p) { - struct pbuf_custom *custom_pbuf = (struct pbuf_custom *)p; + struct pbuf_custom* custom_pbuf = (struct pbuf_custom*)p; LWIP_MEMPOOL_FREE(RX_POOL, custom_pbuf); /* If the Rx Buffer Pool was exhausted, signal the ethernetif_input task to @@ -557,19 +559,19 @@ u32_t sys_now(void) /* USER CODE END 6 */ /** - * @brief Initializes the ETH MSP. - * @param ethHandle: ETH handle - * @retval None - */ + * @brief Initializes the ETH MSP. + * @param ethHandle: ETH handle + * @retval None + */ -void HAL_ETH_MspInit(ETH_HandleTypeDef *ethHandle) +void HAL_ETH_MspInit(ETH_HandleTypeDef* ethHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; - if (ethHandle->Instance == ETH) + if(ethHandle->Instance==ETH) { - /* USER CODE BEGIN ETH_MspInit 0 */ + /* USER CODE BEGIN ETH_MspInit 0 */ - /* USER CODE END ETH_MspInit 0 */ + /* USER CODE END ETH_MspInit 0 */ /* Enable Peripheral clock */ __HAL_RCC_ETH_CLK_ENABLE(); @@ -587,21 +589,21 @@ void HAL_ETH_MspInit(ETH_HandleTypeDef *ethHandle) PB12 ------> ETH_TXD0 PB13 ------> ETH_TXD1 */ - GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5; + GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF11_ETH; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7; + GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF11_ETH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13; + GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; @@ -611,19 +613,19 @@ void HAL_ETH_MspInit(ETH_HandleTypeDef *ethHandle) /* Peripheral interrupt init */ HAL_NVIC_SetPriority(ETH_IRQn, 5, 0); HAL_NVIC_EnableIRQ(ETH_IRQn); - /* USER CODE BEGIN ETH_MspInit 1 */ + /* USER CODE BEGIN ETH_MspInit 1 */ - /* USER CODE END ETH_MspInit 1 */ + /* USER CODE END ETH_MspInit 1 */ } } -void HAL_ETH_MspDeInit(ETH_HandleTypeDef *ethHandle) +void HAL_ETH_MspDeInit(ETH_HandleTypeDef* ethHandle) { - if (ethHandle->Instance == ETH) + if(ethHandle->Instance==ETH) { - /* USER CODE BEGIN ETH_MspDeInit 0 */ + /* USER CODE BEGIN ETH_MspDeInit 0 */ - /* USER CODE END ETH_MspDeInit 0 */ + /* USER CODE END ETH_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_ETH_CLK_DISABLE(); @@ -638,18 +640,18 @@ void HAL_ETH_MspDeInit(ETH_HandleTypeDef *ethHandle) PB12 ------> ETH_TXD0 PB13 ------> ETH_TXD1 */ - HAL_GPIO_DeInit(GPIOC, GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5); + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5); - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7); + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7); - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13); + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13); /* Peripheral interrupt Deinit*/ HAL_NVIC_DisableIRQ(ETH_IRQn); - /* USER CODE BEGIN ETH_MspDeInit 1 */ + /* USER CODE BEGIN ETH_MspDeInit 1 */ - /* USER CODE END ETH_MspDeInit 1 */ + /* USER CODE END ETH_MspDeInit 1 */ } } @@ -657,10 +659,10 @@ void HAL_ETH_MspDeInit(ETH_HandleTypeDef *ethHandle) PHI IO Functions *******************************************************************************/ /** - * @brief Initializes the MDIO interface GPIO and clocks. - * @param None - * @retval 0 if OK, -1 if ERROR - */ + * @brief Initializes the MDIO interface GPIO and clocks. + * @param None + * @retval 0 if OK, -1 if ERROR + */ int32_t ETH_PHY_IO_Init(void) { /* We assume that MDIO GPIO configuration is already done @@ -674,25 +676,25 @@ int32_t ETH_PHY_IO_Init(void) } /** - * @brief De-Initializes the MDIO interface . - * @param None - * @retval 0 if OK, -1 if ERROR - */ -int32_t ETH_PHY_IO_DeInit(void) + * @brief De-Initializes the MDIO interface . + * @param None + * @retval 0 if OK, -1 if ERROR + */ +int32_t ETH_PHY_IO_DeInit (void) { return 0; } /** - * @brief Read a PHY register through the MDIO interface. - * @param DevAddr: PHY port address - * @param RegAddr: PHY register address - * @param pRegVal: pointer to hold the register value - * @retval 0 if OK -1 if Error - */ + * @brief Read a PHY register through the MDIO interface. + * @param DevAddr: PHY port address + * @param RegAddr: PHY register address + * @param pRegVal: pointer to hold the register value + * @retval 0 if OK -1 if Error + */ int32_t ETH_PHY_IO_ReadReg(uint32_t DevAddr, uint32_t RegAddr, uint32_t *pRegVal) { - if (HAL_ETH_ReadPHYRegister(&heth, DevAddr, RegAddr, pRegVal) != HAL_OK) + if(HAL_ETH_ReadPHYRegister(&heth, DevAddr, RegAddr, pRegVal) != HAL_OK) { return -1; } @@ -701,15 +703,15 @@ int32_t ETH_PHY_IO_ReadReg(uint32_t DevAddr, uint32_t RegAddr, uint32_t *pRegVal } /** - * @brief Write a value to a PHY register through the MDIO interface. - * @param DevAddr: PHY port address - * @param RegAddr: PHY register address - * @param RegVal: Value to be written - * @retval 0 if OK -1 if Error - */ + * @brief Write a value to a PHY register through the MDIO interface. + * @param DevAddr: PHY port address + * @param RegAddr: PHY register address + * @param RegVal: Value to be written + * @retval 0 if OK -1 if Error + */ int32_t ETH_PHY_IO_WriteReg(uint32_t DevAddr, uint32_t RegAddr, uint32_t RegVal) { - if (HAL_ETH_WritePHYRegister(&heth, DevAddr, RegAddr, RegVal) != HAL_OK) + if(HAL_ETH_WritePHYRegister(&heth, DevAddr, RegAddr, RegVal) != HAL_OK) { return -1; } @@ -718,84 +720,84 @@ int32_t ETH_PHY_IO_WriteReg(uint32_t DevAddr, uint32_t RegAddr, uint32_t RegVal) } /** - * @brief Get the time in millisecons used for internal PHY driver process. - * @retval Time value - */ + * @brief Get the time in millisecons used for internal PHY driver process. + * @retval Time value + */ int32_t ETH_PHY_IO_GetTick(void) { return HAL_GetTick(); } /** - * @brief Check the ETH link state then update ETH driver and netif link accordingly. - * @retval None - */ + * @brief Check the ETH link state then update ETH driver and netif link accordingly. + * @retval None + */ -void ethernet_link_thread(void const *argument) +void ethernet_link_thread(void const * argument) { ETH_MACConfigTypeDef MACConf = {0}; int32_t PHYLinkState = 0; uint32_t linkchanged = 0U, speed = 0U, duplex = 0U; - struct netif *netif = (struct netif *)argument; - /* USER CODE BEGIN ETH link init */ + struct netif *netif = (struct netif *) argument; +/* USER CODE BEGIN ETH link init */ - /* USER CODE END ETH link init */ +/* USER CODE END ETH link init */ - for (;;) + for(;;) { - PHYLinkState = LAN8742_GetLinkState(&LAN8742); + PHYLinkState = LAN8742_GetLinkState(&LAN8742); - if (netif_is_link_up(netif) && (PHYLinkState <= LAN8742_STATUS_LINK_DOWN)) + if(netif_is_link_up(netif) && (PHYLinkState <= LAN8742_STATUS_LINK_DOWN)) + { + HAL_ETH_Stop_IT(&heth); + netif_set_down(netif); + netif_set_link_down(netif); + } + else if(!netif_is_link_up(netif) && (PHYLinkState > LAN8742_STATUS_LINK_DOWN)) + { + switch (PHYLinkState) { - HAL_ETH_Stop_IT(&heth); - netif_set_down(netif); - netif_set_link_down(netif); - } - else if (!netif_is_link_up(netif) && (PHYLinkState > LAN8742_STATUS_LINK_DOWN)) - { - switch (PHYLinkState) - { - case LAN8742_STATUS_100MBITS_FULLDUPLEX: - duplex = ETH_FULLDUPLEX_MODE; - speed = ETH_SPEED_100M; - linkchanged = 1; - break; - case LAN8742_STATUS_100MBITS_HALFDUPLEX: - duplex = ETH_HALFDUPLEX_MODE; - speed = ETH_SPEED_100M; - linkchanged = 1; - break; - case LAN8742_STATUS_10MBITS_FULLDUPLEX: - duplex = ETH_FULLDUPLEX_MODE; - speed = ETH_SPEED_10M; - linkchanged = 1; - break; - case LAN8742_STATUS_10MBITS_HALFDUPLEX: - duplex = ETH_HALFDUPLEX_MODE; - speed = ETH_SPEED_10M; - linkchanged = 1; - break; - default: - break; - } - - if (linkchanged) - { - /* Get MAC Config MAC */ - HAL_ETH_GetMACConfig(&heth, &MACConf); - MACConf.DuplexMode = duplex; - MACConf.Speed = speed; - HAL_ETH_SetMACConfig(&heth, &MACConf); - HAL_ETH_Start_IT(&heth); - netif_set_up(netif); - netif_set_link_up(netif); - } + case LAN8742_STATUS_100MBITS_FULLDUPLEX: + duplex = ETH_FULLDUPLEX_MODE; + speed = ETH_SPEED_100M; + linkchanged = 1; + break; + case LAN8742_STATUS_100MBITS_HALFDUPLEX: + duplex = ETH_HALFDUPLEX_MODE; + speed = ETH_SPEED_100M; + linkchanged = 1; + break; + case LAN8742_STATUS_10MBITS_FULLDUPLEX: + duplex = ETH_FULLDUPLEX_MODE; + speed = ETH_SPEED_10M; + linkchanged = 1; + break; + case LAN8742_STATUS_10MBITS_HALFDUPLEX: + duplex = ETH_HALFDUPLEX_MODE; + speed = ETH_SPEED_10M; + linkchanged = 1; + break; + default: + break; } - /* USER CODE BEGIN ETH link Thread core code for User BSP */ + if(linkchanged) + { + /* Get MAC Config MAC */ + HAL_ETH_GetMACConfig(&heth, &MACConf); + MACConf.DuplexMode = duplex; + MACConf.Speed = speed; + HAL_ETH_SetMACConfig(&heth, &MACConf); + HAL_ETH_Start_IT(&heth); + netif_set_up(netif); + netif_set_link_up(netif); + } + } - /* USER CODE END ETH link Thread core code for User BSP */ +/* USER CODE BEGIN ETH link Thread core code for User BSP */ + +/* USER CODE END ETH link Thread core code for User BSP */ osDelay(100); } @@ -803,7 +805,7 @@ void ethernet_link_thread(void const *argument) void HAL_ETH_RxAllocateCallback(uint8_t **buff) { - /* USER CODE BEGIN HAL ETH RxAllocateCallback */ +/* USER CODE BEGIN HAL ETH RxAllocateCallback */ struct pbuf_custom *p = LWIP_MEMPOOL_ALLOC(RX_POOL); if (p) { @@ -820,12 +822,12 @@ void HAL_ETH_RxAllocateCallback(uint8_t **buff) RxAllocStatus = RX_ALLOC_ERROR; *buff = NULL; } - /* USER CODE END HAL ETH RxAllocateCallback */ +/* USER CODE END HAL ETH RxAllocateCallback */ } void HAL_ETH_RxLinkCallback(void **pStart, void **pEnd, uint8_t *buff, uint16_t Length) { - /* USER CODE BEGIN HAL ETH RxLinkCallback */ +/* USER CODE BEGIN HAL ETH RxLinkCallback */ struct pbuf **ppStart = (struct pbuf **)pStart; struct pbuf **ppEnd = (struct pbuf **)pEnd; @@ -857,18 +859,19 @@ void HAL_ETH_RxLinkCallback(void **pStart, void **pEnd, uint8_t *buff, uint16_t p->tot_len += Length; } - /* USER CODE END HAL ETH RxLinkCallback */ +/* USER CODE END HAL ETH RxLinkCallback */ } -void HAL_ETH_TxFreeCallback(uint32_t *buff) +void HAL_ETH_TxFreeCallback(uint32_t * buff) { - /* USER CODE BEGIN HAL ETH TxFreeCallback */ +/* USER CODE BEGIN HAL ETH TxFreeCallback */ pbuf_free((struct pbuf *)buff); - /* USER CODE END HAL ETH TxFreeCallback */ +/* USER CODE END HAL ETH TxFreeCallback */ } /* USER CODE BEGIN 8 */ /* USER CODE END 8 */ + diff --git a/User/application/inc/tcpserverc.h b/User/application/inc/tcpserverc.h index 25f4725..b3e7eb9 100644 --- a/User/application/inc/tcpserverc.h +++ b/User/application/inc/tcpserverc.h @@ -1,3 +1,11 @@ +/* + * @Author: wangxujie 390834610@qq.com + * @Date: 2025-02-19 08:33:14 + * @LastEditors: wangxujie 390834610@qq.com + * @LastEditTime: 2025-04-18 13:36:18 + * @FilePath: \Semi-finished product testing\User\application\inc\tcpserverc.h + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ #ifndef _TCPECHO_H_ #define _TCPECHO_H_ diff --git a/User/application/src/tcpserverc.c b/User/application/src/tcpserverc.c index 9c0efad..6cfcee9 100644 --- a/User/application/src/tcpserverc.c +++ b/User/application/src/tcpserverc.c @@ -370,7 +370,6 @@ void user_send_data_ble2(uint8_t *data, uint16_t len) void user_send_data_control(uint8_t *data, uint16_t len) { - tcp_write(server_pcb_control, data, len, 1); } diff --git a/development_environment.md b/development_environment.md new file mode 100644 index 0000000..adf0795 --- /dev/null +++ b/development_environment.md @@ -0,0 +1,70 @@ +# 开发环境说明 + +## 1. 硬件平台 +- 主控芯片:STM32F407xx系列(ARM Cortex-M4F内核) +- 外设芯片: + - ADC:AD7124-8(高精度模拟量输入) + - DAC:DAC161S997(高精度模拟量输出) + - 以太网:LAN8742(网络通信) + - LCD:串口显示屏 + - 编码器接口 + +## 2. 开发工具 +### 主要IDE +- Keil MDK-ARM (MDK-ARM目录存在) + - 项目文件:semi-finished_product_testing.uvprojx + - 编译配置:semi-finished_product_testing.uvoptx +- Visual Studio Code (存在.vscode配置目录) + - 用于代码编辑和查看 + +### 编译工具 +- ARMCC编译器 (ARM编译工具链) +- 启动文件:startup_stm32f407xx.s + +## 3. 软件框架 +### 操作系统 +- FreeRTOS实时操作系统 + - 版本:位于Middlewares/Third_Party/FreeRTOS/Source/ + - 配置文件:FreeRTOSConfig.h + +### 驱动库 +- STM32 HAL库 (Hardware Abstraction Layer) + - 位置:Drivers/STM32F4xx_HAL_Driver/ + - 包含各种外设驱动 + +### 网络协议栈 +- LwIP (Lightweight IP) + - 位置:Middlewares/Third_Party/LwIP/ + - 支持TCP/IP协议 + - MQTT支持 + +### BSP支持 +- LAN8742网络驱动 + - 位置:Drivers/BSP/Components/lan8742/ + +## 4. 项目结构 +``` +项目主要目录: +├── Core/ # 核心应用代码 +├── Drivers/ # 驱动程序 +├── LWIP/ # 网络协议栈 +├── MDK-ARM/ # Keil工程文件 +└── Middlewares/ # 中间件(FreeRTOS/LwIP) +``` + +## 5. 开发规范 +- 基于HAL库的驱动开发 +- FreeRTOS多任务架构 +- 模块化的设计结构 +- 标准C语言开发规范 + +## 6. 调试方式 +- ST-Link/J-Link调试器支持 +- 串口调试 +- 以太网远程调试 + +## 7. 项目文档 +位于Documents/目录: +- 数据手册 (datasheet/) +- 项目文档 (project documents/) +- 原理图 (schematic diagram/) \ No newline at end of file diff --git a/semi-finished_product_testing.ioc b/semi-finished_product_testing.ioc index 38066d7..d61edac 100644 --- a/semi-finished_product_testing.ioc +++ b/semi-finished_product_testing.ioc @@ -117,7 +117,7 @@ ETH.IPParameters=MediaInterface ETH.MediaInterface=HAL_ETH_RMII_MODE FREERTOS.FootprintOK=true FREERTOS.IPParameters=Tasks01,configMAX_TASK_NAME_LEN,configENABLE_FPU,configMAX_PRIORITIES,FootprintOK -FREERTOS.Tasks01=lwip_task,2,512,start_tcp_task,Default,NULL,Dynamic,NULL,NULL;led_task,-2,128,start_led_toggle_task,Default,NULL,Dynamic,NULL,NULL;dac_task,0,512,start_dac_task,Default,NULL,Dynamic,NULL,NULL;adc_task,-1,128,start_adc_task,Default,NULL,Dynamic,NULL,NULL;gpio_di_do_task,0,128,start_gpio_di_do_task,Default,NULL,Dynamic,NULL,NULL;ec11_task,0,512,start_ec11_task,Default,NULL,Dynamic,NULL,NULL +FREERTOS.Tasks01=lwip_task,2,512,start_tcp_task,Default,NULL,Dynamic,NULL,NULL;led_task,-2,128,start_led_toggle_task,Default,NULL,Dynamic,NULL,NULL;dac_task,0,512,start_dac_task,Default,NULL,Dynamic,NULL,NULL;adc_task,-1,128,start_adc_task,Default,NULL,Dynamic,NULL,NULL;gpio_di_do_task,0,128,start_gpio_di_do_task,Default,NULL,Dynamic,NULL,NULL;ec11_task,0,512,start_ec11_task,Default,NULL,Dynamic,NULL,NULL;uart_forwarding,3,512,start_uart_forwarding,Default,NULL,Dynamic,NULL,NULL FREERTOS.configENABLE_FPU=1 FREERTOS.configMAX_PRIORITIES=32 FREERTOS.configMAX_TASK_NAME_LEN=24 diff --git a/simple_flow_chart.md b/simple_flow_chart.md new file mode 100644 index 0000000..6d2c972 --- /dev/null +++ b/simple_flow_chart.md @@ -0,0 +1,55 @@ +```mermaid +graph TB + %% 主要流程 + Start[系统启动] --> Init[系统初始化] + Init --> Tasks[任务创建] + + %% 主要任务分支 + Tasks --> Network[网络通信] + Tasks --> DataAcq[数据采集] + Tasks --> DataOut[数据输出] + Tasks --> UserInterface[人机交互] + + %% 网络通信详细 + Network --> |TCP/IP|RemoteControl[远程控制] + RemoteControl --> |命令|CommandProcess[命令处理] + RemoteControl --> |数据|DataUpload[数据上传] + + %% 数据采集详细 + DataAcq --> |ADC|AnalogIn[模拟量输入] + DataAcq --> |GPIO|DigitalIn[数字量输入] + AnalogIn --> DataProcess[数据处理] + DigitalIn --> DataProcess + + %% 数据输出详细 + DataOut --> |DAC|AnalogOut[模拟量输出] + DataOut --> |GPIO|DigitalOut[数字量输出] + CommandProcess --> DataOut + + %% 人机交互详细 + UserInterface --> |LCD|Display[状态显示] + UserInterface --> |编码器|LocalControl[本地控制] + LocalControl --> DataOut + DataProcess --> Display + + %% 通信协议 + subgraph 通信协议 + HART[HART协议] + BLE[蓝牙通信] + TCP[TCP/IP] + end + + %% 硬件接口 + subgraph 硬件接口 + ADC[AD7124] + DAC[DAC161S997] + DIO[数字IO] + LCD[串口LCD] + ETH[以太网] + Encoder[编码器] + end + + %% 数据流向 + DataProcess --> |测量数据|DataUpload + CommandProcess --> |控制命令|DataOut +``` \ No newline at end of file