<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Startup code and interrupt handlers in LPCXpresso IDE FAQs</title>
    <link>https://community.nxp.com/t5/LPCXpresso-IDE-FAQs/Startup-code-and-interrupt-handlers/m-p/473752#M108</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;H2&gt;&lt;SPAN style="color: #eb7a3d;"&gt;Overview&lt;BR /&gt;&lt;/SPAN&gt;&lt;/H2&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;When you create a project using the LPCXpresso IDE project wizard, the startup code generated (&lt;SPAN style="font-family: courier new,courier;"&gt;&lt;TT&gt;cr_startup_*.c&lt;/TT&gt;&lt;/SPAN&gt; or &lt;SPAN style="font-family: courier new,courier;"&gt;&lt;TT&gt;cr_startup_*.cpp&lt;/TT&gt;&lt;/SPAN&gt;) includes a vector table containing a set of default interrupt handlers, dependent upon the target MCU. For example, the following is taken from the vector table generated for the LPC11U6x:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #646464; font-family: Arial, sans-serif; font-size: 12px; padding: 5px 10px; background: #eeeeee;"&gt;&lt;SPAN style="font-family: courier new,courier; font-size: 12pt;"&gt;&lt;TT&gt;extern void (* const g_pfnVectors[])(void);&lt;BR /&gt;__attribute__ ((section(".isr_vector")))&lt;BR /&gt;void (* const g_pfnVectors[])(void) = {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;_vStackTop,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The initial stack pointer&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ResetISR,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The reset handler&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NMI_Handler,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The NMI handler&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HardFault_Handler,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The hard fault handler&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Reserved&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Reserved&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Reserved&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Reserved&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Reserved&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Reserved&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Reserved&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SVC_Handler,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // SVCall handler&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Reserved&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Reserved&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PendSV_Handler,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The PendSV handler&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SysTick_Handler,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The SysTick handler&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // LPC11U6x specific handlers&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIN_INT0_IRQHandler,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; 0 - GPIO pin interrupt 0&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIN_INT1_IRQHandler,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; 1 - GPIO pin interrupt 1&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIN_INT2_IRQHandler,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; 2 - GPIO pin interrupt 2&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&lt;/TT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The first entry is the value to be loaded automatically into the stack pointer register (r13) at reset. (The symbol normally used for this is generated by the linker script generated by LPCXpresso.)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The second entry is the address of the reset handler, &lt;SPAN style="font-family: courier new,courier;"&gt;&lt;TT&gt;&lt;CODE&gt;ResetISR&lt;/CODE&gt;&lt;/TT&gt;&lt;/SPAN&gt;, which is located elsewhere in the startup file. This address will be loaded into the program counter at reset (i.e. it will be where the MCU starts executing from).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;There are then a set of handlers, starting with &lt;SPAN style="font-family: courier new,courier;"&gt;&lt;TT&gt;NMI_Handler&lt;/TT&gt;&lt;/SPAN&gt; and ending with &lt;SPAN style="font-family: courier new,courier;"&gt;&lt;TT&gt;SysTick_Handler&lt;/TT&gt;&lt;/SPAN&gt; which are the standard default handlers for Cortex-M. The exact list will depend upon which Cortex part is being used, Cortex-M3/M4 implement more than Cortex-M0/M0+. For more details, please see ARM's Cortex documentation.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;These default handlers are defined higher up the startup file as weak:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #646464; font-family: Arial, sans-serif; font-size: 12px; padding: 5px 10px; background: #eeeeee;"&gt;&lt;STRONG style="font-size: 12pt; font-family: courier new,courier;"&gt;&lt;TT&gt;WEAK void SVC_Handler(void);&lt;/TT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;so that if your main application code provides a (non-weak) implementation of a handler function &lt;STRONG&gt;with exactly the same name&lt;/STRONG&gt;, this will be used instead of the default version contained in the startup code.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Finally, the vector table contains a list of MCU specific handlers. The exact number of these, and the interrupts that these implement will depend upon what MCU is being used. For details, please see the NXP User Manaual for the MCU that you are using.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Forward declaration of the MCU specific interrupt handlers are again provided for these higher up the startup file, for example:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #646464; font-family: Arial, sans-serif; font-size: 12px; padding: 5px 10px; background: #eeeeee;"&gt;&lt;STRONG style="font-size: 12pt; font-family: courier new,courier;"&gt;&lt;TT&gt;void PIN_INT0_IRQHandler (void) ALIAS(IntDefaultHandler);&lt;/TT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;These are weak and also aliased to the &lt;SPAN style="font-family: courier new,courier;"&gt;&lt;TT&gt;IntDefaultHandler&lt;/TT&gt;&lt;/SPAN&gt; lower down the startup code&lt;TT&gt; - &lt;/TT&gt;which is a "forever" loop.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Again, if your main application code provides a (non-weak) implementation of a particular interrupt handler function with exactly the same name, this will be used, rather than the&lt;SPAN style="font-family: courier new,courier;"&gt; &lt;TT&gt;IntDefaultHandler&lt;/TT&gt;&lt;/SPAN&gt; from the startup code.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;H2&gt;&lt;SPAN style="color: #eb7a3d;"&gt;Interrupt Handlers in C++ applications&lt;/SPAN&gt;&lt;/H2&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;One thing to be careful of is that if your application is a C++ one, then any interrupt handlers defined in C++ files within in your main application will need to have C linkage rather than C++ linkage. To do this, make sure that you are using &lt;SPAN style="font-family: courier new,courier;"&gt;&lt;TT&gt;extern "C" { .... }&lt;/TT&gt;&lt;/SPAN&gt; around the interrupt handler within your main application code.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;For more details, please see you favorite C++ text book, or an internet search will bring up lots of useful links - for example:&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;A _jive_internal="true" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FCompatibility_of_C_and_C%252B%252B%23Linking_C_and_C.2B.2B_code"&gt;http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B#Linking_C_an...&lt;/A&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 31 Mar 2016 22:37:42 GMT</pubDate>
    <dc:creator>lpcware-support</dc:creator>
    <dc:date>2016-03-31T22:37:42Z</dc:date>
    <item>
      <title>Startup code and interrupt handlers</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE-FAQs/Startup-code-and-interrupt-handlers/m-p/473752#M108</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;H2&gt;&lt;SPAN style="color: #eb7a3d;"&gt;Overview&lt;BR /&gt;&lt;/SPAN&gt;&lt;/H2&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;When you create a project using the LPCXpresso IDE project wizard, the startup code generated (&lt;SPAN style="font-family: courier new,courier;"&gt;&lt;TT&gt;cr_startup_*.c&lt;/TT&gt;&lt;/SPAN&gt; or &lt;SPAN style="font-family: courier new,courier;"&gt;&lt;TT&gt;cr_startup_*.cpp&lt;/TT&gt;&lt;/SPAN&gt;) includes a vector table containing a set of default interrupt handlers, dependent upon the target MCU. For example, the following is taken from the vector table generated for the LPC11U6x:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #646464; font-family: Arial, sans-serif; font-size: 12px; padding: 5px 10px; background: #eeeeee;"&gt;&lt;SPAN style="font-family: courier new,courier; font-size: 12pt;"&gt;&lt;TT&gt;extern void (* const g_pfnVectors[])(void);&lt;BR /&gt;__attribute__ ((section(".isr_vector")))&lt;BR /&gt;void (* const g_pfnVectors[])(void) = {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;_vStackTop,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The initial stack pointer&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ResetISR,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The reset handler&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NMI_Handler,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The NMI handler&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HardFault_Handler,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The hard fault handler&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Reserved&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Reserved&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Reserved&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Reserved&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Reserved&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Reserved&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Reserved&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SVC_Handler,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // SVCall handler&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Reserved&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Reserved&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PendSV_Handler,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The PendSV handler&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SysTick_Handler,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The SysTick handler&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // LPC11U6x specific handlers&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIN_INT0_IRQHandler,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; 0 - GPIO pin interrupt 0&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIN_INT1_IRQHandler,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; 1 - GPIO pin interrupt 1&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIN_INT2_IRQHandler,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; 2 - GPIO pin interrupt 2&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&lt;/TT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The first entry is the value to be loaded automatically into the stack pointer register (r13) at reset. (The symbol normally used for this is generated by the linker script generated by LPCXpresso.)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The second entry is the address of the reset handler, &lt;SPAN style="font-family: courier new,courier;"&gt;&lt;TT&gt;&lt;CODE&gt;ResetISR&lt;/CODE&gt;&lt;/TT&gt;&lt;/SPAN&gt;, which is located elsewhere in the startup file. This address will be loaded into the program counter at reset (i.e. it will be where the MCU starts executing from).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;There are then a set of handlers, starting with &lt;SPAN style="font-family: courier new,courier;"&gt;&lt;TT&gt;NMI_Handler&lt;/TT&gt;&lt;/SPAN&gt; and ending with &lt;SPAN style="font-family: courier new,courier;"&gt;&lt;TT&gt;SysTick_Handler&lt;/TT&gt;&lt;/SPAN&gt; which are the standard default handlers for Cortex-M. The exact list will depend upon which Cortex part is being used, Cortex-M3/M4 implement more than Cortex-M0/M0+. For more details, please see ARM's Cortex documentation.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;These default handlers are defined higher up the startup file as weak:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #646464; font-family: Arial, sans-serif; font-size: 12px; padding: 5px 10px; background: #eeeeee;"&gt;&lt;STRONG style="font-size: 12pt; font-family: courier new,courier;"&gt;&lt;TT&gt;WEAK void SVC_Handler(void);&lt;/TT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;so that if your main application code provides a (non-weak) implementation of a handler function &lt;STRONG&gt;with exactly the same name&lt;/STRONG&gt;, this will be used instead of the default version contained in the startup code.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Finally, the vector table contains a list of MCU specific handlers. The exact number of these, and the interrupts that these implement will depend upon what MCU is being used. For details, please see the NXP User Manaual for the MCU that you are using.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Forward declaration of the MCU specific interrupt handlers are again provided for these higher up the startup file, for example:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #646464; font-family: Arial, sans-serif; font-size: 12px; padding: 5px 10px; background: #eeeeee;"&gt;&lt;STRONG style="font-size: 12pt; font-family: courier new,courier;"&gt;&lt;TT&gt;void PIN_INT0_IRQHandler (void) ALIAS(IntDefaultHandler);&lt;/TT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;These are weak and also aliased to the &lt;SPAN style="font-family: courier new,courier;"&gt;&lt;TT&gt;IntDefaultHandler&lt;/TT&gt;&lt;/SPAN&gt; lower down the startup code&lt;TT&gt; - &lt;/TT&gt;which is a "forever" loop.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Again, if your main application code provides a (non-weak) implementation of a particular interrupt handler function with exactly the same name, this will be used, rather than the&lt;SPAN style="font-family: courier new,courier;"&gt; &lt;TT&gt;IntDefaultHandler&lt;/TT&gt;&lt;/SPAN&gt; from the startup code.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;H2&gt;&lt;SPAN style="color: #eb7a3d;"&gt;Interrupt Handlers in C++ applications&lt;/SPAN&gt;&lt;/H2&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;One thing to be careful of is that if your application is a C++ one, then any interrupt handlers defined in C++ files within in your main application will need to have C linkage rather than C++ linkage. To do this, make sure that you are using &lt;SPAN style="font-family: courier new,courier;"&gt;&lt;TT&gt;extern "C" { .... }&lt;/TT&gt;&lt;/SPAN&gt; around the interrupt handler within your main application code.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;For more details, please see you favorite C++ text book, or an internet search will bring up lots of useful links - for example:&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;A _jive_internal="true" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FCompatibility_of_C_and_C%252B%252B%23Linking_C_and_C.2B.2B_code"&gt;http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B#Linking_C_an...&lt;/A&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 31 Mar 2016 22:37:42 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE-FAQs/Startup-code-and-interrupt-handlers/m-p/473752#M108</guid>
      <dc:creator>lpcware-support</dc:creator>
      <dc:date>2016-03-31T22:37:42Z</dc:date>
    </item>
  </channel>
</rss>

