谈谈STM32(CM3)的Faults异常

发布者:tyloo820最新更新时间:2021-01-29 来源: eefocus关键字:STM32  CM3 手机看文章 扫描二维码
随时随地手机看文章

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 位来复位。这种只限于内核中的复位不会复位其它系统部件。


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


关键字:STM32  CM3 引用地址:谈谈STM32(CM3)的Faults异常

上一篇:STM32 IAP应用编程几个要点
下一篇:STM32片上外设时钟使能、失能和复位的区别

推荐阅读最新更新时间:2024-11-12 20:52

STM32助你轻松解码数字电源设计
如果把处理器和传感器分别比作是电子设备的“大脑”和“五官”,那么电源管理就是电子设备的“心脏”,其重要性不言而喻。 物联网时代,功能越来越强大的服务器、通信设备等产品推动了半导体工艺技术不断升级,体积小、性能强大的芯片要求电源管理IC能提供更智能的控制环路、更快速的动态响应、更高的电压反馈精度以及更简化的外围电路布局设计。 面对这些要求,拥有集成度高、快速响应、设计灵活、可控性强等优势的数字电源技术备受青睐。 如何定义数字电源? 数字电源,以数字信号处理器(DSP)或微控制器(MCU)为核心,将数字电源驱动器、PWM控制器等作为控制对象,能实现控制、管理和监测功能的电源产品。它是通过设定开关电源的内部参数来改变其外特性
[单片机]
<font color='red'>STM32</font>助你轻松解码数字电源设计
STM32 ----小谈FSMC RS选择
第一个角度理解STM32有FSMC(其实其他芯片基本都有类似的总线功能),FSMC的好处就是你一旦设置好之后,WR(写)、RD(读)、DB0-DB15这些控制线和数据线, 都是FSMC自动控制的。打个比方,当你在程序中写到: *(volatile unsigned short int *)(0x60000000)=val; 那么FSMC就会自动执行一个写的操作,其对应的主控芯片的WE、RD这些脚,就会呈现出写的时序出来(即WE=0,RD=1),数据val的值也 会通过DB0-15自动呈现出来(即FSMC-D0:FSMC-D15=val )。地址0x60000000会被呈现在数据线上(即A0-A25=0,地址线的对应最麻烦,
[单片机]
<font color='red'>STM32</font> ----小谈FSMC RS选择
STM32库中关于GPIO_PinRemapConfig函数的使用
对于初学习者来说为什么用到PB3和PB4时无法控制输出呢? 下面就这一问题进行分析讲解。 首先,STM32F10x系列的MCU复位后,PA13/14/15 & PB3/4默认配置为JTAG功能。有时我们为了充分利用MCU I/O口的资源,会把这些 端口设置为普通I/O口。具体方法如下: 在GPIO_Configuration(); // 配置使用的 GPIO 口: GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); // 改变指定管脚的映射 GPIO_Remap_SWJ_Disable,SWJ 完全禁用(JTAG+SW-DP),而且管脚映射函数,需要在GPIO配置函数GP
[单片机]
STM32串口通信printf重定向方法
在源程序中加入如下代码,包含“stdio.h”。 默认使用USART1,确认串口已经初始化成功、 #pragma import(__use_no_semihosting) _sys_exit(int x) { x = x; } struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output using printf() for debugging, no file handling */ /* is r
[单片机]
STM32的V3.5库Systick优先级设置的问题
以前的旧版本的库通过如下函数来设置Systick的优先级。但新的V3.5的库不含该函数,查询良久才得到答案,发现网上那个不少是错误的,误人子弟。 NVIC_SystemHandlerPriorityCon fig(SystemHandler_SysTick, 0, 0); 查询结果总结如下: 1. STM32中断优先级是使用4-bit来表示的,即总共有16个级别。 2. 优先级分为2个部分:抢先优先级和子优先级,上述的4个bit可以灵活分配给抢先优先级和子优先级,比如,1个bit表示抢先优先级,则剩余3个bit表示子优先级。固件库中对应的函数是:NVIC_PriorityGroupConfig()。 3. 中断分为内核中断和芯片(S
[单片机]
STM32单片机简介
1、STM32简介 STM32中的ST指的是意法半导体,M是Microelectronics的缩写,32表示32位,即意法半导体公司开发的32位微控制器。 2、stm32分类 3、stm32命名方式 根据对芯片的命名方式的解读及项目需要,就可以选择出我们所需要的芯片了。 4、stm32容量划分及代码占用容量计算 STM32的IC可以通过容量的不同进行划分,有小容量、中容量和大容量之分。 小容量IC指的是FLASH容量在16KByte到32KByte。 中容量IC指的是FLASH容量在64KByte到128KByte。 大容量IC指的是FLASH容量在256KByte到512KByte。 如何计算我们的代码占用多大的FL
[单片机]
<font color='red'>STM32</font>单片机简介
STM32学习笔记8——串口输出数据丢失问题
项目中采用STM32F103和AD7260进行数据采集。采集后想将数据通过串口逐点输出到上位机,然后查看数据是否正确。AD7260是采用外部中断进行采集的,当AD7260的BUSY输出下降沿后,触发外部中断,这时CPU去采集数据。 串口输出部分,我先是这么做的:在中断中采集数据的后面添加printf(串口已经重定向到printf函数)语句,每采集得到一个点后直接printf输出。上位机用软件SerialChart测试,发现数据经常丢失,或者出现一个很大的数(明显超出ADC的输出范围)。可初步断定,是串口输出部分出了问题。调试得出的结果很简单,但一开始走了很多弯路,如下: 1、先是感觉串口输出被外部中断打断,在网上查串口输出
[单片机]
STM32示波器 信号发生器
简介:关于stm32的示波器,网上以经有很多了。这里还是想把自己的设计思想发表出来。这个项目已经准备了很久。这里首先要感谢以前的团队,非常感觉陈师和覃总两位经验丰富的嵌入式工程师,获得了不少多方面的考虑。如果不是工作调整等原因,很有可能会出产品。但最后没有做完深感遗憾。这里发表下我的设计流程,希望能给做示波器的朋友有一定的帮助。也是让自己对此项目的一个总结。 本示波器有效测量频率0.1 ~ 100KHz 双通道 集成信号发生器 时间轴每格 1,2,5递增范围:2us ~ 1s 时间轴每屏12格 硬件结构: 主芯 stm32zet6 触摸屏 SSD1289 320*240 RGB565 AD: STM32内部ADC
[单片机]
<font color='red'>STM32</font>示波器 信号发生器
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved