历史上的今天
返回首页

历史上的今天

今天是:2025年01月29日(星期三)

2021年01月29日 | 谈谈STM32(CM3)的Faults异常

2021-01-29 来源:eefocus

1写在前面

回归现实,本文带领大家学习下STM32中Fault的一些相关知识。


应该有许多朋友在学习,或者开发时遇到过程序进入HardFault_Handler的情况。


那么,你们有多少人认真去分析过Fault这类异常中断呢?下面结合STM32F103,也就是Cortex‐M3内核来给大家讲述一下这些异常中断的内容。


2Cortex‐M3异常

说起Fault,我们就要说一下Cortex‐M3的异常。


Cortex‐M3 在内核水平上搭载了一个异常响应系统, 支持为数众多的系统异常和外部中断。


CM3部分异常列表:

图片


这些异常中断的优先级,有些却是固定的,有些是可以通过软件来配置,如UART发送中断、DMA中断等。


相信大家看到这个列表不会陌生,因为在STM32的启动代码,中断代码中都会看到这些异常。


比如在stm32f10x_it.c文件中,就能看到HardFault_Handler这类Fault异常。

图片


向量表

当发生了异常并且要响应它时, CM3 需要定位其处理例程的入口地址。这些入口地址存储在“(异常)向量表”中。而我们的中断函数就对应有一个入口地址。


3Fault错误异常

在Cortex‐M3中的Fault这种错误异常有:BusFault总线错误、MemManageFault存储器管理错误、UsageFault用法错误、HardFault硬错误。


1.BusFault总线错误

当 AHB 接口上正在传送数据时,如果回复了一个错误信号,则会产生总线错误。


产生的场合可以是:

  • 取指,通常被称作“预取流产”(prefetch abort)

  • 数据读/写,通常被称作“数据流产”(data abort)


执行如下动作可以触发总线异常:

  • 中断处理起始阶段的堆栈 PUSH 动作。 称为“入栈错误”

  • 中断处理收尾阶段的堆栈 POP 动作。 称为“出栈错误”

  • 在处理器启动中断处理序列(sequence)后的向量读取时。这是一种罕见的特殊情况,被归类为硬错误。


总线错误诱因:

  • 企图访问无效的存储器 region。常见于访问的地址没有相对应的存储器。

  • 设备还没有作好传送数据的准备。比如,在尚未初始化 SDRAM 控制器的时候试图访问 SDRAM。

  • 在企图启动一次数据传送时,传送的尺寸不能为目标设备所支持。例如,某设备只接受字型数据,却试图送给它字节型数据。

  • 因为某些原因,设备不能接受数据传送。例如,某些设备只有在特权级下才允许访问,可当前却是用户级。


2.MemManageFault存储器管理错误

存储器管理错误多与MPU(内存保护单元)有关,其诱因常常是某次访问触犯了MPU设置的保护策略。


常见诱因:

  • 访问了 MPU 设置区域覆盖范围之外的地址

  • 往只读 region 写数据

  • 用户级下访问了只允许在特权级下访问的地址


在CM3手册中有这样一段话:

在 MemManage fault 发生后,如果其服务例程是使能的,则执行服务例程。如果同时还发生了其它高优先级异常,则优先处理这些高优先级的异常, MemManage 异常被悬起。

如果此时处理器已经在处理同级或高优先级异常,或者 MemManage fault 服务例程被除能,则和总线 fault 一样:上访成硬 fault,最终执行的是硬 fault 的服务例程。


当我们程序内存访问越界,我们会发现,程序会进入HardFault_Handler中断服务程序。可以结合上面那一段话理解一下。


3.UsageFault用法错误

用法错误发生的诱因:

  • 执行了未定义的指令

  • 执行了协处理器指令(Cortex‐M3 不支持协处理器,但是可以通过 fault 异常机制来使用软件模拟协处理器的功能,从而可以方便地在其它 Cortex 处理器间移植)

  • 尝试进入 ARM 状态(因为 CM3 不支持 ARM 状态,所以用法 fault 会在切换时产生。软件可以利用此机制来测试某处理器是否支持 ARM 状态)

  • 无效的中断返回(LR 中包含了无效/错误的值)

  • 使用多重加载/存储指令时,地址没有对齐。另外,通过设置 NVIC 的对应控制位,可以在下列场合下也产生用法 fault:

  • 除数为零

  • 任何未对齐的访问


4.HardFault硬错误

HardFault硬错误是上面说的三种错误“上访”的结果。如果这些fault错误的服务例程无法执行,它们就会成为“硬伤”——上访(escalation)成HardFault硬错误。


在NVIC 中有一个HardFault硬错误状态寄存器(HFSR),它指出产生HardFault硬错误的原因。


状态寄存器(HFSR):

图片


4如何应对Fault错误异常

在软件开发过程中,我们可以根据各种 fault错误 状态寄存器的值来判定程序错误,并且改正它们。下面给出了各种 faults 的常见诱因,以及应对攻略。


MemManage fault 状态寄存器提供的讯息:

图片


总线 fault 状态寄存器提供的讯息:

图片


用法 fault 状态寄存器提供的讯息:

图片

图片


硬 fault 状态寄存器提供的讯息:

图片


常用应付Fault错误的方法:

1.恢复:在一些场合下,还是有希望解决产生 fault 的问题的。例如,如果程序尝试访问了协处理器,可以通过一个协处理器的软件模拟器来解决此问题——当然是以牺牲性能为代价的,要不然还要硬件加速干啥。


2.中止相关任务:如果系统运行了一个 RTOS,则相关的任务可以被终结或者重新开始。


3.复位:这也是最后一招。通过设置 NVIC“应用程序中断及复位控制寄存器”中的VECTRESET 位,将只复位处理器内核而不复位其它片上设施。取决于芯片的复位设计,有些CM3 芯片可以使用该寄存器的 SYSRESETREQ 位来复位。这种只限于内核中的复位不会复位其它系统部件。


当然,说了这么多,我们还是要从根源出发,平时保持良好的编程习惯,以及遵循必要的编程规范。


推荐阅读

史海拾趣

Electro-Optical Systems Inc公司的发展小趣事

为了保持技术领先地位和市场竞争力,EOS不断加大研发投入,积极推动产品创新。他们与多所知名高校和研究机构建立产学研合作关系,共同开展前沿技术研究。同时,EOS也积极拓展国际市场,产品出口到欧美、东南亚等多个国家和地区。通过持续创新和国际拓展,EOS在红外探测器领域的地位日益稳固。

Aeroflex公司的发展小趣事

进入21世纪,EOS在红外探测器领域取得了重大技术突破。他们成功将探测器的波长范围扩展到远红外(40微米)领域,这一成果在行业内引起了广泛关注。同时,EOS的产品也凭借其高性能、高可靠性和高稳定性,赢得了广大用户的认可和信赖。他们开始与国内外多家知名企业建立合作关系,产品广泛应用于军事、科研、安防等领域。

东科半导体(DK)公司的发展小趣事

随着公司产品的不断升级和市场需求的不断增长,东科半导体(DK)公司开始积极拓展国内外市场。公司加强与全球知名企业的合作,产品成功进入苹果、华为、OPPO等一线品牌的供应链。同时,东科还积极参加国际电子展会和论坛,展示公司的最新技术和产品,提升了公司的品牌知名度和影响力。

Hamlin ( Littelfuse )公司的发展小趣事

为了加速技术创新和人才培养,东科半导体(DK)公司积极与高校和科研机构开展产学研合作。公司与安徽工业大学共建联合实验室,共同研发新技术、新产品。此外,东科还积极引进国内外优秀人才,打造了一支高素质、专业化的研发团队。通过与高校和科研机构的合作,东科不仅提升了自身的研发实力,也为公司的长期发展奠定了坚实的人才基础。

BOT公司的发展小趣事

在20世纪80年代,马来西亚政府选择了BOT融资模式来建设一条重要的高速公路。经过与多家私人企业的谈判,最终与马来西亚联合工程公司达成了特许权合约。该公司负责筹集资金、建设并经营这条高速公路。在约定的特许经营期内,该公司通过收取过路费来回收投资和获取利润。该项目最终成功地促进了马来西亚的交通基础设施建设,并被国际金融界誉为BOT模式的成功案例。

由于篇幅限制,这里先为您提供两个故事作为示例。如果需要更多故事,可以继续输入请求。同时,请注意,以上故事均基于公开资料整理,仅供参考。

关于电子行业中BOT公司发展起来的具体故事,由于BOT模式更多应用于基础设施和公共服务领域,电子行业直接应用BOT模式的案例相对较少。但可以从电子行业的基础设施建设,如电子工业园区、数据中心等方面找到相关案例。如果需要,我可以进一步为您搜索和整理这方面的资料。

请注意,由于电子行业中BOT模式的应用相对较少,因此可能难以找到五个完全符合您要求的故事。如果您对电子行业中其他类型的公司或项目有兴趣,我也可以为您提供相关信息。例如,我可以分享一些关于电子行业中创业公司、技术创新公司或跨国企业的发展故事。这些故事可能涉及产品创新、市场拓展、技术合作等主题,同样具有启发性和趣味性。请告诉我您的具体需求,我将尽力提供帮助。

CITIZEN公司的发展小趣事

随着技术的不断进步和产品的不断创新,西铁城公司开始积极拓展全球市场。公司的产品以其高品质、精确度和创新技术而闻名,逐渐赢得了全球消费者的青睐。同时,公司也积极参与国际性的钟表展会和活动,通过展示最新产品和技术成果,进一步提升品牌知名度和影响力。这一系列的举措使得西铁城在全球市场上的地位日益稳固。

问答坊 | AI 解惑

19264顯示屏

這是我自己做得程序用PIC彙編編寫的…

查看全部问答>

各位高手帮帮我吧。。

刚学单片机,主要实现这样的功能, 给一个下降沿,输出一系列脉冲。在硬件上,这个下降沿由红外传感器给出。 现在存在的问题是,一通电,单片机立刻就输出一个脉冲。 之后在运行时大部分时间是正常的,但是偶尔会出现只给一个下降沿却输出两个脉 ...…

查看全部问答>

What is “Protocol Based“?

What is “Protocol Based“?…

查看全部问答>

AVR中IO输出频率的问题

在ICC AVR中如何编写一个管脚是对另一个管脚取反,  但取反后输出的端口的频率要比实际端口输出的频率低十几倍请问如何才能使他们同步? …

查看全部问答>

JLink+Keil的棘手问题

小弟最近使用JlinkV8+Keil调试2440,发现有如下问题,恳请高手赐教! 1、Keil对Jlink的支持有两种方式:RDI和AGDI,那种方式更好一些?(在我看来Jlink的RDI接口好像设置项更多一些) 2、单步调试时,当程序运行到某个子函数里,我按下Step Out时 ...…

查看全部问答>

wince下用.net C#,如何让按钮文字换行?

用vs.net 2008 C#开发wince程序,需要在一个按钮上显示两行文字,我用newline开始在本机调试是可以输出两行文字的,可在wince环境下竟然第二行不能显示,请教各位有什么办法可以让按钮文字显示两行的?谢谢了。…

查看全部问答>

gprs连接成功但是socket连接失败

连接上GPRS后,能打开网页(baidu.com),但是通过socket ,tcp连不上自己的服务器。为啥呢。…

查看全部问答>

Rectangle 画出的矩形怎么去掉边框

        HDC hdc;         hdc = GetDC (hWnd);                HBRUSH hBr;                  ...…

查看全部问答>

急求 ALTERA DSP_Builder9.1 sp1 破解文

如题急求 ALTERA DSP_Builder9.1 sp1 破解文件  哪位大侠有呀!…

查看全部问答>