精华内容
下载资源
问答
  • 2021-08-07 22:17:48



    1、应对复位

    单片机可能在运行过程中复位了,下面介绍几种类型,用来分析自己的单片机可能的复位类型,从而定位问题根源:

    序号分类原因
    1看门狗喂狗不及时导致复位,可能没有打印错误码,跟 硬复位 效果相同
    2内存泄露内存泄露导致复位(有些单片机会打印 error码,比如bk3432:0xf2f2f2f2)
    3指针使用出错-
    4软件复位寄存器不会重置
    5硬复位上电复位 / RST引脚复位,寄存器会重置

    2、应对 程序死机/跑飞/死循环

    1、增加 软件看门狗 ,当程序死机无法喂狗,看门狗会让单片机复位。
    2、如果程序死机时,软件看门狗也失效,那么就需要 增加 硬件看门狗芯片。

    3、关键代码保护

    程序中通过硬件SPI或者IIC跟外设通信,如果确认时序没有问题(正常情况可以读取数据或者发送数据),但是在有时候在通信过程中,被其他中断抢占,造成SPI 时序延迟 导致出错。

    解决方法:在SPI 通信开始前,关闭总中断;在SPI通信结束之后,再打开总中断
    从而保护 关键代码运行不被干扰。类似于 通过 进入临界区 / 退出临界区(enter_critical() / exit_critical())的方式保护关键代码不受干扰。


    4、蓝牙连接广播 造成异常

    蓝牙连接广播较小(<200ms),造成偶现 屏幕显示异常、I2C通信异常等情况,可以把连接广播间隔设置成1.5s~2s。

    更多相关内容
  • 近期在用nios ii做项目时,发现一个奇怪的现象,在NIOS II EDS软件中编写好的代码,烧写到芯片中,第一次能够正常运行,但是当我按下板卡上的复位键之后,系统却卡死了,再也运行不起来,除非重新下载程序。
  • 近期在用nios ii做项目时,发现一个奇怪的现象,在NIOS II EDS软件中编写好的代码,烧写到芯片中,第一次能够正常运行,但是当我按下板卡上的复位键之后,系统却卡死了,再也运行不起来,除非重新下载程序。
  • 电路上电不复位的原因可能是多方面的,特别是stm32f030和外围电路均需要复位的情况,因此各个模块可能需要隔离测试,最终锁定问题才能找到解决的方法。
  • 当处理器的复位电平有效时,产生复位异常,程式跳转到复位异常处执行(异常向量:0x0000,0000);   2、未定义指令(优先级6) 当ARM 处理器或协处理器遇见不能处理的指令时,产生为定义异常。可使用...
  • 关注+星标公众号,不错过精彩内容每一块处理器都有复位的功能,不同处理器复位的类型可能有差异,引起复位的原因也可能有多种。STM32的复位功能非常强大,可通过软件、硬件和一些事件触发系统复位...

    关注+星标公众,不错过精彩内容

    每一块处理器都有复位的功能,不同处理器复位的类型可能有差异,引起复位的原因也可能有多种。

    STM32的复位功能非常强大,可通过软件、硬件和一些事件触发系统复位,而且通过其复位状态标志可分析复位原因。该部分位于STM32的RCC(Reset and Clock Control)模块。

    嵌入式专栏

    1

    STM32 复位介绍

    对于STM32来说,复位通常分为三种类型:系统复位、电源复位和备份域复位。本文结合STM32F4描述系统和电源复位的内容。

    1. 系统复位

    除了RCC的复位标志和备份域中的寄存器外,系统复位会将其它全部寄存器都复位为复位值。

    产生系统复位事件:

    • NRST 引脚低电平

    • 窗口看门狗计数结束

    • 独立看门狗计数结束

    • 软件复位

    • 低功耗管理复位

    2. 电源复位

    除备份域内的寄存器以外,电源复位会将其它全部寄存器设置为复位值。

    产生电源复位条件:

    • 上电/掉电复位或欠压复位

    • 在退出待机模式时

    注:备份域具有特定的复位,其复位仅作用于备份域本身(本文暂不讲述备份域复位)。

    3. 复位电路简图

    由上图可以看出来,NRST引脚、看门狗等各种事件最终都能引起系统复位。

    嵌入式专栏

    2

    STM32 内核和系统复位

    上一章节站在STM32整体层面讲述了产生复位的多种事件,本章节进一步描述STM32的内核和系统复位。

    STM32由内核(如:Cortex-M4)和各种片内外设(如UART)资源组成,其中软件复位可指定是内核复位还是系统复位。

    (图片来源网络)

    1. 内核复位

    在Cortex-M内核文档中大概有这样的描述:通过设置 NVIC 中应用程序中断与复位控制寄存器(AIRCR)的VECTRESET 位,可只复位处理器内核而不复位其它片上设施。

    也就是说,这样操作只复位Cortex-M内核,不会复位UART这些片内外设。

    内核复位函数(参考内核代码修改而来):

    void NVIC_CoreReset(void)
    {
      __DSB();
      SCB->AIRCR  = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      |
                     (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
                     SCB_AIRCR_VECTRESET_Msk);       //置位 VECTRESET
      __DSB();
      while(1) { __NOP(); }
    }
    

    2. 系统复位

    软件复位中的系统复位操作的寄存器位(SYSRESETREQ)不同,复位的对象为整个芯片(除后备区域)。

    系统复位函数:

    void NVIC_SysReset(void)
    {
      __DSB();
      SCB->AIRCR  = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      | 
                     (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | 
                     SCB_AIRCR_SYSRESETREQ_Msk);     //置位 SYSRESETREQ
      __DSB();
      while(1) { __NOP(); }
    }
    

    嵌入式专栏

    3

    STM32 复位来源

    为了方便软件工程师调试和查找(复位)问题,STM32设计有个状态寄存器保存了各种复位来源的状态。

    如下图所示(具体请查阅参考手册):

    嵌入式专栏

    4

    STM32 引起异常复位的原因

    上面讲述了引起复位的事件有多种,本章节将结合实际应用,描述常见引起复位的原因及解决办法。

    原因一:NRST引脚电平被拉低引起复位

    有些特殊环境,特别是大型工厂,外界或内部会使电源产生干扰信号,使STM32的NRST引脚电平被拉低,从而导致系统复位。

    分析原因:NRST引脚电平拉低20us就会引起系统复位,电源上一个纹波,或者外部静电都会引起电源被拉低20us。

    解决办法:电源滤波、使用隔离电源、添加屏蔽措施等。

    原因二:欠压引起复位

    有些产品在设计之初没有综合计算负载(与STM32同电源),因负载过大,使其欠压,从而导致复位。

    分析原因:STM32除了上电和掉电复位之外,绝大部分STM32还有一个欠压复位,当电源电压 (VDD) 降至所选 VBOR 阈值以下时,芯片将复位。

    解决办法:选择负载更大的电源、通过软件配置合理的欠压值VBOR。

    原因三:数字、模拟电源地压差引起复位

    有工程师将VSS 和 VSSA之间使用一个几欧,甚至几十欧的电阻连接,有时候(有大电流经过地线)就会因为电源地的压差导致芯片(电源)复位。

    分析原因:我们比较关注 VDD 和 VDDA 的关系,但忽略了 VSSA 和 VSS 压差需要小于 50mV这一点(具体可以看数据手册)。如果有大电流的情况,则会引起电源地存在压差。

    解决办法:尽量使用完全连接地的方式处理,比如0欧电阻,或者隔离电源。

    原因四:看门狗超时喂狗引起复位

    有不少工程师设计低功耗产品时,使用了看门狗,但是他们往往忘记了芯片睡眠模式不能停止喂狗,从而导致看门狗复位。

    分析原因:STM32进入睡眠之后,看门狗依然继续在工作,如果不及时喂狗,芯片会产生看门狗复位。

    解决办法:进入睡眠之前设置更长的喂狗时间,同时不定期唤醒芯片进行喂狗。

     

    复盘一下

    ▼复位通常分为:系统复位、电源复位和备份域复位;

    ▼STM32软件复位分:内核和系统复位;

    ▼STM32复位来源:状态寄存器保存复位来源状态;

    ▼常见复位问题:NRST被拉低、欠压、压差、看门狗超时喂狗等;

    ------------ END ------------

    后台回复『STM32』『STM32学习笔记』阅读更多相关文章。

    欢迎关注我的公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

    欢迎关注我的视频号:

    点击“阅读原文”查看更多分享。

    展开全文
  • 当异常发生时,ARM处理器尽可能完成当前指令(除了复位异常)后,再去处理异常。并执行如下动作:  1. 进入与特定的异常相应的操作模式。  2. 将引起异常指令的下一条指令的地址保存到新模式的r14中。  3. 将...
  • STM32出现HardFault_Handler解决方法 故障的原因主要有两个方面: 1、内存溢出或者访问...由于异常发生时,内核将R0~R3、R12、Returnaddress、PSR、LR寄存器依次入栈,其中Return address即为发生异常前PC将要执行的

    STM32出现HardFault_Handler解决方法

    故障的原因主要有两个方面:

    1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。

    2、堆栈溢出。增加堆栈的大小。

    出现问题时排查的方法:

    发生异常之后可首先查看LR寄存器中的值,确定当前使用堆栈为MSP或PSP,然后找到相应堆栈的指针,并在内存中查看相应堆栈里的内容。由于异常发生时,内核将R0~R3、R12、Returnaddress、PSR、LR寄存器依次入栈,其中Return address即为发生异常前PC将要执行的下一条指令地址。

    注意:寄存器均是32位,且STM32是小端模式。(参考Cortex-M3权威)
    在这里插入图片描述
    SP值为0x20008560,查看堆栈里面的值依次为R0~R3、R12、Return address、PSR、LR, 例如R0(1027 00 00), 显然堆栈后第21个字节到24字节即为Returnaddress,该地址0x08001FFD即为异常前PC将要执行的下一条指令地址(即StackFlow()后面的语句处RCC->CR &= (uint32_t)0xFFFBFFFF)
    在这里插入图片描述
    可以看到SP寄存器,0x20008560即为栈地址,该地址里面的值依次为R0~R3、R12、PC(Return address)、xPSR(CPSR或SPSR)、LR。每个寄存器的值存放4个字节。我们需要查找PC和xPSR的值。也就是查找栈里面第21~24以及25到28字节的内容,就可以找到对应的值。通过在Memory中输入栈的首地址,找到PC,xPSR的值。

    另一种方法:

    默认的HardFault_Handler处理方法不是B .这样的死循环么?楼主将它改成BXLR直接返回的形式。然后在这条语句打个断点,一旦在断点中停下来,说明出错了,然后再返回,就可以返回到出错的位置的下一条语句那儿

      Cortex-M3/4的Fault异常是由于非法的存储器访问(比如访问0地址、写只读存储位置等)和非法的程序行为(比如除以0等)等造成的。常见的4种异常及产生异常的情况如下:
    

    BusFault:在fetch指令、数据读写、fetch中断向量或中断时存储恢复寄存器栈情况下,检测到内存访问错误则产生BusFault。
    Memory ManagementFault:访问了内存管理单元(MPU)定义的不合法的内存区域,比如向只读区域写入数据。
    UsageFault:检测到未定义指令或在存取内存时有未对齐。还可以通过软件配置是否检测到除0和其它未对齐内存访问也产生该异常,默认关闭,需要在工程初始化时配置:

    HardFault:在调试程序过程中,这种异常最常见。上面三种异常发生任何一种异常都会引起HardFault,在上面的三种异常未使能的情况下,默认发生异常时进入HardFault中断服务程序。使能前三种异常也要在初始化时配置:
    当进入HardFault断点后,菜单栏Peripherals >Core Peripherals >FaultReports打开异常发生的报告,查看发生异常的原因。
    在这里插入图片描述
    在这里插入图片描述
    上面的报告发生了BUS FAULT,并将Fault的中断服务转向Hard Fault。

    相对于检测发生了什么异常,定位异常发生位置显得更重要。
    (1)打开Call Stack窗口(如下图左侧,断点停在Hard Fault服务程序中)
    在这里插入图片描述
    (2)在Call Stack的HardFault_Handler上右键Show CallerCode(有的Keil版本也可以直接双击)
    在这里插入图片描述
    这时将跳转到发生异常的源代码位置(如上图),异常发生在p->hour=0这一行。这里错误很明显:指针p尚未为成员变量分配内存空间,直接访问未分配的内粗空间肯定出错。

    再说明2点:
    [1] 在复杂的情况下,即使定位了异常发生位置也很难容易的改正错误,要学会使用Watch窗口对发生错误的指针变量进行跟踪;
    [2]在问题不明晰的情况下,尝试分析反汇编代码,就自己遇到的,部分情况下的异常发生在BL等跳转指令处,BL跳转到了不合法的内存地址产生异常

    展开全文
  • 下面通过对微处理器监控芯片MAX818在使用中出现异常复位的实例分析,说明由于电源完整性引起的系统工作不稳定现象。  1 系统描述  图1为μP监控电路。监控芯片MAX818具有电源低压监视、电池管理、RAM片选锁定及...
  • 监控芯片因电源问题引起异常复位的处理办法、电子技术,开发板制作交流
  • STM32引起电源和系统异常复位的原因

    千次阅读 2020-03-18 22:30:09
    关注、星标公众号,不错过精彩内容来源:STM32每一块处理器都有复位的功能,不同处理器复位的类型可能有差异,引起复位的原因也可能有多种。今天是第3篇分享...

    关注、星标公众,不错过精彩内容

    来源:STM32

    每一块处理器都有复位的功能,不同处理器复位的类型可能有差异,引起复位的原因也可能有多种。

    今天是第3篇分享,《STM32学习笔记》之引起电源和系统异常复位的原因

    STM32的复位功能非常强大,可通过软件、硬件和一些事件触发系统复位,而且通过其复位状态标志可分析复位原因。该部分位于STM32的RCC(Reset and Clock Control)模块。

    STM32 复位介绍

    对于STM32来说,复位通常分为三种类型:系统复位、电源复位和备份域复位。本文结合STM32F4描述系统和电源复位的内容。

    1. 系统复位

    除了RCC的复位标志和备份域中的寄存器外,系统复位会将其它全部寄存器都复位为复位值。

    产生系统复位事件:

    • NRST 引脚低电平

    • 窗口看门狗计数结束

    • 独立看门狗计数结束

    • 软件复位

    • 低功耗管理复位

    2. 电源复位

    除备份域内的寄存器以外,电源复位会将其它全部寄存器设置为复位值。

    产生电源复位条件:

    • 上电/掉电复位或欠压复位

    • 在退出待机模式时

    注:备份域具有特定的复位,其复位仅作用于备份域本身(本文暂不讲述备份域复位)。

    3. 复位电路简图

    由上图可以看出来,NRST引脚、看门狗等各种事件最终都能引起系统复位。

    STM32 内核和系统复位

    上章节站在STM32整体层面讲述了产生复位的多种事件,本章节进一步描述STM32的内核和系统复位。

    STM32由内核(如:Cortex-M4)和各种片内外设(如UART)资源组成,其中软件复位可指定是内核复位还是系统复位。

    (图片来源网络)

    1. 内核复位

    在Cortex-M内核文档中大概有这样的描述:通过设置 NVIC 中应用程序中断与复位控制寄存器(AIRCR)的VECTRESET 位,可只复位处理器内核而不复位其它片上设施。

    也就是说,这样操作只复位Cortex-M内核,不会复位UART这些片内外设。

    内核复位函数(参考内核代码修改而来):

    void NVIC_CoreReset(void)
    {
      __DSB();
      SCB->AIRCR  = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      |
                     (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
                     SCB_AIRCR_VECTRESET_Msk);       //置位 VECTRESET
      __DSB();
      while(1) { __NOP(); }
    }
    

    2. 系统复位

    软件复位中的系统复位操作的寄存器位(SYSRESETREQ)不同,复位的对象为整个芯片(除后备区域)。

    系统复位函数:

    void NVIC_SysReset(void)
    {
      __DSB();
      SCB->AIRCR  = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      | 
                     (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | 
                     SCB_AIRCR_SYSRESETREQ_Msk);     //置位 SYSRESETREQ
      __DSB();
      while(1) { __NOP(); }
    }
    

    STM32 复位来源

    为了方便软件工程师调试和查找(复位)问题,STM32设计有个状态寄存器保存了各种复位来源的状态。

    如下图所示(具体请查阅参考手册):

    STM32 引起异常复位的原因

    上面讲述了引起复位的事件有多种,本章节将结合实际应用,描述常见引起复位的原因及解决办法。

    原因一:NRST引脚电平被拉低引起复位

    有些特殊环境,特别是大型工厂,外界或内部会使电源产生干扰信号,使STM32的NRST引脚电平被拉低,从而导致系统复位。

    分析原因:NRST引脚电平拉低20us就会引起系统复位,电源上一个纹波,或者外部静电都会引起电源被拉低20us。

    解决办法:电源滤波、使用隔离电源、添加屏蔽措施等。

    原因二:欠压引起复位

    有些产品在设计之初没有综合计算负载(与STM32同电源),因负载过大,使其欠压,从而导致复位。

    分析原因:STM32除了上电和掉电复位之外,绝大部分STM32还有一个欠压复位,当电源电压 (VDD) 降至所选 VBOR 阈值以下时,芯片将复位。

    解决办法:选择负载更大的电源、通过软件配置合理的欠压值VBOR。

    原因三:数字、模拟电源地压差引起复位

    有工程师将VSS 和 VSSA之间使用一个几欧,甚至几十欧的电阻连接,有时候(有大电流经过地线)就会因为电源地的压差导致芯片(电源)复位。

    分析原因:我们比较关注 VDD 和 VDDA 的关系,但忽略了 VSSA 和 VSS 压差需要小于 50mV这一点(具体可以看数据手册)。如果有大电流的情况,则会引起电源地存在压差。

    解决办法:尽量使用完全连接地的方式处理,比如0欧电阻,或者隔离电源。

    原因四:看门狗超时喂狗引起复位

    有不少工程师设计低功耗产品时,使用了看门狗,但是他们往往忘记了芯片睡眠模式不能停止喂狗,从而导致看门狗复位。

    分析原因:STM32进入睡眠之后,看门狗依然继续在工作,如果不及时喂狗,芯片会产生看门狗复位。

    解决办法:进入睡眠之前设置更长的喂狗时间,同时不定期唤醒芯片进行喂狗。

     

    复盘一下

    ▼复位通常分为:系统复位、电源复位和备份域复位;

    ▼STM32软件复位分:内核和系统复位;

    ▼STM32复位来源:状态寄存器保存复位来源状态;

    ▼常见复位问题:NRST被拉低、欠压、压差、看门狗超时喂狗等;

    推荐阅读:

    精选汇总 | 目录 | 搜索

    VS Code V1.43支持远程开发、同步预览

    Cortex-M微控制器软件接口标准CMSIS详细内容

    关注微信公众号『strongerHuang』,后台回复“1024”,查看更多精彩内容。

    长按前往图中包含的公众号关注

    展开全文
  • (2)在应用层添加8路VI通道检测,异常再对NVP芯片进行复位 测试后,可满足要求 实现如下: HI_S32 bAllChnNormal = 0; //所有通道是否正常 HI_S32 allChnNormalCnt = 0; //所有通道正常次数 ...
  • 近期在用nios ii做项目时,发现一个奇怪的现象,在NIOS II EDS软件中编写好的代码,烧写到芯片中,第一次能够正常运行,但是当我按下板卡上的复位键之后,系统却卡死了,再也运行不起来,除非重新下载程序。...
  • 异常向量表 1. 异常相关概念 (1) 异常 (2) 异常类型简介 2. 异常处理 (1) 异常处理 二. 异常向量表代码编写 1. 初始化异常向量表模块代码 2. 链接器脚本 3. Makefile 编译脚本 4. 编译输出可执行文件 ...
  • 浅谈ARM 的异常处理

    2020-04-22 11:19:24
    ARM 的异常处理 当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。当异常中断处理程序执行完成后,程序返回到发生中断指令的下条指令处执行。在进入异常中断处理程序时,要保存被...
  • 本篇博客主要讲授华大半导(STM32、C51等单片机均可适用)复位(以看门狗复位为例)后变量数据保存的方法。 这里将用到__not_init属性,其用于变量声明,可禁止系统启动时变量的初始化,有了__not_init属性,编译器...
  • 电子政务-一种监控电池管理系统异常复位异常掉电的方法.zip
  • 然而,有时这种设计仍然会引起程序工作不正常,原因主要是,当程序异常发生在定时器初始化及开中断之后时,这种情况就有可能不能由Watch dog复位电路校正回来。  因为定时器中断一直在产生,即使程序工作不正常,...
  • ESP32或esp8266串口不停输出复位信息,原因一般有两个 1、供电问题 芯片供电不足会让芯片一直复位,最好检查芯片的供电,有的芯片3.3V供电,有的需要5V 2、内存问题 部分函数例如定时器中断处理函数,外部中断处理...
  • ZYNQ异常与中断(一)

    2020-10-09 14:22:51
    ZYNQ异常与中断原理实现1.异常原理 1.异常原理 异常是情况或系统事件,当异常发生的时候,CPU需要停止当前的正常动作,转而去执行异常专用的程序,从而恢复系统的正常状态,这执行的过程称为异常处理15895456942 .....
  • 中断 概念:是一个过程,是CPU在执行当前程序的过程中因...ARM处理器中有7种类型的异常,按优先级从高到低的排列如下:复位异常(Reset)、数据异常(Data Abort)、快速中断异常(FIQ)、外部中断异常(IRQ)、预取...
  • STM32每次下载程序后能正常运行,但是断电或复位后程序运行就无法正常运行,大概解决办法如下 1、查看boot0和boot1是否都正常接地 2、查询其他外设是否卡死在其中一个里面了, 我遇到的问题是有一个模块有电源控制...
  • 中断(IRQ)只是ARM Cortex-M处理器中的一种异常异常能够引起程序停止执行当前任务,去执行中断处理函数。 Cortex-M0和Cortex-M0+处理器内置了名为NVIC的中断控制器,并且支持最多32个中断请求(IRQ)输入,以及1个不...
  • 将重磁异常相位谱主值换算到0~2π范围,依据相邻两点相位谱主值之差决定相位谱真值的校正项,达到相位谱复位
  • 计算机三级嵌入式学习笔记(二)

    千次阅读 多人点赞 2021-02-21 18:40:15
    其中UND和SWI异常(包括协处理器不存在异常)是互斥的,不可能同时发生,因此优先级是最高的,并不矛盾 复位异常的优先级最高,因此在任何情况下只要进入复位状态,系统便无条件地将PC指向0x00000000处,去执行系统...
  • ARM CPU的异常分为:复位异常、中断异常(IRQ,FIR)、预取指令中止异常、未定义指令异常、软件中断指令异常、数据中止访问异常。 1、复位异常  当CPU刚上电时或按下reset重启键之后进入该异常,该异常在管理模式...
  • STM32复位死机(无法启动)

    千次阅读 2020-08-11 10:43:00
    后续1: 死机的原因不是看门狗,而是所有复位操作(包括看门狗复位和软复位)都会导致死机,具体原因也不清楚,猜测是在晶振和复位引脚这一块,可能是复位信号与晶振引脚之间没清理干净,复位的时候让晶振停振了。...
  • 基于TSC695F处理器的星载计算机CPU异常复位问题研究.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,458
精华内容 11,783
关键字:

复位异常