GD32:上电不工作,需要按一下复位按键程序才能跑起来
文章目录
- GD32:上电不工作,需要按一下复位按键程序才能跑起来
- 1.问题描述
- 2. 我的调试思路
- 2.1 第一步,排除电源问题
- 2.2 第二步,排除复位电路的问题
- 2.3 第三步,分析启动过程
- 3 .总结
1.问题描述
绘制一个gd32450的pcb板子,结果烧录程序后发生下面事情:
- 上电程序不能正常启动或者偶尔可以正常启动一次,很随机。
- 当上电后程序不启动的时候,我再按一下mcu的reset按键,程序就能正常启动了。
- 当我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上,需要延长等待时间。
现在想来,好容易,
但是当刚出现问题的时候,我都快崩溃了。