SoC
  • Home
  • Arm
  • Arm Cortex M0/M0+
  • Arm Cortex M4
  • Arm Cortex M3
  • Contact
Reading: What are the exception numbers for the Cortex-M4 processor?
SUBSCRIBE
SoCSoC
Font ResizerAa
  • Home
  • Arm
  • Arm Cortex M0/M0+
  • Arm Cortex M4
Search
  • Home
  • Arm
  • Arm Cortex M0/M0+
  • Arm Cortex M4
Have an existing account? Sign In
Follow US
  • Looking for Something?
  • Privacy Policy
  • About Us
  • Sitemap
  • Contact Us
© S-O-C.ORG, All Rights Reserved.
Arm

What are the exception numbers for the Cortex-M4 processor?

Scott Allen
Last updated: October 5, 2023 9:56 am
Scott Allen 6 Min Read
Share
SHARE

The Cortex-M4 processor handles exceptions and interrupts using vector numbers. A vector number is assigned to each type of exception and allows the processor to quickly branch to the specific exception handler when an exception occurs. The vector numbers are useful for configuring the processor’s Nested Vectored Interrupt Controller (NVIC) and for writing exception handler functions.

Contents
ResetNMIHardFaultMemManageBusFaultUsageFaultSecureFaultSVCallPendSVSysTickExternal InterruptsConfiguring NVIC Vector PrioritiesUsage in SoftwareListing All Vector NumbersConclusion

Reset

The first vector number is for the reset exception. This exception occurs when the processor is reset and allows the processor to initialize and start executing code. The reset vector number is:

  • Vector #1: Reset

NMI

The Non-Maskable Interrupt (NMI) exception cannot be disabled by software. It is used for critical events like memory faults. The NMI vector number is:

  • Vector #2: Non-Maskable Interrupt (NMI)

HardFault

The HardFault exception handles fatal errors during exception processing. It indicates there is a defect in the program or its environment. The HardFault vector number is:

  • Vector #3: HardFault

MemManage

The MemManage exception occurs on memory protection faults, such as invalid memory access permissions. It is used if memory protection features are enabled. The MemManage vector number is:

  • Vector #4: MemManage

BusFault

The BusFault exception occurs on bus errors, such as invalid instruction fetches. It allows the processor to recover from bus faults. The BusFault vector number is:

  • Vector #5: BusFault

UsageFault

The UsageFault exception occurs on faults related to instruction execution, such as invalid instructions and illegal unaligned accesses. It assists debugging. The UsageFault vector number is:

  • Vector #6: UsageFault

SecureFault

The SecureFault exception supports Armv8-M Security Extensions. It occurs on secure faults when in the non-secure state. The SecureFault vector number is:

  • Vector #7: SecureFault

SVCall

The SVCall exception is triggered by the SVC instruction. It allows switching to privileged mode for OS kernel functions. The SVC vector number is:

  • Vector #11: SVCall

PendSV

The PendSV exception allows low priority interrupts to be handled. PendSV is triggered by software to force a context switch. The PendSV vector number is:

  • Vector #14: PendSV

SysTick

The SysTick exception handles the system tick timer. It allows real-time task management. The SysTick vector number is:

  • Vector #15: SysTick

External Interrupts

The external interrupt vectors allow external hardware to generate interrupts. Up to 240 external interrupt vectors can be configured, numbered #16 to #255. For example:

  • Vector #16: External Interrupt 0
  • Vector #17: External Interrupt 1
  • …
  • Vector #255: External Interrupt 239

Configuring NVIC Vector Priorities

The NVIC allows configuring priorities for the exception vectors. Higher priority vectors can preempt lower priority ones. The NVIC priorities do not correspond directly to vector numbers.

For example, Reset could have low priority while a time-critical external interrupt has high priority. The NVIC priority levels are numbered 0 (highest) to 255 (lowest). So Reset could have priority 200 while the time-critical interrupt has priority 0.

Usage in Software

Knowing the Cortex-M4 exception vector numbers allows properly configuring NVIC priorities and writing exception handler functions.

For example, an external interrupt handler would be written as:


void External_Interrupt_Handler(void) {
  // Handle interrupt
}

And in the startup code, the interrupt vector would be configured:


void External_Interrupt_Config(void) {

  // Set priority level
  NVIC_SetPriority(External_Interrupt, Priority_Level);

  // Enable interrupt
  NVIC_EnableIRQ(External_Interrupt);

} 

The vector number maps to the specific interrupt. This allows the correct handler to be called based on the exception vector number.

For system exceptions, the handlers can provide useful debugging information. For example, the HardFault handler may output the fault status registers to help identify the source of the fault:


void HardFault_Handler(void) {
  __asm("TST LR, #4");
  __asm("ITE EQ");
  __asm("MRSEQ R0, MSP");
  __asm("MRSNE R0, PSP");
  __asm("B print_fault_status");
}

void print_fault_status(uint32_t* hardfault_args) {
  // Print stacked fault status registers 
  // to debug exception
}

Listing All Vector Numbers

For easy reference, here is a compact list of all the Cortex-M4 exception vector numbers and their associated exceptions:

  • #1 Reset
  • #2 NMI
  • #3 HardFault
  • #4 MemManage
  • #5 BusFault
  • #6 UsageFault
  • #7 SecureFault
  • #8 Reserved
  • #9 Reserved
  • #10 Reserved
  • #11 SVCall
  • #12 Reserved
  • #13 Reserved
  • #14 PendSV
  • #15 SysTick
  • #16+ External Interrupt IRQ0
  • #17+ External Interrupt IRQ1
  • …
  • #255 External Interrupt IRQ239

Conclusion

In summary, the Cortex-M4 processor handles exceptions and interrupts using vector numbers from #1 to #255. Knowing the meaning behind these vectors helps configure interrupt priorities, write correct exception handlers, and debug processor faults. The vectors allow quick branching to specific exception handlers in response to external interrupts or internal processor exceptions. Overall, the vector numbers provide an important map between exception sources and their associated handler functions.

Newsletter Form (#3)

More ARM insights right in your inbox

 


Share This Article
Facebook Twitter Email Copy Link Print
Previous Article What is the stack frame of the ARM Cortex exception?
Next Article What is the stack pointer in the ARM Cortex-M4?
Leave a comment Leave a comment

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

2k Followers Like
3k Followers Follow
10.1k Followers Pin
- Sponsored-
Ad image

You Might Also Like

Tips on implementing Cortex-M1 on Artix-7 and Spartan-7

Implementing the Cortex-M1 CPU on Artix-7 and Spartan-7 FPGAs can…

5 Min Read

First ARM Processor

The first ARM processor was designed in 1985 by Acorn…

6 Min Read

Where is the interrupt vector table located in arm?

The interrupt vector table in ARM processors is located at…

7 Min Read

ARM Cortex M0 Assembly Instruction Set

The ARM Cortex-M0 is a 32-bit RISC processor optimized for…

7 Min Read
SoCSoC
  • Looking for Something?
  • Privacy Policy
  • About Us
  • Sitemap
  • Contact Us
Welcome Back!

Sign in to your account