当前位置:首页 > 单片机 > 单片机
[导读]1. 摘要 Cortex-M内核实现了一个高效异常处理模块,可以捕获非法内存访问和数个程序错误条件。本应用笔记从程序员角度描述Cortex-M Fault异常,并且讲述在软件开发周期中的Fault用法。 2. 简介 Cortex-M3(以下简

1. 摘要

Cortex-M内核实现了一个高效异常处理模块,可以捕获非法内存访问和数个程序错误条件。本应用笔记从程序员角度描述Cortex-M Fault异常,并且讲述在软件开发周期中的Fault用法。

2. 简介

Cortex-M3(以下简称CM3)和Cortex-M4(以下简称CM4)内核的Fault异常可以捕获非法内存方法和非法编程行为。Fault异常能够检测到以下情况:

总线Fault:在取址、数据读/写、取中断向量、进入/退出中断时寄存器堆栈操作(入栈/出栈)时检测到内存访问错误。

存储器管理Fault:检测到内存访问违反了MPU定义的区域。

用法Fault:检测到未定义的指令异常,未对齐的多重加载/存储内存访问。如果使能相应控制位,还可以检测出除数为零以及其他未对齐的内存访问。

硬Fault:如果上面的总线Fault、存储器管理Fault、用法Fault的处理程序不能被执行(例如禁能了总线Fault、存储器管理Fault、用法Fault异常或者在这些异常处理程序执行过程中又出现了Fault)则触发硬Fault。

本应用笔记描述CM3和CM4的Fault异常用法。系统控制寄存器组中的寄存器可以控制Fault异常或者提供引发异常的原因信息。

更深入的文档

完整的异常描述见《Cortex - M3 Technical Reference Manual》或者《Cortex -M4 Technical Reference Manual》,这两本参考手册都可以在www.arm.com中找到。

另一个很好的参考书是由Joseph Yiu编写的《The Definitive Guide to the ARM Cortex-M3》 (这本书有中文版:宋岩译的《ARM Cortex-M3权威指南》)。

3. Cortex-M Fault异常和寄存器

每个符合CMSIS规范的编译器所提供的启动文件(Startup_device)都会定义好设备所有的异常和中断向量。这些向量表定义了异常或中断处理程序的入口地址。下表给出了一个典型的向量表,Fault异常向量用蓝色标注。

::__VectorsDCD__initial_sp;栈顶DCDReset_Handler;复位处理程序入口DCDNMI_Handler;NMI处理程序入口DCDHardFault_Handler;硬Fault处理程序入口DCDMemManage_Handler;存储器管理处理程序入口DCDBusFault_Handler;总线Fault处理程序入口DCDUsageFault_Handler;用法Fault处理程序入口DCD0;保留::

通常总是使能硬Fault异常的,硬Fault异常具有固定的优先级,并且优先级高于其它Fault异常以及中断,但低于NMI。硬Fault异常处理程序在以下情况下会被执行:其它非硬Fault异常(非硬Fault异常是指总线、存储器管理和用法Fault 异常,下同。)被禁能,并且这些Fault异常被触发;在执行一个非硬Fault异常处理程序中又产生非硬Fault异常。

所有非硬Fault具有可编程的优先级。当Cortex-M内核复位后,这些非硬Fault被禁能,你可以在应用软件中通过设置“系统Handler控制及状态寄存器(SHCSR)”来使能非硬Fault异常。这个寄存器属于系统控制模寄存器组(SCB)

3.1 Fault异常的控制寄存器

在这里有必要介绍一下系统控制模块寄存器组(SCB)的成员,这个寄存器组的定义可以在core_cm3.h文件中,该文件属于CMSIS Cortex-M3 内核外设接口抽象层的一部分(关于不清楚CMSIS的,可以自行查找资料)。定义如下:

1.定义系统控制寄存器组结构体

/**@briefSystemControlBlock(SCB)registerstructuredefinition*/typedefstruct{__Iuint32_tCPUID;/*!

2. 定义系统控制寄存器组物理空间基地址

3. 定义指向系统控制寄存器组的指针

#defineSCB((SCB_Type*)SCB_BASE)/*!

通过以上三步,我们就可以使用结构体指针SCB来访问系统控制寄存器组的寄存器了,比如给系统控制寄存器SCR赋值:SCB->SCR=0xFF;

SCB->CCR寄存器控制除数为零和未对齐内存访问是否触发用法Fault。

SCB->SHCSR寄存器可用来使能非硬Fault异常。如果一个非硬Fault异常被禁能并且相关Fault发生,这时异常会升级为硬Fault。SCB->SHP寄存器组控制异常的优先级。

Fault异常控制寄存器列表:

地址/访问

寄存器

复位值

描述

0xE000ED14

RW 特权级

SCB->CCR

0x00000000

配置和控制寄存器:包含控制除数为零和未对齐内存访问是否触发用法Fault的使能位。

0xE000ED18

RW 特权级

SCB->SHP[12]

0x00

系统处理程序优先级寄存器:控制异常处理程序的优先级

0xE000ED24

RW特权级

SCB->SHCSR

0x00000000

系统处理程序控制和状态寄存器

3.1.1 SCB->CCR 寄存器

蓝色部分控制是否使能相应的用法Fault

名称

描述

[31:10]

-

保留

[9]

STKALIGN

表示进入异常时的堆栈对齐。

0:4字节对齐

1:8字节对齐

进入异常时,处理器使用压入堆栈的PSR位[9]来指示堆栈对齐。从异常返回时,这个堆栈位被用来恢复正确的堆栈对齐。

[8]

BFHFNMIGN

使能时,使得以优先级位-1或-2运行的处理程序忽略加载和存储指令引起的数据总线故障。它用于硬故障、NMI和FAULTMASK升级处理程序中:

0:加载和存储指令引起的数据总线故障会引起锁定。

1:以优先级-1或-2运行的处理程序忽略加载和存储指令引起的数据总线故障。

仅在处理程序和其数据处于绝对安全的存储器时将该位设为1。一般

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

  本文将介绍使用STM最新推出Cortex-M4内核的MCU配合基于SLLIMM-nano二代系列功率模块在冰箱上的FOC 单电阻无传感器应用。随着国家能效政策的大力推广,越来越多的电机应用如

关键字: cortex-m4 低功耗 sllimm系列

近日,东芝宣布推出新品——“M3H族”微控制器,该产品基于全球标准的Arm Cortex-M3内核,专为电机控制而设计,可满足消费设备和工业设备的各种需求。新产品的出现扩大了 “TXZ?系列”微控制器的产品阵容。

关键字: ARM cortex-m3 内核 微控制器 电源新品

已经是很久没有写文章了,因为没有时间,人家都说大四不考研,天天像过年,可我依旧没能有那份闲暇的时间。现在几乎人人的手里都是一款安卓智能机这是我非常羡慕的,而我手

关键字: adxl345 cortex-m3 单片机 电源技术解析 重力感应

1.1 启动代码内容1) 硬件初始化:最起码的是要初始化堆栈指针。2) C语言环境 :在main函数调用之前要完成对一些变量的初始化。3) 应用初始化: 这主要取决于你的应用。比如设置系统的晶振、时钟。1.2 图解M3启...

关键字: cortex-m3 启动代码

有時候切換了編譯方式如從ARMCC轉變為GCC編譯器,編譯下載時會出現Error:FlashDownloadfailed:-"Cortex-M3"這個錯誤。目前,自己測試解決的方式是:刪除相同目錄下的...

关键字: cortex-m3 error keil

在项目处于调试期间,Fault处理程序可能只是一个断点指令,调试器遇到这个指令后停止程序的运行。默认情况下,由于非硬Fault被禁能,所有发生的非Fault都会上访成硬Fault,因此只要在硬Fault处理程序中设...

关键字: cortex-m3 cortex-m4 fault fault处理函数

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

关键字: 4 cortex-m3 调试方法 hard fault

在编译下面一段代码时:STACK_TOPEQU0x20002000AREAReset,CODE,READONLYDCD0x20002000DCDStartENTRY;CODE16Startldrr2,=TestLDRD...

关键字: cortex-m3 keil编译 纯汇编 align地址

STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两...

关键字: cortex-m3 STM32 中断优先级

TM32笔记之八:来跟PC打个招呼,基本串口通讯a) 目的:在基础实验成功的基础上,对串口的调试方法进行实践。硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中。b) 初始化函数

关键字: cortex-m3 usb的
关闭
关闭