GD32F4(9):GD32f4出现上电不工作,必须按复位程序才能跑起来
创始人
2024-02-10 10:35:03
0

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

文章目录

  • GD32:上电不工作,需要按一下复位按键程序才能跑起来
    • 1.问题描述
    • 2. 我的调试思路
      • 2.1 第一步,排除电源问题
      • 2.2 第二步,排除复位电路的问题
      • 2.3 第三步,分析启动过程
    • 3 .总结

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上,需要延长等待时间。

现在想来,好容易,

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

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...