0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Cortex-M0+处理器的HardFault错误介绍

中颖电子 来源:中颖电子 2025-10-14 10:50 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1.HardFault介绍

ARM处理器中,如果一个程序产生了错误并且被处理器检测到,就会产生错误异常。Cortex-M0+处理器只有一种异常用以处理错误:HardFault。

HardFault,可重复且不可能恢复的故障。当它发生时,意味着微控制器出现了问题,并且需要采取修复错误。

2.HardFault错误是如何产生的

Cortex-M0+产生HardFault错误的类型主要有以下三种:

存储器相关:

-- 总线错误(可以是程序访问也可以是数据访问),在总线传输中使用非法地址会产生error;

-- 试图在标记为不可执行的存储器区域内执行程序;

-- 试图在系统控制空间中访问非特权访问等级的寄存器(非特权访问功能在M0+处理器中为可选功能);

-- 存储器访问和定义在存储器保护单元中的设置冲突(存储器保护单元在M0+处理器中为可选功能);

程序错误:

-- 未定义指令的执行;

-- 试图切换至ARM状态:Cortex-M0+处理器无ARM指令,正常情况下处理器不会切至ARM状态;

-- 试图进行非对齐存储器访问;

-- Cortex-M0+处理器支持的Thumb指令只能产生对齐访问,也就是说传输地址只能是传输大小的整数倍; 如字传输(32位)只能访问0x0/0x4/0x8/0xc之类的地址;

--通常情况下,使用C编译器不会产生任何非对齐访问(有编译器自动完成);如果C程序直接操作一个指针,则可能存在非对齐访问;

-- 使用汇编编程时,也可能会出现非对齐传输;

-- 当SVC异常优先级与当前的优先级相比相同或更小时,试图执行SVC指令;

-- SVC只能运行在线程模式或者比SVC自身优先级低的异常处理中(SVC一般在OS环境中使用),否则会触发硬件错误异常;

-- 执行异常返回时EXC_RETURN的值非法;

-- EXC_RETURN在Cortex-M0+处理器中的合法值为0xFFFFFFF1、0xFFFFFFF9、0xFFFFFFFD;

-- 当调试未使能时(没有连接调试器),试图执行断点指令(BKPT);

-- BKPT指令为调试过程中提供断点功能;

中颖芯片硬件模块操作异常:

-- Flash解锁寄存器写入值错误;

-- Flash解锁后,重新解锁;

-- DMA读取保留地址区或非法读写;

3.如何定位HardFault错误位置

当异常产生时,内核会做如下动作:

压栈并且栈指针(SP)更新;

处理器取出异常向量(确定ISR的起始地址)并将其写入R15(PC);

寄存器更新(LR、终端程序状态寄存器(IPSR)、NVIC)

当异常发生时,8个寄存器会被自动压栈,这些寄存器包括R0~R3、R12、R14(LR)、返回地址/PC和xPSR,压栈顺序如下表:

48992fc6-9dd4-11f0-8c8f-92fbcf53809c.png

可以通过解析进入Hard Fault中断后的寄存器值及入栈的寄存器值来定位出错位置,并找到问题点。

定位HardFault错误位置步骤如下:

48f70f2e-9dd4-11f0-8c8f-92fbcf53809c.png

4.举例说明如何定位HardFault错误位置

使用调试器(以MDK编译器为例)

--在工程中创建HardFault中断处理函数,并在其函数中添加硬件断点或断点指令(BKPT),当发生HardFault错误时,处理器会自动暂停到断点或断点指令处

;

495488a2-9dd4-11f0-8c8f-92fbcf53809c.png

-- 根据章节3中的HardFault错误分析流程,找到发生HardFault错误时的地址位置;

49af7fdc-9dd4-11f0-8c8f-92fbcf53809c.png

-- 结合程序分析具体出错原因。

无调试器 -- 当仿真口被占用时,需要通过串口或其他接口,提取并输出发生HardFault错误时的各调试信息; -- 下面以串口为例,说明如何实现调试信息的输出: -- 在startup_xxx.s启动文件的“HardFault_Handler”中做如下处理:

4a12d3e8-9dd4-11f0-8c8f-92fbcf53809c.png

-- 屏蔽C程序中的“HardFault_Handler”中断服务程序,增加栈数据输出函数“HardFault_Handler_c”,如下:

4a6ef11e-9dd4-11f0-8c8f-92fbcf53809c.png

-- 发生HardFault错误后,串口软件会输出当前寄存器及栈内的寄存器值,通过章节3中的HardFault错误定位流程,进一步分析错误原因。

4ad2c374-9dd4-11f0-8c8f-92fbcf53809c.png

5、如何避免产生Hard Fault

Ø给栈预留足够的空间:

-- 工程编译后,在生成的编译信息文件中,找到以工程名命名的.htm文件,此文件列出工程使用的栈最大长度(如下);

-- 一般在此基础上增加至少0.5倍(预留给中断服务程序及其临时变量),配置为栈大小;

Ø在C语言嵌套汇编代码时,请注意汇编指令是否存在非对齐情况;若存在,请增加NOP指令使其对齐;

Ø程序中不使用断点指令(BKPT);若调试过程中使用了断点指令,请在程序Release时屏蔽此断点指令;

Ø非OS应用,不使用SVC指令;

Ø正确配置芯片的硬件模块,避免引起HardFault错误。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    8249

    浏览量

    162266
  • 处理器
    +关注

    关注

    68

    文章

    20148

    浏览量

    246936
  • ARM
    ARM
    +关注

    关注

    135

    文章

    9499

    浏览量

    388555
  • Cortex
    +关注

    关注

    2

    文章

    220

    浏览量

    48392

原文标题:Cortex-M0+ HardFault错误介绍

文章出处:【微信号:SINO_25181447,微信公众号:中颖电子】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    ARM Cortex-M0Cortex-M0+到底有什么区别呢

    ARM Cortex-M0Cortex-M0+到底有什么区别呢
    发表于 01-04 23:15

    如何选择正确的Cortex-M处理器

    和普通的数据处理,这些指令已经足够了。这么小的指令集可以用很少的电路门数来实现处理器设计,Cortex-M0Cortex-M0+最小配置仅仅12K门。然而,其中的很多指令无法使用
    发表于 10-22 08:16

    ARM Cortex-M0+中断机制和中断编程步骤

    慕课苏州大学.嵌入式开发及应用.第二章.入门与软件框架.ARM Cortex-M0+中断机制和中断编程步骤0 目录2 入门与软件框架2.7 ARM Cortex-M0+中断机制和中断编程步骤
    发表于 11-08 09:10

    ARM Cortex-M0+内核定时

    慕课苏州大学.嵌入式开发及应用.第三章.基本模块.ARM Cortex-M0+内核定时 (Systic0 目录3 基本模块3.1 ARM Cortex-M0+内核定时
    发表于 11-08 06:36

    Cortex-M0+具有哪些指令?

    Cortex-M0+具有哪些指令?
    发表于 01-26 06:23

    ARM Cortex-M0+处理器数据表

    Cortex-M0+处理器建立在非常成功的Cortex-M0处理器的基础上,保持了完全的指令集和工具兼容性,同时进一步降低了能耗并提高了性能。 Co
    发表于 08-25 06:03

    Cortex-M0+——ARM推出全球最节能处理器

    ARM今天发布了一款拥有全球最高功耗效率的微处理器——ARM® Cortex™-M0+处理器。该款经过优化的Cortex-M0+
    发表于 03-15 09:04 1746次阅读
    <b class='flag-5'>Cortex-M0+</b>——ARM推出全球最节能<b class='flag-5'>处理器</b>

    ARM发布Cortex-M0+处理器号称世界最高效

    ARM今天宣布推出号称是“世界上能效最高的微处理器”,型号为“Cortex-M0+”,可为智能传感、智能控制系统提供优化的超低功耗、低成本单片机(MCU)
    发表于 03-20 08:51 1276次阅读

    飞思卡尔率先推出Cortex-M0+控制,为何投入ARM怀抱?

      飞思卡尔2012年3月份宣布了全新的基于ARM Cortex-M0+处理器的Kinetis L系列微控制(MCU),入门级Kinetis L系列MCU的首批试用样件计划于第二季度提供。这是业内率先推出基于CortexM
    发表于 04-25 15:01 1552次阅读

    关于最低功耗ARM Cortex-M0+的ARM处理器介绍

    这是世界上最低功耗的32位基於ARM Cortex-M0+的ARM处理器,针对可穿载应用(可支持基本触摸功能)和物联网的传感网络,一枚电池可运作长达十年。这个全新的超低功耗 Atmel
    的头像 发表于 07-08 01:05 8715次阅读

    Cortex-M0+指令集

    Cortex-M0+指令集Cortex M0+保留了Cortex-M0的全部56个指令。根据功能可以将Cortex-M0+
    发表于 12-01 13:06 18次下载
    <b class='flag-5'>Cortex-M0+</b>指令集

    cortex内核hardfault错误的定位方法实战

    单片机一般是cortex-m3之类的内核,其实其他内核也是一个道理。hardfault错误一般是操作了不该操作的内存,或者执行了不该执行的动作,例如一个非法的函数指针,你非要去调用。调试这个
    发表于 12-01 13:36 10次下载
    <b class='flag-5'>cortex</b>内核<b class='flag-5'>hardfault</b><b class='flag-5'>错误</b>的定位方法实战

    Cortex M0 HardFault诊断应用笔记

    电子发烧友网站提供《Cortex M0 HardFault诊断应用笔记.zip》资料免费下载
    发表于 09-22 10:22 0次下载
    <b class='flag-5'>Cortex</b> <b class='flag-5'>M0</b> <b class='flag-5'>HardFault</b>诊断应用笔记

    AN028 Cortex-M3内核HardFault错误调试定位方法

    AN028 Cortex-M3内核HardFault错误调试定位方法
    发表于 02-27 18:32 0次下载
    AN028 <b class='flag-5'>Cortex-M</b>3内核<b class='flag-5'>HardFault</b><b class='flag-5'>错误</b>调试定位方法

    Cortex-M0+内核介绍

    ARM Cortex-M0+是2012年3月14日ARM公司发布的一款低功耗效率、能效最高的ARM处理器,可用于存在设计约束的嵌入式应用。它具有最小的硅面积和极少的代码量,从而使开发人员能够以16
    的头像 发表于 03-27 09:13 2040次阅读
    <b class='flag-5'>Cortex-M0+</b>内核<b class='flag-5'>介绍</b>