/*! \file gd32h7xx_enet_eval.c \brief ethernet hardware configuration \version 2025-02-19, V2.1.0, demo for GD32H7xx */ /* Copyright (c) 2024, GigaDevice Semiconductor Inc. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "gd32h7xx_enet.h" #include "main.h" /** * PHY 复位 GPIO 阶段在调度器启动之前执行,禁止使用 vTaskDelay。 * 使用 DWT CYCCNT 忙等毫秒级延时(与 app/main.c 中 delay_ms 思路一致)。 */ static void enet_phy_gpio_reset_delay_ms(uint32_t ms) { uint32_t start; uint32_t ticks; CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; start = DWT->CYCCNT; ticks = (SystemCoreClock / 1000U) * ms; while ((DWT->CYCCNT - start) < ticks) { __NOP(); } } static __IO uint32_t enet_init_status = 0U; uint8_t enet_hw_is_ready(void) { return (enet_init_status != 0U) ? 1U : 0U; } static void enet_gpio_config(void); static void enet_mac_dma_config(void); static void enet_gpio_resetConfig(void); /*! \brief setup ethernet system(GPIOs, clocks, MAC, DMA, systick) \param[in] none \param[out] none \retval none */ void enet_system_setup(void) { enet_gpio_resetConfig(); //PHY复位 /* configure the GPIO ports for ethernet pins */ enet_gpio_config(); /* configure the ethernet MAC/DMA */ enet_mac_dma_config(); if (0U == enet_init_status) { /* 不自旋死锁:无网线/PHY 异常时仍应能进 FreeRTOS,运行灯可闪烁 */ return; } #ifdef USE_ENET0 enet_interrupt_enable(ENET0, ENET_DMA_INT_NIE); enet_interrupt_enable(ENET0, ENET_DMA_INT_RIE); #ifdef SELECT_DESCRIPTORS_ENHANCED_MODE enet_desc_select_enhanced_mode(ENET0); #endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ #endif /* USE_ENET0 */ #ifdef USE_ENET1 enet_interrupt_enable(ENET1, ENET_DMA_INT_NIE); enet_interrupt_enable(ENET1, ENET_DMA_INT_RIE); #ifdef SELECT_DESCRIPTORS_ENHANCED_MODE enet_desc_select_enhanced_mode(ENET1); #endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ #endif /* USE_ENET1 */ } /*! \brief configures the ethernet interface \param[in] none \param[out] none \retval none */ static void enet_mac_dma_config(void) { ErrStatus reval_state = ERROR; #ifdef USE_ENET0 /* enable ethernet clock */ rcu_periph_clock_enable(RCU_ENET0); rcu_periph_clock_enable(RCU_ENET0TX); rcu_periph_clock_enable(RCU_ENET0RX); /* reset ethernet on AHB bus */ enet_deinit(ENET0); reval_state = enet_software_reset(ENET0); if (ERROR == reval_state) { enet_init_status = 0U; return; } #ifdef CHECKSUM_BY_HARDWARE enet_init_status = enet_init(ENET0, ENET_AUTO_NEGOTIATION, ENET_AUTOCHECKSUM_DROP_FAILFRAMES, ENET_BROADCAST_FRAMES_PASS); #else enet_init_status = enet_init(ENET0, ENET_AUTO_NEGOTIATION, ENET_NO_AUTOCHECKSUM, ENET_BROADCAST_FRAMES_PASS); #endif /* CHECKSUM_BY_HARDWARE */ #endif /* USE_ENET0 */ #ifdef USE_ENET1 /* enable ethernet clock */ rcu_periph_clock_enable(RCU_ENET1); rcu_periph_clock_enable(RCU_ENET1TX); rcu_periph_clock_enable(RCU_ENET1RX); /* reset ethernet on AHB bus */ enet_deinit(ENET1); reval_state = enet_software_reset(ENET1); if (ERROR == reval_state) { enet_init_status = 0U; return; } #ifdef CHECKSUM_BY_HARDWARE enet_init_status = enet_init(ENET1, ENET_AUTO_NEGOTIATION, ENET_AUTOCHECKSUM_DROP_FAILFRAMES, ENET_BROADCAST_FRAMES_PASS); #else enet_init_status = enet_init(ENET1, ENET_AUTO_NEGOTIATION, ENET_NO_AUTOCHECKSUM, ENET_BROADCAST_FRAMES_PASS); #endif /* CHECKSUM_BY_HARDWARE */ #endif /* USE_ENET1 */ } /*! \brief configures the different GPIO ports \param[in] none \param[out] none \retval none */ static void enet_gpio_config(void) { rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOB); rcu_periph_clock_enable(RCU_GPIOC); // rcu_periph_clock_enable(RCU_GPIOD); // rcu_periph_clock_enable(RCU_GPIOE); // rcu_periph_clock_enable(RCU_GPIOG); // rcu_periph_clock_enable(RCU_GPIOH); // gpio_af_set(GPIOA, GPIO_AF_0, GPIO_PIN_8); // gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8); // gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_8); /* enable SYSCFG clock */ rcu_periph_clock_enable(RCU_SYSCFG); #ifdef MII_MODE #ifdef PHY_CLOCK_MCO /* output HXTAL clock (25MHz) on CKOUT0 pin(PA8) to clock the PHY */ rcu_ckout0_config(RCU_CKOUT0SRC_HXTAL, RCU_CKOUT0_DIV1); #endif /* PHY_CLOCK_MCO */ #ifdef USE_ENET0 syscfg_enet_phy_interface_config(ENET0, SYSCFG_ENET_PHY_MII); #endif /* USE_ENET0 */ #ifdef USE_ENET1 syscfg_enet_phy_interface_config(ENET1, SYSCFG_ENET_PHY_MII); #endif /* USE_ENET1 */ #elif defined RMII_MODE /* choose DIV12 to get 50MHz from 600MHz on CKOUT0 pin (PA8) to clock the PHY */ // rcu_ckout0_config(RCU_CKOUT0SRC_PLL0P, RCU_CKOUT0_DIV12); #ifdef USE_ENET0 syscfg_enet_phy_interface_config(ENET0, SYSCFG_ENET_PHY_RMII); #endif /* USE_ENET0 */ #ifdef USE_ENET1 syscfg_enet_phy_interface_config(ENET1, SYSCFG_ENET_PHY_RMII); #endif /* USE_ENET1 */ #endif /* MII_MODE */ #ifdef USE_ENET0 #ifdef MII_MODE /* PA1: ETH0_MII_RX_CLK */ gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_1); /* PA2: ETH0_MDIO */ gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_2); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_2); /* PA7: ETH0_MII_RX_DV */ gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_7); gpio_af_set(GPIOA, GPIO_AF_11, GPIO_PIN_1); gpio_af_set(GPIOA, GPIO_AF_11, GPIO_PIN_2); gpio_af_set(GPIOA, GPIO_AF_11, GPIO_PIN_7); /* PB8: ETH0_MII_TXD3 */ gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_8); /* PB10: ETH0_MII_RX_ER */ gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_10); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_10); gpio_af_set(GPIOB, GPIO_AF_11, GPIO_PIN_8); gpio_af_set(GPIOB, GPIO_AF_11, GPIO_PIN_10); /* PC1: ETH0_MDC */ gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1); gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_1); /* PC2: ETH0_MII_TXD2 */ gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_2); gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_2); /* PC3: ETH0_MII_TX_CLK */ gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_3); gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_3); /* PC4: ETH0_MII_RXD0 */ gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_4); gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_4); /* PC5: ETH0_MII_RXD1 */ gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5); gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_5); gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_1); gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_2); gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_3); gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_4); gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_5); /* PH2: ETH0_MII_CRS */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_2); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_2); /* PH3: ETH0_MII_COL */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_3); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_3); /* PH6: ETH0_MII_RXD2 */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_6); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_6); /* PH7: ETH0_MII_RXD3 */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_7); gpio_af_set(GPIOH, GPIO_AF_11, GPIO_PIN_2); gpio_af_set(GPIOH, GPIO_AF_11, GPIO_PIN_3); gpio_af_set(GPIOH, GPIO_AF_11, GPIO_PIN_6); gpio_af_set(GPIOH, GPIO_AF_11, GPIO_PIN_7); /* PG11: ETH0_MII_TX_EN */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_11); /* PG13: ETH0_MII_TXD0 */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_13); /* PG14: ETH0_MII_TXD1 */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_14); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_14); gpio_af_set(GPIOG, GPIO_AF_11, GPIO_PIN_11); gpio_af_set(GPIOG, GPIO_AF_11, GPIO_PIN_13); gpio_af_set(GPIOG, GPIO_AF_11, GPIO_PIN_14); /* PD8: ETH0_INT */ gpio_mode_set(GPIOD, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_8); #elif defined RMII_MODE /* PC1: ETH0_MDC */ gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_1); gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1); gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_1); /* PA2: ETH0_MDIO */ gpio_af_set(GPIOA, GPIO_AF_11, GPIO_PIN_2); gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_2); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_2); /* PB12: ETH0_RMII_TXD0 */ gpio_af_set(GPIOB, GPIO_AF_11, GPIO_PIN_12); gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_12); /* PB13: ETH0_RMII_TXD1 */ gpio_af_set(GPIOB, GPIO_AF_11, GPIO_PIN_13); gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_13); /* PB11: ETH0_RMII_TX_EN */ gpio_af_set(GPIOB, GPIO_AF_11, GPIO_PIN_11); gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_11); /* PC4: ETH0_RMII_RXD0 */ gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_4); gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_4); gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_4); /* PC5: ETH0_RMII_RXD1 */ gpio_af_set(GPIOC, GPIO_AF_11, GPIO_PIN_5); gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5); gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_5); /* PA7: ETH0_RMII_CRS_DV */ gpio_af_set(GPIOA, GPIO_AF_11, GPIO_PIN_7); gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_7); /* PA1: ETH0_RMII_REF_CLK */ gpio_af_set(GPIOA, GPIO_AF_11, GPIO_PIN_1); gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_1); #endif /* MII_MODE */ #endif /* USE_ENET0 */ #ifdef USE_ENET1 #ifdef MII_MODE /* PH6: ETH1_MII_RXD2 */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_6); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_6); /* PH7: ETH1_MII_RXD3 */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_7); /* PH8: ETH1_MII_RXD0 */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_8); /* PH9: ETH1_MII_RXD1 */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_9); /* PH10: ETH1_MII_RX_ER */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_10); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_10); /* PH11: ETH1_MII_RX_DV */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_11); /* PH12: ETH1_MII_RX_CLK */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_12); /* PH13: ETH1_MII_COL */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_13); /* PH14: ETH1_MDIO */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_14); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_14); /* PH15: ETH1_MII_CRS */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_15); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_15); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_6); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_7); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_8); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_9); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_10); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_11); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_12); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_13); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_14); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_15); /* PG6: ETH1_MDC */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_6); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_6); /* PG9: ETH1_MII_TX_CLK */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_9); /* PG11: ETH1_MII_TX_EN */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_11); /* PG12: ETH1_MII_TXD2 */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_12); /* PG13: ETH1_MII_TXD0 */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_13); /* PG14: ETH1_MII_TXD1 */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_14); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_14); /* PG15: ETH1_MII_TXD3 */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_15); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_15); gpio_af_set(GPIOG, GPIO_AF_6, GPIO_PIN_6); gpio_af_set(GPIOG, GPIO_AF_6, GPIO_PIN_9); gpio_af_set(GPIOG, GPIO_AF_6, GPIO_PIN_11); gpio_af_set(GPIOG, GPIO_AF_6, GPIO_PIN_12); gpio_af_set(GPIOG, GPIO_AF_6, GPIO_PIN_13); gpio_af_set(GPIOG, GPIO_AF_6, GPIO_PIN_14); gpio_af_set(GPIOG, GPIO_AF_6, GPIO_PIN_15); /* PE1: ETH1_INT */ gpio_mode_set(GPIOE, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_1); #elif defined RMII_MODE /* PH8: ETH1_RMII_RXD0 */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_8); /* PH9: ETH1_RMII_RXD1 */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_9); /* PH11: ETH1_RMII_CRS_DV */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_11); /* PH12: ETH1_RMII_REF_CLK */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_12); /* PH14: ETH1_MDIO */ gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_14); gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_14); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_8); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_9); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_11); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_12); gpio_af_set(GPIOH, GPIO_AF_6, GPIO_PIN_14); /* PG6: ETH1_MDC */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_6); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_6); /* PG11: ETH1_RMII_TX_EN */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_11); /* PG13: ETH1_RMII_TXD0 */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_13); /* PG14: ETH1_RMII_TXD1 */ gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_14); gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_14); gpio_af_set(GPIOG, GPIO_AF_6, GPIO_PIN_6); gpio_af_set(GPIOG, GPIO_AF_6, GPIO_PIN_11); gpio_af_set(GPIOG, GPIO_AF_6, GPIO_PIN_13); gpio_af_set(GPIOG, GPIO_AF_6, GPIO_PIN_14); #endif /* MII_MODE */ #endif /* USE_ENET1 */ } static void enet_gpio_resetConfig(void) //PHY复位引脚:PA0 { rcu_periph_clock_enable(RCU_GPIOA); gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0); gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_0); gpio_bit_set(GPIOA, GPIO_PIN_0); enet_phy_gpio_reset_delay_ms(10U); gpio_bit_reset(GPIOA, GPIO_PIN_0); /* 复位 PHY */ enet_phy_gpio_reset_delay_ms(30U); gpio_bit_set(GPIOA, GPIO_PIN_0); /* 复位后勿立刻配置 MAC,至少 250ms(调度器未起,不可用 vTaskDelay) */ enet_phy_gpio_reset_delay_ms(250U); }