GD32F4(9):GD32f4出现上电不工作,必须按复位程序才能跑起来

GD32:上电不工作,需要按一下复位按键程序才能跑起来

1.问题描述

绘制一个gd32450的pcb板子,结果烧录程序后发生下面事情:

  1. 上电程序不能正常启动或者偶尔可以正常启动一次,很随机。
  2. 当上电后程序不启动的时候,我再按一下mcu的reset按键,程序就能正常启动了。
  3. 当我debug调试的时候,回回都能正常启动,根本定位不到问题

2. 我的调试思路

首先在板子里面下载一个最简单的程序,led闪烁程序。通过观察led是否闪烁,来断定程序是否正常启动。

2.1 第一步,排除电源问题

首先我怀疑的是我的电源在供电的瞬间是不是出现了波动,导致mcu死机了,后来我用示波器看,发现电源虽然是曲面上升的,但是没有出现波动,同时在5毫秒内,电源就达到了稳定,因此排除了电源的问题。

2.2 第二步,排除复位电路的问题

既然按一下复位键就会正常,那会不会是复位引脚电平的问题,因此我用示波器同时捕获VCC和reset引脚在上电瞬间的电平变化,发现如下图:
在这里插入图片描述

也挺正常的,因此排除了复位引脚引发的问题。

2.3 第三步,分析启动过程

其实当我排除电源、复位引脚问题后,我就迷茫了,因此我就分析mcu在启动的时候,都会使用那些资源,会不会是上电瞬间资源没有准备好,导致启动失败,对着电路板,思来想去也只感觉也只用到了外部晶振,电路图如下:
在这里插入图片描述

可是因为我晶振选择的封装比较小,示波器探头实在是连接不上,再加上我选择的是32M的晶振,若用杜邦线可能会影响带宽,从而测量不出来结果,因此我决定先从程序下手。

因此我就修改了程序,采用内部晶振来为mcu提供时钟,结果发现,上电程序运行了,好了。那么就是晶振的问题了。

在开始的时候我没有怀疑晶振,是因为我每次按下复位程序都可以正常运行,因此说明晶振应该是正常的,在加上这款晶振我以前在stm32上经常使用,因此根本就不会怀疑它,可是现在这种现象,应该就是供电的时候,晶振没有准备好,于是我分析了一下时钟配置的程序,详见我另一篇文章:GD32F4(5):GD32F450时钟配置为200M过程分析

在时钟配置函数有下面一点代码:

    /* 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 */
    //若外部高速时钟异常,上面等待超时,则进入这里永远等待,系统会卡在while(1)里面
    if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){
    
    
        while(1){
    
    
            //若时钟没有准备好就会卡在这里         
        }
    }
    //运行到这里,说明外部高速时钟正常启动,下面就要按照时钟树,来配置系统和各个模块的时钟  

那么这个等待稳定的时间是由HXTAL_STARTUP_TIMEOUT来决定的,下面是它的定义:

/* define startup timeout value of high speed crystal oscillator (HXTAL) */
#if !defined  (HXTAL_STARTUP_TIMEOUT)
#define HXTAL_STARTUP_TIMEOUT   ((uint16_t)0x0800)
#endif /* high speed crystal oscillator startup timeout */

我们可以看到HXTAL_STARTUP_TIMEOUT的默认值是0x800,现在我将这个数改大为efff,如下:

/* define startup timeout value of high speed crystal oscillator (HXTAL) */
#if !defined  (HXTAL_STARTUP_TIMEOUT)
#define HXTAL_STARTUP_TIMEOUT   ((uint16_t)0xefff) //((uint16_t)0x0800)
#endif /* high speed crystal oscillator startup timeout */

现在运行,发现程序正常了。

3 .总结

一样的晶振,在stm32上就很正常,在gd32上,需要延长等待时间。

现在想来,好容易,

但是当刚出现问题的时候,我都快崩溃了。

猜你喜欢

转载自blog.csdn.net/Zhichao_Zhang/article/details/127997250