移植GD32F450i USB CDC至GD32F407

移植成功后的代码链接:https://download.csdn.net/download/yellowmid2013/12095128

记录移植步骤:

1.网上下载了这么个东东(适用于F450i 的CDC程序):,解压进入目录GD32F4xx_Firmware_Library_V1.4\GD32F4xx_Firmware_Library_V1.4\Project\USB\GD32F450i\USB_Device\CDC_ACM\MDK-ARM;

2.关键修改的地方如下:

a.我用的是keil5.26版本,所以要改成,然后编译之类的问题自行解决,略过。

b.如果硬件用GPIO PA11,PA12来做USB device的D+ D- (用全速IP核),此处只需要把GD32F450修改成GD32F407,如下图然后跳到第3步;

如果硬件用GPIO PB14, PB15来做USB device的D+ D- (高速IP核来当全速使),此处修改成USE_USBHS,GD32F407,USE_EMBEDDED_PHY,如下图所示

 

app.c 函数 usb_gpio_config添加gpio 初始化, 如下红色部分所示:

代码改成如下:

void usb_gpio_config(void)
{
    rcu_periph_clock_enable(RCU_SYSCFG);

#ifdef USE_USBFS

    rcu_periph_clock_enable(RCU_GPIOA);

    /* USBFS_DM(PA11) and USBFS_DP(PA12) GPIO pin configuration */
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11 | GPIO_PIN_12);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_200MHZ, GPIO_PIN_11 | GPIO_PIN_12);

    gpio_af_set(GPIOA, GPIO_AF_10, GPIO_PIN_11 | GPIO_PIN_12);

#elif defined(USE_USBHS)

    #ifdef USE_ULPI_PHY
        rcu_periph_clock_enable(RCU_GPIOA);
        rcu_periph_clock_enable(RCU_GPIOB);
        rcu_periph_clock_enable(RCU_GPIOC);
        rcu_periph_clock_enable(RCU_GPIOH);
        rcu_periph_clock_enable(RCU_GPIOI);

        /* ULPI_STP(PC0) GPIO pin configuration */
        gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_0);
        gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_200MHZ, GPIO_PIN_0);

        /* ULPI_CK(PA5) GPIO pin configuration */
        gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5);
        gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_200MHZ, GPIO_PIN_5);

        /* ULPI_NXT(PH4) GPIO pin configuration */
        gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_4);
        gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_200MHZ, GPIO_PIN_4);

        /* ULPI_DIR(PI11) GPIO pin configuration */
        gpio_mode_set(GPIOI, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11);
        gpio_output_options_set(GPIOI, GPIO_OTYPE_PP, GPIO_OSPEED_200MHZ, GPIO_PIN_11);

        /* ULPI_D1(PB0), ULPI_D2(PB1), ULPI_D3(PB10), ULPI_D4(PB11) \
           ULPI_D5(PB12), ULPI_D6(PB13) and ULPI_D7(PB5) GPIO pin configuration */
        gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, \
                        GPIO_PIN_5 | GPIO_PIN_13 | GPIO_PIN_12 |\
                        GPIO_PIN_11 | GPIO_PIN_10 | GPIO_PIN_1 | GPIO_PIN_0);
        gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_200MHZ, \
                        GPIO_PIN_5 | GPIO_PIN_13 | GPIO_PIN_12 |\
                        GPIO_PIN_11 | GPIO_PIN_10 | GPIO_PIN_1 | GPIO_PIN_0);

        /* ULPI_D0(PA3) GPIO pin configuration */
        gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_3);
        gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_200MHZ, GPIO_PIN_3);

        gpio_af_set(GPIOC, GPIO_AF_10, GPIO_PIN_0);
        gpio_af_set(GPIOH, GPIO_AF_10, GPIO_PIN_4);
        gpio_af_set(GPIOI, GPIO_AF_10, GPIO_PIN_11);
        gpio_af_set(GPIOA, GPIO_AF_10, GPIO_PIN_5 | GPIO_PIN_3);
        gpio_af_set(GPIOB, GPIO_AF_10, GPIO_PIN_5 | GPIO_PIN_13 | GPIO_PIN_12 |\
                                       GPIO_PIN_11 | GPIO_PIN_10 | GPIO_PIN_1 | GPIO_PIN_0);
        #else
        
        rcu_periph_clock_enable(RCU_GPIOB);
        
        /* USBFS_DM(PA11) and USBFS_DP(PA12) GPIO pin configuration */
        gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_14 | GPIO_PIN_15);
        gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_200MHZ, GPIO_PIN_14 | GPIO_PIN_15);
        
        gpio_af_set(GPIOB, GPIO_AF_10, GPIO_PIN_14 | GPIO_PIN_15);

    #endif /* USE_ULPI_PHY */

#endif /* USE_USBFS */
}

3.替换起启文件,把keil里的startup_gd32f450.s把成startup_gd32f407.s具体比较简单略过

换成

 

4.修改system_gd32f4xx.c,配置时钟。系统时钟改成168MHz,从而确保USB时间为48MHz,否则USB枚举不成功;

5.枚举成功后,装上GD官网USB驱动,有可能识别不了。因为PID不匹配,需要修改代码里的PID

把PID由0x018A改为0x018B,如下图

到此可以正常通讯

 

遗憾:

a.速率太慢;

b.64字节的整数倍未能正常发送,有哪位大神搞定请不吝赐教;

STM32和GD32都是基于ARM Cortex-M内核的微控制器。因此,我们可以通过移植的方式将STM32的应用程序移植GD32F450上运行。 移植的过程主要包括以下几个步骤: 1. 硬件兼容性的评估:首先需要评估STM32和GD32F450之间的硬件兼容性。包括引脚定义和功能,外设接口,时钟配置等。确保GD32F450能够满足STM32应用程序的硬件需求。 2. 代码移植:将STM32的应用程序代码移植GD32F450上。这需要根据GD32F450的器件文档和引脚定义对代码进行修改。例如,将与引脚相关的代码进行调整,确保外设的初始化和配置正确。 3. 外设适配:GD32F450和STM32之间可能存在一些外设差异。在移植过程中,需要对外设进行适配,确保GD32F450上的外设能够与STM32的应用程序正确交互。 4. 系统时钟配置:根据GD32F450的时钟配置要求,对应用程序的系统时钟进行调整。确保系统时钟的稳定性和准确性。 5. 编译和调试:对移植后的代码进行编译和调试。根据GD32F450的开发工具和环境,对代码进行编译和烧录,然后通过调试工具对程序进行调试。 在移植过程中,需要对应用程序的硬件相关代码进行修改,以适配GD32F450的硬件和外设。同时还需注意时钟配置和系统初始化的差异,以确保移植后的应用程序能够在GD32F450上正常运行。 综上所述,将STM32的应用程序移植GD32F450主要涉及硬件兼容性评估、代码移植、外设适配、系统时钟配置和编译调试等步骤。通过仔细的修改和调试,我们可以成功地将STM32应用程序移植GD32F450上运行。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值