【技术支持案例】S32K146的hard fault问题处理

这篇具有很好参考价值的文章主要介绍了【技术支持案例】S32K146的hard fault问题处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 案例背景

最近有个客户使用S32K146的产品在量产之后出现了三个售后件,ABBA测试之后的结果表明失效现象跟着S32K146走;同时客户反馈说试着将其中一个售后件重新烧录程序,S32K146又正常工作了。结合这两种情况,S32K146应该是没有损坏的,那就需要从软件程序方面排查了。

然后和客户的软件工程师交流了一下,使用Attaching to Running Target的方式发现程序卡死在HardFault。因为是量产产品出问题,客户强烈要求去现场处理问题,特地记录下这次处理S32K146的hard fault问题的过程,希望对读者有帮助。

2. 方案准备

在这之前,笔者还没有处理过S32K1系列发生HardFault的问题,所以需要先对S32K1系列发生HardFault的原因进行了解。推荐如下这篇文章,讲的非常细致。

  • S32K1xx系列MCU的常见内核异常(Fault Exception)及处理详解(以S32K144为例介绍)

结合上面这篇文章以及ARM官方的M4内核文档Cortex -M4 Devices Generic User Guide,笔者简要整理了下S32K1发生HardFault的可能原因以及排查方式,如下文所述。

2.1 HardFault(硬件错误异常)

  • HardFault的可能原因
    1. 停止调试关闭时发生了调试事件;
    2. UsageFault、BusFault、MemManage Fault未使能(Coretex-M4F内核默认状态)时发生了相应的错误导致错误升级到HardFault;
    3. 异常处理过程中取内核中断向量表读操作错误。
  • HardFault的原因排查
    造成HardFault的原因,可通过SCB模块的硬件错误状态寄存器(HFSR)进行排查,如下所示:
    • 原因1引起的,DEBUGEVT bit置1;
    • 原因2引起的,FORCED bit置1;
    • 原因3引起的,VECTTBL bit置1。

【技术支持案例】S32K146的hard fault问题处理,S32K1xx,Hard Fault

2.2 UsageFault(用法错误异常)

  • UsageFault的可能原因
    1. 执行未定义指令,即非法指令;
    2. 指令执行状态错误;
    3. 异常返回错误;
    4. 尝试访问关闭或者不可用的协处理器;
    5. 非对齐地址访问(需要先通过SCB模块的CCR寄存器进行使能);
    6. 除零操作(需要先通过SCB模块的CCR寄存器进行使能)。
  • UsageFault的原因排查
    造成UsageFault的原因,可通过SCB模块的用法错误状态寄存器(UFSR)进行排查,如下所示:
    • 原因1引起的,UNDEFINSTR bit置1;
    • 原因2引起的,INVSTATE bit置1;
    • 原因3引起的,INVPC bit置1;
    • 原因4引起的,NOCP bit置1;
    • 原因5引起的,UNALIGNED bit置1;
    • 原因6引起的,DIVBYZERO bit置1。

【技术支持案例】S32K146的hard fault问题处理,S32K1xx,Hard Fault

2.3 BusFault(总线错误异常)

  • BusFault的可能原因
    1. Crossbar总线矩阵slave端口返回错误响应,当:
      • a. 异常/中断入口压栈;
      • b. 异常/中断返回出栈;
      • c. 预取指;
      • d. FPU lazy state现场保护;
    2. 精确总线错误;
    3. 不精确总线错误。
  • BusFault的原因排查
    造成BusFault的原因,可通过SCB模块的总线错误状态寄存器(BFSR)进行排查,如下所示:
    • 原因1.a引起的,STKERR bit置1;
    • 原因1.b引起的,UNSTKERR bit置1;
    • 原因1.c引起的,IBUSERR bit置1;
    • 原因1.d引起的,LSPERR bit置1;
    • 原因2引起的,PRECISERR bit置1;
    • 原因3引起的,IMPRECISERR bit置1。

【技术支持案例】S32K146的hard fault问题处理,S32K1xx,Hard Fault

2.4 MemManage Fault(存储器管理错误异常)

  • MemManage Fault的可能原因
    1. 尝试加载和储存内核MPU保护的地址;
    2. 从内核MPU保护的地址取指;
    3. 由MPU违规引起的压栈和出栈(函数调用或者中断/异常处理)错误;
    4. 硬件FPU lazy state保护触发的MPU存储器保护违规。
  • MemManage Fault的原因排查
    造成MemManage Fault的原因,可通过SCB模块的存储器管理错误状态寄存器(MMFSR)进行排查,如下所示:
    • 原因1引起的,DACCVIOL bit置1;
    • 原因2引起的,IACCVIOL bit置1;
    • 原因3引起的,MSTKERR或MUNSTKERR bit置1;
    • 原因4引起的,MLSPERR bit置1;

【技术支持案例】S32K146的hard fault问题处理,S32K1xx,Hard Fault

UFSR、BFSR、MMFSR寄存器都是SCB模块中CFSR寄存器的子寄存器,包含关系如下,实际调试时查看CFSR寄存器即可。

【技术支持案例】S32K146的hard fault问题处理,S32K1xx,Hard Fault

如果要访问UFSR、BFSR、MMFSR这些子寄存器,可以按照如下的地址进行访问:

【技术支持案例】S32K146的hard fault问题处理,S32K1xx,Hard Fault

3. 现场支持

了解了引起HardFault的可能原因以及排查方式之后,就是按照该方法协助客户进行原因排查。

3.1 现场环境

客户的现场环境如下:

  • 开发环境:IAR 8.30.1
  • 调试器:Jlink V9
  • MCU:S32K146
  • SDK:EAR0.8.6

3.2 排查过程

  1. 打开和异常件对应的软件工程,使用Attach方式连接上第一个异常件的主控S32K146,如下图所示:
    【技术支持案例】S32K146的hard fault问题处理,S32K1xx,Hard Fault
  2. 进入仿真界面后,暂停之后发现程序卡死在hard fault。
  3. 查看S32的SCB模块,HFSR寄存器的FORCED bit置1,说明是其它错误上升到hard fault,需要查看CFSR寄存器了解更多信息。
    【技术支持案例】S32K146的hard fault问题处理,S32K1xx,Hard Fault
  4. CFSR寄存器的BFARVALID bit 和PRECISERR bit都置1,说明是精确总线错误造成bus fault并且捕捉保存了精确总线错误发生时的数据访问地址;再去查看BFAR寄存器,发生错误时数据访问的地址是0x100010E8。
    【技术支持案例】S32K146的hard fault问题处理,S32K1xx,Hard Fault
  5. 使用同样的方法排查第二个异常件的主控MCU,也是精确总线错误造成的bus fault,发生错误时数据访问的地址是0x10001128。
    【技术支持案例】S32K146的hard fault问题处理,S32K1xx,Hard Fault
  6. 接着通过IAR查看下S32K146的memory,从地址0x10001128起始的8个字节长度的flash区域数据无法查看。
    【技术支持案例】S32K146的hard fault问题处理,S32K1xx,Hard Fault
  7. 翻阅S32K1的memory相关的应用笔记AN11983: Using the S32K1xx EEPROM Functionality – Application Note,发生错误的地址属于D-Flash,如下图所示:

【技术支持案例】S32K146的hard fault问题处理,S32K1xx,Hard Fault

  1. 查阅软件代码中读写DFlash中这块地址的函数,发现在写DFLASH之前虽然进行了擦写操作,但是并没有设置擦写成功之后才能写DFlash的条件,有概率出现擦写不完全的情况下写D-Flash。同时,客户查看了其他组未出问题的产品的软件代码,在写D-Flash之前添加了比较多的条件判断,包含对擦写状态的判断。至此,该问题初步得到解决,剩下的就是优化代码并跟进后续产品的表现了。

4. 异常模拟

客户的问题虽然解决了,但是笔者还是不确定连续两次对同一块区域的Flash写不同的值,中间没有擦除动作,是否会让MCU卡在HardFault,所以使用手上的S32K144开发板进行了该情况的模拟。

4.1 测试环境

  • 开发环境:S32 Design Studio for ARM 2.2
  • SDK:RTM 3.0.0
  • 开发板:S32K144EVB-Q100

4.2 测试过程

  1. 打开S32DS 2.2,选择自带的例程flash_partitioning_s32k144
    【技术支持案例】S32K146的hard fault问题处理,S32K1xx,Hard Fault
  2. 将初始化模拟EEPROM的部分注释掉,避免D-Flash被用作模拟EEPROM的备份区从而无法进行读写测试。
    【技术支持案例】S32K146的hard fault问题处理,S32K1xx,Hard Fault
  3. 定义一套新数组并储存新的数据用于测试。
    【技术支持案例】S32K146的hard fault问题处理,S32K1xx,Hard Fault
  4. 在正常的D-Flash写之后增加写入不同数据的操作。
    【技术支持案例】S32K146的hard fault问题处理,S32K1xx,Hard Fault
  5. 编译之后进行debug,单步调试发现如果只进行写不同数据进入D-Flash,S32K144不会进入HardFault,需要再执行读D-Flash的操作,才会进入HardFault。
    【技术支持案例】S32K146的hard fault问题处理,S32K1xx,Hard Fault

需要读取Flash地址的数据才会发生HardFault的原因,建议阅读下面这篇文章:

  • S32K1xx系列MCU应用指南之存储器ECC功能使用详解(二)
  1. S32DS之所以能在控制台显示比较多的MCU异常信息,是因为在调试器界面使能了异常捕捉功能,这部分功能依赖的是DEMCR寄存器,如下图所示。

【技术支持案例】S32K146的hard fault问题处理,S32K1xx,Hard Fault

【技术支持案例】S32K146的hard fault问题处理,S32K1xx,Hard Fault

更多关于DEMCR寄存器的描述,可以查看如下这篇文档:

  • Armv7-M Architecture Reference Manual

如果觉得这篇文章对你有用,不妨给个一键三连!!!文章来源地址https://www.toymoban.com/news/detail-702970.html

到了这里,关于【技术支持案例】S32K146的hard fault问题处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • S32K FTM(FlexTimer module)详解

    S32K FTM(FlexTimer module)详解

    FTM(FlexTimer)是由一个简单的定时器——HCS08 定时器 PWM(TPM)模块建立而来的,在飞思卡尔 8bit 微控制器上已经使用多年。Flextimer模块应用领域包括马达控制,照明控制和电源等。 FTM是一个2到8通道定时器,支持输入捕获,输出比较,pwm信号发生和正交解码功能。 FTM source

    2024年02月08日
    浏览(10)
  • S32K系列MCU介绍和资料搜集

    S32K系列MCU介绍和资料搜集

    S32K系列微控制器,是NXP推出的专门面向汽车电子和工业应用场合的微控制器。基于Arm®Cortex®-M系列的可扩展、低功耗微控制器,获得了AEC-Q100认证,具有高级功能安全、信息安全和软件支持,适用于工业和汽车ASIL B/D车身、区域控制和电气化应用。 S32K系列MCU有多个系列型号,

    2024年02月15日
    浏览(6)
  • S32K ADC配置详解 EB tresos

    S32K ADC配置详解 EB tresos

    ADC配置详解 涉及模块:MCU、PORT、ADC MCU ADC功能模块需要在MCU进行使能,312有两个ADC模块(ADC0和ADC1),需要用到哪些ADC资源,就在MCU对应位置进行使能。新增MCU modesettingcof时,peripheral内容为空,点击Add required elements即可添加基本的外设模块 一般来说MCU主要功能为配置时钟和

    2024年02月07日
    浏览(9)
  • S32K142 MCU锁死解锁

    S32K142 MCU锁死解锁

    本文主要介绍S32K142 MCU锁死(Jlink报错:0x400-0x40F indicate that readout p’rotection is set)的原因简介以及如何使用 J-Link Commander 工具解🔒。 一、故障现象 二、原因分析 基于S32K144的芯片锁死,一般有如下几种可能:   1. 时钟配置异常 ,MCU被倍频以及不配置时钟,都有可能造成

    2024年02月04日
    浏览(11)
  • S32K3学习笔记---S32K3之MCU模块

    S32K3学习笔记---S32K3之MCU模块

    ​ 后续关于MCAL的配置都是基于EB29.0,RTD3.0的配置,MCU是基于S32K324。前期312、344也都使用过,也是第一次使用NXP的多核,后续将记录各个模块学习过程。 环境安装及参考资料如下: ​ 芯片手册:S32K3XXRM.pdf ​ EB工具 :EB29.0安装包 ​ RTD及demo路径:RTD3.0和Demo ​ EB安装步骤:

    2024年02月03日
    浏览(12)
  • S32K3系列 --- MCU(Clock) Mcal配置

            很多工程师其实并不太会过多的关注Clock的配置,本身我对Clock的了解也不是特别多,但是还是觉得想去了解一下,因为在其他的配置过程中,我遇到了很多错误,都是由于Clock的配置引起的问题,这里过一个简单的记录。 FIRC :Fast Internal RC Oscillator         芯

    2024年02月20日
    浏览(6)
  • S32K3 MCAL配置之GPT 基于EBtresos

    S32K3 MCAL配置之GPT 基于EBtresos

    GPT GPT可以为系统配置定时器通道给需要定时功能的模块,比如OS需要一个时间刻度来周期执行TASK; 计时器按照用户设置进行计时,达到预定的时间通过中断通知系统,系统可在通知函数内进行服务调度; 涉及模块:GPT MCU Platform 在GptChannelConfiguration添加GPT通道 双击GPT通道进

    2024年02月02日
    浏览(9)
  • S32K3XX单片机DMA原理深度解析

    S32K3XX单片机DMA原理深度解析

    首先我们需要了解,什么是 DMA ? DMA 的中文名称叫做 直接内存访问 ( Direct Memory Access ),是一种不需要CPU参与,就能实现数据传输的技术(从一个地址空间到另一个地址空间)。也就是说,在不需要 CPU 插手的情况下,完成内存与外存之间的数据传输,从而 CPU 可以被解放

    2024年02月04日
    浏览(7)
  • 【Autosar】MCAL - MCU(NXP - S32K14x)

    【Autosar】MCAL - MCU(NXP - S32K14x)

    MCAL - 汇总 配置工具:EB Tresos Studio 芯片类型:S32K146 MCU模块提供了访问 内核 相关功能的API,例如配置时钟、初始化RAM、设置低功耗模式、提供复位接口等。 1.1 时钟介绍 从上图可以看到最左边为输入时钟源,右边为输出时钟 ,为了让系统运行在合适的时钟频率环境下,我们

    2024年02月04日
    浏览(30)
  • S32K3系列 --- 硬件I2C Mcal配置

    S32K3系列 --- 硬件I2C Mcal配置

    网上看到很多I2C的教程,基本都是模拟I2C,现在S32K3的芯片支持硬件I2C,我想着就配一个硬件的出来吧,这边记录一下,供大家学习。 这里主要教大家如何去配置,去使用。 原理的话可以参考这篇文章: 一文搞懂I2C通信总线_i2c通信的详细讲解-CSDN博客 I2C时序 这里我们用I2C与

    2024年01月18日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包