GD32 USB调试、DFU过程问题

1、USB调试注意事项

最近做一个项目,用的是GD32F303的MCU,用到了USB数据传输的方式,该系列MCU只支持USB的DEVICE的模式,不支持OTG模式。本人用的是GD32官方提供的库信息,因此直接移植了官方的DEMO。在调试过程中,调试了很多天,每次插上USB后,电脑均提示“设备描述符请求失败”,一直无果后,偶然间开了内部RC时钟,竟然可以识别了。

后面经分析得知,电路中用的是12M外部晶振,而官方DEMO用的是8M外部晶振。不光需要改宏定义,还要改计算倍数,

改动如下 :

static void system_clock_48m_hxtal(void)
{
    uint32_t timeout = 0U;
    uint32_t stab_flag = 0U;

    /* enable HXTAL */
    RCU_CTL |= RCU_CTL_HXTALEN;

    /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */
    do{
        timeout++;
        stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB);
    }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout));

    /* if fail */
    if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){
        while(1){
        }
    }

    RCU_APB1EN |= RCU_APB1EN_PMUEN;
    PMU_CTL |= PMU_CTL_LDOVS;

    /* HXTAL is stable */
    /* AHB = SYSCLK */
    RCU_CFG0 |= RCU_AHB_CKSYS_DIV1;
    /* APB2 = AHB/1 */
    RCU_CFG0 |= RCU_APB2_CKAHB_DIV1;
    /* APB1 = AHB/2 */
    RCU_CFG0 |= RCU_APB1_CKAHB_DIV2;

#if (defined(GD32F30X_HD) || defined(GD32F30X_XD))
    /* select HXTAL/2 as clock source */
    RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0);
    RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_CFG0_PREDV0);
    //改了这里,注释掉的是以前的
//    /* CK_PLL = (CK_HXTAL/2) * 12 = 48 MHz */
//    RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5);
//    RCU_CFG0 |= RCU_PLL_MUL12;

	/* CK_PLL = (CK_HXTAL/2) * 8 = 48 MHz */
	RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5);
    RCU_CFG0 |= RCU_PLL_MUL8;

#elif defined(GD32F30X_CL)
    /* CK_PLL = (CK_PREDIV0) * 12 = 48 MHz */ 
    RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5);
    RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_PLL_MUL12);

    /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ 
    RCU_CFG1 &= ~(RCU_CFG1_PLLPRESEL | RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0);
    RCU_CFG1 |= (RCU_PLLPRESRC_HXTAL | RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10);

    /* enable PLL1 */
    RCU_CTL |= RCU_CTL_PLL1EN;
    /* wait till PLL1 is ready */
    while((RCU_CTL & RCU_CTL_PLL1STB) == 0){
    }
#endif /* GD32F30X_HD and GD32F30X_XD */

    /* enable PLL */
    RCU_CTL |= RCU_CTL_PLLEN;

    /* wait until PLL is stable */
    while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){
    }

    /* enable the high-drive to extend the clock frequency to 120 MHz */
    PMU_CTL |= PMU_CTL_HDEN;
    while(0U == (PMU_CS & PMU_CS_HDRF)){
    }

    /* select the high-drive mode */
    PMU_CTL |= PMU_CTL_HDS;
    while(0U == (PMU_CS & PMU_CS_HDSRF)){
    }

    /* select PLL as system clock */
    RCU_CFG0 &= ~RCU_CFG0_SCS;
    RCU_CFG0 |= RCU_CKSYSSRC_PLL;

    /* wait until PLL is selected as system clock */
    while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){
    }
}

由于该USB DEVICE只支持48MHz时钟,如果按照8Mhz的放大倍数,算出来的与实际的差别很大,因此将时钟修改正确就OK了。

修改掉了注释那里,重新计算,则USB可正常执行。

 

2 、GD32 DFU问题

官网下的DFU工具,在WIN7上会提示设置选项字节失败。改回WIN10系列后,可正常使用DFU,应该是该软件存在问题,现在并未修复。

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
GD32 USBD DFU是指在GD32系列MCU中使用USB设备固件升级(Device Firmware Upgrade,简称DFU)的功能。引用\[1\]中提到,GD32F303系列MCU只支持USB的DEVICE模式,不支持OTG模式。因此,在使用GD32官方提供的库信息进行开发时,可以直接移植官方的DEMO来实现USB数据传输。 在调试过程中,引用\[1\]中提到遇到了一个问题,每次插上USB后,电脑提示"设备描述符请求失败"。经过多次尝试后,作者偶然间开启了内部RC时钟,竟然可以识别了。这可能是因为内部RC时钟的开启解决了某些与USB通信相关的问题。 另外,引用\[2\]中提到了Longan Nano开发板,它是基于GD32VF103CBT6单片机的极简开发板。该开发板具有128K flash和32K RAM的片上资源。 如果你想使用GD32 USBD DFU功能进行固件升级,可以按照引用\[3\]中的步骤进行操作。首先,生成helloworld.bin文件,然后进入下载模式,使用dfu-util工具进行下载。下载完成后,连接串口,波特率设置为115200,按下reset键即可看到打印信息"Hello World From Nuclei RISC-V Processor!"。 总结来说,GD32 USBD DFUGD32系列MCU中使用USB设备固件升级的功能。在使用过程中,可能会遇到一些问题,但可以通过调试和尝试不同的设置来解决。 #### 引用[.reference_title] - *1* [GD32 USB调试DFU过程问题](https://blog.csdn.net/u012260580/article/details/108904876)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [1.1 ubuntu环境下搭建gd32vf103](https://blog.csdn.net/ldl617/article/details/120307412)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值