单片机0xFFFFFFFE死机问题解决

这篇具有很好参考价值的文章主要介绍了单片机0xFFFFFFFE死机问题解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述

最近在忙公司项目的时候,要调试一个新功能,防止BootLoader的干扰,故将BootLoader屏蔽了,直接将app的中断向量表改为默认的,发现运行不了,将所有代码屏蔽掉,只留一个系统滴答定时器,和一个gpio控制灯光闪烁。发现还是运行不了。卡死在如下界面:
movs r0,r0,STM32,单片机,keil,hc32,0xFFFFFFFE,stm32死机
0xFFFFFFFE 0000 MOVS r0,r0 卡死在了这一句汇编代码。很明显这个地址已经超出了mcu内存的寻址范围。经过多次测试都是这个问题。

问题排查

反复编译验证后,发现如果将delay函数改为硬件延时同时屏蔽掉系统滴答定时器的初始化,就是工作正常。上图中的delay是调用了系统滴答定时器的计数值。

疑似跟系统定时器有关系,最终发现滴答定时器的中断怎么都进不了。换另外一块板子上的程序也改成只有一个闪灯和系统滴答定时器,然而在另外一块板子上的程序能正常运行。与硬件同事排查了晶振是否起振,都正常。

百度这个问题,也没有发现如何解决,基本分析都是指针指向了内存以外的地址,可能是野指针问题,但是,明显跟我这情况不同,我这代码不可能存在野指针(都没有用到指针)。

问题解决

排查了一圈后,发现领一块板子上的程序运行正常,且这两块板子的单片机型号是一样的,不同的是两块板子的晶振频率不一样。仅此区别,最后还是怀疑代码中哪里有问题。于是从.s文件开始查找。
movs r0,r0,STM32,单片机,keil,hc32,0xFFFFFFFE,stm32死机
单片机上电后先是调用了SystemInit函数,该函数执行完毕后,才跳转到main函数执行。找到该函数的定义。

void SystemInit(void)
{
    /* FPU settings */
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 20) | (3UL << 22)); /* set CP10 and CP11 Full Access */
#endif
    SystemCoreClockUpdate();
#if defined (ROM_EXT_QSPI)
    SystemInit_QspiMem();
#endif /* ROM_EXT_QSPI */
    /* Configure the Vector Table relocation */
    SCB->VTOR = VECT_TAB_OFFSET;    /* Vector Table Relocation */
}

movs r0,r0,STM32,单片机,keil,hc32,0xFFFFFFFE,stm32死机
这个函数的最后一句指定了中断向量表的地址。一般来说都是单片机运行的起始地址,对于stm32 或gd32等中断向量表默认是0x8000000,对于hc32是0x0。接着看下VECT_TAB_OFFSET发现该值不是默认值,而被改到了app的中断向量表位置。到这里虎躯一震,感觉问题找到了,立刻将改宏定义改为0x0,编译运行,一切正常,led灯按照2s的周期稳定闪烁。至此问题解决!

吐槽:感谢前同事写的一手好代码。正常使用了bootloader后都是在main函数中,改变中断向量表的位置。而SystemInit这是系统起来前的硬件初始化,基本上不会去动它。很难想象前同事为什么要改这里。文章来源地址https://www.toymoban.com/news/detail-744423.html

到了这里,关于单片机0xFFFFFFFE死机问题解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 使用标准库和HAL库的STM32单片机进行串口通信/解决因例程为HAL库的传感器,而其他模块都是标准库,需要将数据用串口传送给标准库的单片机的相关问题

    (本文使用STM32F103C8T6,在CubeMX里演示用的是RBT6,但实际上引脚是一样的)         本文 着重解决一个大工程中,某些传感器的例程是HAL库的,而其他模块(或算法)都是标准库,导致难以移植的问题。 本文的解决方法是:使用一片单片机用HAL库(CubeMX)配置例程,然后

    2024年02月06日
    浏览(65)
  • 单片机软件编译问题汇总

    介绍一下单片机开发过程常见编译报错及解决方法,以及软件使用问题 1.1.1 错误现象:Error[Pe140]: too many arguments in function call 解决方法:取消括号里的声明,因为与之前定义的函数不一样 1.1.2 错误现象:程序设置波特率和串口调试助手波特率设置不同才能通信 解决方法:把

    2024年02月05日
    浏览(42)
  • 单片机面试常见问题

    1、中断的概念?简述中断的过程 (1)中断:指CPU在正常执行程序的过程中,由于内部/外部事件的触发或由程序的预先安排,引起CPU暂时中断当前正在运行的程序,转而执行为内部/外部事件或程序预先安排的事件的服务子程序,待中断服务子程序执行完毕后,CPU再返回到被

    2024年04月10日
    浏览(77)
  • 关于单片机的时钟浅谈及STM32F103/F030单片机的内外时钟切换问题

    本文主要讲解单片机的时钟系统的相关知识,并进行超频测试,同时介绍如何在STM32F0单片机上进行内外时钟的切换,在不使用外部晶振或者外部晶振不启动时自动切换内部时钟的方法。 问题来源于群里的一次问答: 诚然,当使用固件库时,把外部晶振摘掉,系统确实会自动

    2024年02月15日
    浏览(46)
  • 单片机IAP升级的一些问题与经验

    前阵子做项目时需要IAP升级,遇到了很多问题,我在此总结一下,避免后面再次踩到同样的坑。这个过程还是有些学问的,有时往往理论正确但是实践起来却遇到各种bug,需要好好研究,特别是对应单片机型号不同,也有很多地方需要修改。 本人使用的芯片型号是AT32F413CB,

    2024年02月03日
    浏览(41)
  • 【51单片机】利用【时间延迟】的原理规避【按键抖动问题】

    前言 大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 本章是51LCD单片机设计的一个环节,完整可前往相应博客查看完整 传送门 欢迎订阅 YY 滴C++专栏!更多干货持续更新!以下是传送门! YY的《C++》专栏 YY的《C++11》专栏 YY的《Lin

    2024年02月20日
    浏览(68)
  • Arduino 单片机程序中处理时间戳、时间溢出和延时问题

    这个话题对其他单片机也适用,就是用来计时的变量万一溢出了该怎么整,类似那个经典的千年虫问题。实际上这个问题在日常生活中也很常见,比如,时钟上的小时最大值为23,从0 开始,每过24 小时归零一次,只按时钟上的小时数来记录时间,最多只能计24 小时。时间超过

    2024年02月10日
    浏览(45)
  • 烟感报警器单片机方案开发,解决方案

    烟感报警器也叫做烟雾报警器。烟感报警器适用于火灾发生时有大量烟雾,而正常情况下无烟的场所。例如写字楼、医院、学校、博物馆等场所。烟感报警器一般安装于所需要保护或探测区域的天花板上,因火灾中烟雾比空气轻,更容易向上飘散,安装部位在上方,提高感烟

    2024年02月09日
    浏览(50)
  • 单片机卡死的八大原因和解决方法

    在微控制器上,程序卡住(即停止执行)可能有多种原因。下面我将列举一些常见的原因,并提供一些可能导致程序卡住的示例情况。请注意,这里只是一些示例,并不能穷尽所有可能的情况。 1. 死循环(Infinite Loop):在程序中存在无法跳出的循环结构,导致程序无法继续

    2024年02月15日
    浏览(84)
  • 单片机卡死的几大原因、分析、解决

    阅读引言: 本文我想给大家分享一下我在学习过程中遇到的以及了解到的一些导致单片机运行卡死(死锁)的一些常见原因和解决办法, 请注意, 只是列举,并不是全部, 因为导致单片机运行卡死的原因无穷无尽。 目录 一、裸机层面 1.死循环, 条件一直成立 2.中断问题

    2024年03月28日
    浏览(59)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包