GD32F450使用

GD32450i-EVAL学习笔记(系列)
网卡驱动参考

1. 概述

2. 固件库

gpio_af_set();				//pin复用模式
gpio_mode_set();			//IO模式:输入输出、上下拉
gpio_output_options_set();	//推拉、速率

3. 工程配置

3.1 选择型号

gd32f4xx.h中要选择对应型号的定义:GD32F450

/* define GD32F4xx */
#if !defined (GD32F450)  && !defined (GD32F405) && !defined (GD32F407)
  /* #define GD32F450 */
   #define GD32F450 
  /* #define GD32F405 */
  /* #define GD32F407 */
#endif /* define GD32F4xx */

3.2 网络

lwip的mac地址和芯片mac寄存器中的mac地址要一致。

(1)lwip的mac地址在drv_enet.c中的rt_hw_gd32_eth_init(void)函数中定义:

// OUI 00-00-0E FUJITSU LIMITED
    gd32_emac_device0.dev_addr[0] = 0x00;                   //mac地址
    gd32_emac_device0.dev_addr[1] = 0x00;
    gd32_emac_device0.dev_addr[2] = 0x0E;
    /* set mac address: (only for test) */
    gd32_emac_device0.dev_addr[3] = 0x12;
    gd32_emac_device0.dev_addr[4] = 0x34;
    gd32_emac_device0.dev_addr[5] = 0x56;

(2)程序寄存器的mac地址:
drv_enet.c中的rt_hw_gd32_eth_init(void)函数中调用EMAC_MAC_Addr_config():

//drv_enet.c
rt_hw_gd32_eth_init(void)
	 EMAC_MAC_Addr_config(ETHERNET_MAC, EMAC_MAC_Address0, (uint8_t*)&gd32_emac_device->dev_addr[0]);
//synopsys_emac.c
void EMAC_MAC_Addr_config(struct rt_synopsys_eth * ETHERNET_MAC, rt_uint32_t MacAddr, rt_uint8_t *Addr)

3.3 lwip

3.3.0 设置固定IP

注意要把lwip的DCHP功能去掉,并把网关的初始值也去掉。分别去掉“Disable alloc ip address through DCHP”、“Static IPv4 Address”中设置。

3.3.1 移植修改

配置rt-thread中的lwip模块

//gd32f4xx_enet.h中
#if(PHY_TYPE == LAN8700) 
    #define PHY_SR                           31U                                    /*!< tranceiver status register */
    #define PHY_SPEED_STATUS                 ((uint16_t)0x0004)                     /*!< configured information of speed: 10Mbit/s */
    #define PHY_DUPLEX_STATUS                ((uint16_t)0x0010)                     /*!< configured information of duplex: full-duplex */
#elif(PHY_TYPE == DP83848)
    #define PHY_SR                           16U                                    /*!< tranceiver status register */
    #define PHY_SPEED_STATUS                 ((uint16_t)0x0002)                     /*!< configured information of speed: 10Mbit/s */
    #define PHY_DUPLEX_STATUS                ((uint16_t)0x0004)                     /*!< configured information of duplex: full-duplex */
#elif(PHY_TYPE == YT8512)
    #define PHY_SR                           17U                                    /*!< tranceiver status register */
    #define PHY_SPEED_STATUS                 ((uint16_t)0x4000)                     /*!< configured information of speed: 10Mbit/s */
    #define PHY_DUPLEX_STATUS                ((uint16_t)0x2000)                     /*!< configured information of duplex: full-duplex */
#endif /* PHY_TYPE */
//gd32f4xx_enet.c中的
ErrStatus enet_init(enet_mediamode_enum mediamode, enet_chksumconf_enum checksum, enet_frmrecept_enum recept)
	if((uint16_t)RESET != (phy_value & PHY_DUPLEX_STATUS)){
            media_temp = ENET_MODE_FULLDUPLEX;
        }else{
            media_temp = ENET_MODE_HALFDUPLEX;
        }
        /* configure the communication speed of MAC following the auto-negotiation result */ 
        if((uint16_t)RESET !=(phy_value & PHY_SPEED_STATUS)){               //设置速率---
            media_temp |= ENET_SPEEDMODE_100M;                              //为1时
        }else{
            media_temp |= ENET_SPEEDMODE_10M;
        } 

3.3.2 启动流程

  • 1、lwip初始化在:int lwip_system_init(void)
  • 2、使用lwip注册设备:
int rt_hw_gd32_eth_init(void)
{
    rt_kprintf("rt_gd32_eth_init...\n");
    
    /* enable ethernet clock  */
    rcu_periph_clock_enable(RCU_ENET);
    rcu_periph_clock_enable(RCU_ENETTX);
    rcu_periph_clock_enable(RCU_ENETRX);
    
    nvic_configuration();                                   //中断配置
  
    /* configure the GPIO ports for ethernet pins */
    enet_gpio_config();                                     //管脚配置
    
    /* set autonegotiation mode */
    gd32_emac_device0.phy_mode = EMAC_PHY_AUTO;
    gd32_emac_device0.ETHERNET_MAC = ETHERNET_MAC0;         //寄存器地址
    gd32_emac_device0.ETHER_MAC_IRQ  = ENET_IRQn;

    // OUI 00-00-0E FUJITSU LIMITED
    gd32_emac_device0.dev_addr[0] = 0x00;                   //mac地址
    gd32_emac_device0.dev_addr[1] = 0x00;
    gd32_emac_device0.dev_addr[2] = 0x0E;
    /* set mac address: (only for test) */
    gd32_emac_device0.dev_addr[3] = 0x12;
    gd32_emac_device0.dev_addr[4] = 0x34;
    gd32_emac_device0.dev_addr[5] = 0x56;

    gd32_emac_device0.parent.parent.init		= gd32_emac_init;       //mac初始化
    gd32_emac_device0.parent.parent.open		= gd32_emac_open;
    gd32_emac_device0.parent.parent.close	    = gd32_emac_close;
    gd32_emac_device0.parent.parent.read		= gd32_emac_read;
    gd32_emac_device0.parent.parent.write	    = gd32_emac_write;
    gd32_emac_device0.parent.parent.control	    = gd32_emac_control;
    gd32_emac_device0.parent.parent.user_data   = RT_NULL;

    gd32_emac_device0.parent.eth_rx			    = gd32_emac_rx;
    gd32_emac_device0.parent.eth_tx			    = gd32_emac_tx;

    /* init tx buffer free semaphore */
    rt_sem_init(&gd32_emac_device0.tx_buf_free, "tx_buf0", EMAC_TXBUFNB, RT_IPC_FLAG_FIFO);
    eth_device_init(&(gd32_emac_device0.parent), "e0");                                         //lwip向系统注册网卡e0-----
    
    /* change device link status */
    eth_device_linkchange(&(gd32_emac_device0.parent), RT_TRUE);
    
    return 0;
}
INIT_DEVICE_EXPORT(rt_hw_gd32_eth_init);

管脚配置要根据板子实际来初始化:

  • 3、netif_set_status_callback()函数可以注册NETIF_STATUS_CALLBACK回调函数,有3个地方调用:
    netif_set_up、netif_set_down、netif_set_ipaddr
### 回答1: gd32f450是一款32位微控制器,J-Flash则是一款用于烧写固件的工具。当使用J-Flash下载固件到gd32f450时,可能会遇到一些错误。 要解决报错问题,我们可以尝试以下步骤: 1. 首先,确保我们使用的J-Flash版本与gd32f450兼容。可以参考J-Flash官方文档或咨询技术支持,以确认所使用版本的兼容性。 2. 检查连接错误。确保gd32f450与计算机之间的连接正确,检查USB或JTAG连接线是否牢固连接。也可以尝试更换连接线,以排除连接问题。 3. 检查目标设备设置。进入J-Flash工具的设备选项,选择gd32f450作为目标设备,并确保选项设置正确,如芯片型号、时钟配置等。 4. 验证目标设备的电源供应。确保gd32f450的电源供应正常,电压稳定。过低或不稳定的电压可能导致下载失败。 5. 检查固件文件。确保我们使用的固件文件是正确的,与gd32f450兼容,并没有损坏。可以尝试使用其他固件文件进行下载,以确定是否是固件文件本身的问题。 6. 若以上步骤无效,我们可以考虑更新J-Flash软件版本,或尝试使用其他烧写工具。有时,某些版本的J-Flash可能存在一些与特定芯片不兼容的问题,而其他烧写工具可能可以解决这些问题。 总之,当使用J-Flash下载固件到gd32f450时,出现报错可能是由于多种原因引起的。通过逐步排除以上可能的问题,我们可以解决这些报错,并成功下载固件到gd32f450。 ### 回答2: gd32f450是一款微控制器芯片,而J-Flash是一个用于下载程序的工具。当使用J-Flash下载程序到gd32f450时出现错误,可能有以下几个原因: 1. 硬件连接问题:首先,需要确保J-Flash与gd32f450芯片之间的硬件连接是正确的。检查连接线是否插紧且连接稳定,同时确保引脚连接正确。 2. 软件配置问题:在使用J-Flash时,需要正确配置相关参数,如目标设备类型、连接速度等。如果配置错误,可能导致下载错误。可以仔细检查J-Flash的配置是否与gd32f450匹配。 3. 芯片状态问题:有时,芯片状态可能会影响下载过程。如果芯片处于保护状态或者已被其他程序占用,可能会导致下载失败。此时,可以尝试将芯片复位或者重新上电,以确保芯片处于正常状态。 4. 软件版本兼容性问题:如果使用的J-Flash版本与gd32f450的芯片支持库版本不兼容,可能也会导致下载错误。在使用J-Flash时,建议使用最新版本,并确保与相关库文件匹配。 总之,当使用J-Flash下载程序到gd32f450时出现错误,我们可以从硬件连接、软件配置、芯片状态和软件版本兼容性等方面进行排查,以找出并解决问题。如果问题仍然存在,建议联系相关技术支持获取进一步的帮助。 ### 回答3: gd32f450是一款德信半导体(GigaDevice)生产的微控制器芯片。而jflash是Segger公司提供的一款用于微控制器下载和调试的工具。如果在使用jflash下载gd32f450时遇到报错,可能有以下几个原因: 1. 芯片连接问题:请确保正确连接芯片和下载器,检查是否有接触不良、线路接错等问题。 2. 芯片供电问题:确认芯片供电正常,检查电压是否稳定,电源是否可靠。 3. jflash配置问题:检查jflash的配置是否正确,例如芯片型号、连接方式、速度设置等。确保与芯片的规格和要求相匹配。 4. 芯片状态问题:有时候芯片进入了某种特殊状态,导致下载失败。可以尝试重新复位芯片或者重新上电来重置芯片状态,然后再进行下载尝试。 5. 下载器驱动问题:检查下载器的驱动是否安装正确,并确认与jflash兼容。可以尝试更新或重新安装下载器驱动。 如果以上解决方法都没有解决问题,建议查阅相关的官方文档、技术手册,或者向相关厂商技术支持寻求帮助。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值