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

这篇具有很好参考价值的文章主要介绍了GD32F4(9):GD32f4出现上电不工作,必须按复位程序才能跑起来。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1.问题描述

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

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

2. 我的调试思路

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

2.1 第一步,排除电源问题

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

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

既然按一下复位键就会正常,那会不会是复位引脚电平的问题,因此我用示波器同时捕获VCC和reset引脚在上电瞬间的电平变化,发现如下图:
GD32F4(9):GD32f4出现上电不工作,必须按复位程序才能跑起来

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

2.3 第三步,分析启动过程

其实当我排除电源、复位引脚问题后,我就迷茫了,因此我就分析mcu在启动的时候,都会使用那些资源,会不会是上电瞬间资源没有准备好,导致启动失败,对着电路板,思来想去也只感觉也只用到了外部晶振,电路图如下:
GD32F4(9):GD32f4出现上电不工作,必须按复位程序才能跑起来

可是因为我晶振选择的封装比较小,示波器探头实在是连接不上,再加上我选择的是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上,需要延长等待时间。

现在想来,好容易,

但是当刚出现问题的时候,我都快崩溃了。文章来源地址https://www.toymoban.com/news/detail-402783.html

到了这里,关于GD32F4(9):GD32f4出现上电不工作,必须按复位程序才能跑起来的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RT-Thread GD32F4xx CAN驱动

      在RT-Thread的bsp文档中没有找到GD32F4xx的CAN驱动文件,此处参考STM32的drv_can编写CAN驱动。

    2024年02月02日
    浏览(42)
  • RT-Thread GD32F4xx PWM设备驱动

      PWM(Pulse Width Modulation,脉冲宽度调制) 是一种对模拟信号电平进行数字编码的方法,通过不同频率的脉冲使用方波的占空比用来对一个具体模拟信号的电平进行编码,使输出端得到一系列幅值相等的脉冲。在具体的芯片中,PWM功能的实现一般定时器绑定,借助定时器的计数

    2024年02月10日
    浏览(36)
  • GD32F4单片机实现接收超时中断+DMA实现串口的不定长接收和DMA发送

    环形缓冲区+定时器超时中断的方式 优点 环形缓冲区可以接收多帧数据 数据帧超时间隔可以设置 缺点 设备任务比较繁重时,使用中断接收可能会丢失数据。尤其是在长时间关闭中断或者串口中断优先级不高时 频繁进出中断。在使用RTOS的系统中,每收到一个数据就会进行一

    2024年02月15日
    浏览(52)
  • STM32F4Timer

    ref https://blog.csdn.net/zhuxinmingde/article/details/131784852?ops_request_misc=request_id=biz_id=102utm_term=STM32%20%E9%AB%98%E7%BA%A7%EF%BC%8C%E6%99%AE%E9%80%9A%EF%BC%8C%E5%9F%BA%E6%9C%AC%E5%AE%9A%E6%97%B6%E5%99%A8utm_medium=distribute.pc_search_result.none-task-blog-2 all sobaiduweb~default-1-131784852.142 v99 controlspm=1018.2226.3001.4187 1. Timer re

    2024年02月02日
    浏览(36)
  • STM32-IAP基本原理及应用 | ICP、IAP程序下载流程 | 程序执行流程 | 配置IAP到STM32F4xxx

    ①在线编程(ICP,In-Circuit Programming) :通过JTAG/SWD协议或者系统加载程序(Bootloader, 串口 )下载用户应用程序到微控制器中。 ②在程序中编程(IAP,In Application Programming) :通过任何一种通信接口(如IO端口,USB,CAN,UART,I2C,SPI等)下载程序或者应用数据到存储器中( 需要在此前通过在线编

    2024年02月07日
    浏览(36)
  • 第三步:STM32F4时钟介绍

    1. STM32 有 5 个时钟源 :HSI 、 HSE 、 LSI 、 LSE 、 PLL 。     ①、 HSI 是高速内部时钟, RC 振荡器,频率为 16MHz ,精度不高。可以直接作为系统   时钟或者用作 PLL 时钟输入。 ②、 HSE 是高速外部时钟,可接石英 / 陶瓷谐振器,或者接外部时                 钟源,频率范

    2024年02月12日
    浏览(38)
  • 第五步:STM32F4端口复用

    STM32 有很多的内置外设,这些外设的外部引脚都是与 GPIO 复用的。也就是说,一个 GPIO 如果可以复用为内置外设的功能引脚,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。 例如串口 1 的发送接收引脚是 PA9,PA10 ,当我们把 PA9,PA10 不用作 GPIO ,而用做复用功能串口

    2024年02月12日
    浏览(49)
  • 第八步:STM32F4 EXTI

    STM32F4的每个IO都可以作为外部中断输入。 STM32F4的中断控制器支持22个外部中断/事件请求: EXTI线0~15:对应外部IO口的输入中断。 EXTI线16:连接到PVD输出。 EXTI线17:连接到RTC闹钟事件。 EXTI线18:连接到USB OTG FS唤醒事件。 EXTI线19:连接到以太网唤醒事件。 EXTI线20:连接到US

    2024年02月12日
    浏览(38)
  • STM32F4X 定时器中断

    定时器(Timer)最基本的功能就是定时,比如定时翻转LED灯,定时向串口发送数据等。除此之外,定时器还可以跟GPIO结合使用,利用定时器产生PWM波形,利用定时器捕捉电平信号等。本章先来讲解定时器的最基本的用法,定时功能。 STM32F4X将定时器分成3类,分别是基本定时器,

    2024年02月12日
    浏览(38)
  • 基于STM32F4开发的智能台灯

    写这篇博客的目的有2个,首先是记录一下学习STM32大半年来的第一个自己动手开发的项目,整理一下开发过程和思路;其次也是希望可以和更多的同行交流开发经验,有什么问题可以多多讨论,集思广益,共同进步~ 开发的智能台灯功能有2个: 1.手动模式:可通过按键调节

    2024年02月05日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包