]> rtime.felk.cvut.cz Git - arc.git/commitdiff
Much more work on Cortex-R4 port.
authormaek <devnull@localhost>
Wed, 20 Oct 2010 15:14:49 +0000 (17:14 +0200)
committermaek <devnull@localhost>
Wed, 20 Oct 2010 15:14:49 +0000 (17:14 +0200)
15 files changed:
arch/arm/arm_cr4/drivers/Mcu.c
arch/arm/arm_cr4/drivers/can.c [new file with mode: 0644]
arch/arm/arm_cr4/drivers/can.h [new file with mode: 0644]
arch/arm/arm_cr4/kernel/arch.c
arch/arm/arm_cr4/kernel/arch_krn.sx
arch/arm/arm_cr4/kernel/core_cm3.c [deleted file]
arch/arm/arm_cr4/kernel/core_cm3.h [deleted file]
arch/arm/arm_cr4/kernel/core_cr4.h [new file with mode: 0644]
arch/arm/arm_cr4/kernel/irq.c
arch/arm/arm_cr4/kernel/irq_types.h
arch/arm/arm_cr4/kernel/startup_cr4.s
arch/arm/arm_cr4/kernel/sys_core.asm [new file with mode: 0644]
arch/arm/arm_cr4/kernel/sys_tick.c
arch/arm/arm_cr4/scripts/gcc.mk
arch/arm/arm_cr4/scripts/linkscript_gcc.ldf

index ad41e1d3583a0a3b47eedec070eebe96e597be96..1648f5ba2e8e1b7fab66d2f9b0a4c7ecc87c8fc0 100644 (file)
@@ -25,6 +25,8 @@
 #include <string.h>\r
 #include "Ramlog.h"\r
 \r
+#include "core_cr4.h"\r
+\r
 //#define USE_TRACE 1\r
 //#define USE_LDEBUG_PRINTF 1\r
 #include "debug.h"\r
 \r
 #define CORE_CPUID_CORTEX_M3           0x411FC231UL\r
 \r
-\r
-\r
 typedef struct {\r
        uint32 lossOfLockCnt;\r
        uint32 lossOfClockCnt;\r
 } Mcu_Stats;\r
 \r
+\r
+\r
+\r
+\r
+\r
 /**\r
  * Type that holds all global data for Mcu\r
  */\r
@@ -203,7 +208,79 @@ Std_ReturnType Mcu_InitRamSection(const Mcu_RamSectionType RamSection)
 \r
 Std_ReturnType Mcu_InitClock(const Mcu_ClockType ClockSetting)\r
 {\r
-\r
+    /** @b Initialize @b Pll: */\r
+\r
+    /** - Setup pll control register 1:\r
+    *     - Setup reset on oscillator slip\r
+    *     - Setup bypass on pll slip\r
+    *     - Setup Pll output clock divider\r
+    *     - Setup reset on oscillator fail\r
+    *     - Setup reference clock divider\r
+    *     - Setup Pll multiplier\r
+    */\r
+       systemREG1->PLLCTL1 =  0x00000000U\r
+                               |  0x20000000U\r
+                               | (1U << 24U)\r
+                               |  0x00000000U\r
+                               | (4U << 16U)\r
+                               | (119U  << 8U);\r
+\r
+    /** - Setup pll control register 1\r
+    *     - Enable/Disable frequency modulation\r
+    *     - Setup spreading rate\r
+    *     - Setup bandwidth adjustment\r
+    *     - Setup internal Pll output divider\r
+    *     - Setup spreading amount\r
+    */\r
+    systemREG1->PLLCTL2 = 0x00000000U\r
+                        | (255U << 22U)\r
+                        | (0U << 12U)\r
+                        | (1U << 9U)\r
+                        |  61U;\r
+\r
+\r
+    /** @b Initialize @b Clock @b Tree: */\r
+\r
+    /** - Start clock source lock */\r
+    systemREG1->CSDIS = 0x00000040U\r
+                      | 0x00000000U\r
+                      | 0x00000000U\r
+                      | 0x00000008U\r
+                      | 0x00000004U\r
+                      | 0x00000000U\r
+                      | 0x00000000U;\r
+\r
+    /** - Wait for until clocks are locked */\r
+    while ((systemREG1->CSVSTAT & ((systemREG1->CSDIS ^ 0xFF) & 0xFF)) != ((systemREG1->CSDIS ^ 0xFF) & 0xFF));\r
+\r
+    /** - Setup GCLK, HCLK and VCLK clock source for normal operation, power down mode and after wakeup */\r
+    systemREG1->GHVSRC = (SYS_PLL << 24U)\r
+                       | (SYS_PLL << 16U)\r
+                       |  SYS_PLL;\r
+\r
+    /** - Power-up all peripharals */\r
+    pcrREG->PSPWRDWNCLR0 = 0xFFFFFFFFU;\r
+    pcrREG->PSPWRDWNCLR1 = 0xFFFFFFFFU;\r
+    pcrREG->PSPWRDWNCLR2 = 0xFFFFFFFFU;\r
+    pcrREG->PSPWRDWNCLR3 = 0xFFFFFFFFU;\r
+\r
+    /** - Setup synchronous peripheral clock dividers for VCLK1 and VCLK2 */\r
+    systemREG1->VCLKR  = 15U;\r
+    systemREG1->VCLK2R = 1U;\r
+    systemREG1->VCLKR  = 1U;\r
+\r
+    /** - Setup RTICLK1 and RTICLK2 clocks */\r
+    systemREG1->RCLKSRC = (1U << 24U)\r
+                        | (SYS_VCLK << 16U)\r
+                        | (1U << 8U)\r
+                        |  SYS_VCLK;\r
+\r
+    /** - Setup asynchronous peripheral clock sources for AVCLK1 and AVCLK2 */\r
+    systemREG1->VCLKASRC = (SYS_FR_PLL << 8U)\r
+                         |  SYS_VCLK;\r
+\r
+    /** - Enable Peripherals */\r
+    systemREG1->PENA = 1U;\r
   return E_OK;\r
 }\r
 \r
@@ -219,9 +296,11 @@ void Mcu_DistributePllClock(void)
 \r
 Mcu_PllStatusType Mcu_GetPllStatus(void) {\r
 \r
-       Mcu_PllStatusType rv;\r
+       if ((systemREG1->CSVSTAT & ((systemREG1->CSDIS ^ 0xFF) & 0xFF)) != ((systemREG1->CSDIS ^ 0xFF) & 0xFF)) {\r
+               return MCU_PLL_UNLOCKED;\r
+       }\r
 \r
-       return rv;\r
+       return MCU_PLL_LOCKED;\r
 }\r
 \r
 //-------------------------------------------------------------------\r
diff --git a/arch/arm/arm_cr4/drivers/can.c b/arch/arm/arm_cr4/drivers/can.c
new file mode 100644 (file)
index 0000000..7cebf5b
--- /dev/null
@@ -0,0 +1,3764 @@
+\r
+#include "Can.h"\r
+\r
+void Can_MainFunction_Write( void ) {\r
+       // Polled can not supported by this driver.\r
+}\r
+void Can_MainFunction_Read( void ) {\r
+       // Polled can not supported by this driver.\r
+}\r
+void Can_MainFunction_BusOff( void ) {\r
+       // Bus off not supported by this driver.\r
+}\r
+void Can_MainFunction_Wakeup( void ) {\r
+       // Wakeup not supported by this driver.\r
+}\r
+\r
+\r
+\r
+\r
+/* Global and Static Variables */\r
+\r
+#ifndef _little_endian__\r
+    static const unsigned s_canByteOrder[] = {3U, 2U, 1U, 0U, 7U, 6U, 5U, 4U};\r
+#endif\r
+\r
+\r
+void canInit(void)\r
+{\r
+/* USER CODE BEGIN (4) */\r
+/* USER CODE END */\r
+    /** @b Initialize @b DCAN1: */\r
+\r
+    /** - Setup control register\r
+    *     - Disable automatic wakeup on bus activity\r
+    *     - Local power down mode disabled\r
+    *     - Disable DMA request lines\r
+    *     - Enable global Interrupt Line 0 and 1\r
+    *     - Disable debug mode\r
+    *     - Release from software reset\r
+    *     - Disable parity and ECC\r
+    *     - Enable/Disable auto bus on timer\r
+    *     - Setup message completion before entering debug state\r
+    *     - Setup normal operation mode\r
+    *     - Request write access to the configuration registers\r
+    *     - Setup automatic retransmission of messages\r
+    *     - Disable error interrups\r
+    *     - Disable status interrupts\r
+    *     - Enter initialization mode\r
+    */\r
+    canREG1->CTL = 0x00000000U | 0x00000000U | 0x00021443U;\r
+\r
+    /** - Clear all pending error flags and reset current status */\r
+    canREG1->ES = 0x0000031FU;\r
+\r
+    /** - Assign interrupt level for messages */\r
+    canREG1->INTMUXx[0U] = 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U;\r
+\r
+    canREG1->INTMUXx[1U] = 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U;\r
+\r
+    /** - Setup auto bus on timer pewriod */\r
+    canREG1->ABOTR = 0U;\r
+\r
+    /** - Initialize message 1 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((1U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 1;\r
+\r
+    /** - Initialize message 2 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((2U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 2;\r
+\r
+    /** - Initialize message 3 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((3U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 3;\r
+\r
+    /** - Initialize message 4 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((4U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 4;\r
+\r
+    /** - Initialize message 5 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((5U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 5;\r
+\r
+    /** - Initialize message 6 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((6U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 6;\r
+\r
+    /** - Initialize message 7 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((7U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 7;\r
+\r
+    /** - Initialize message 8 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((8U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 8;\r
+\r
+    /** - Initialize message 9 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((9U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 9;\r
+\r
+    /** - Initialize message 10 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((10U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 10;\r
+\r
+    /** - Initialize message 11 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((11U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 11;\r
+\r
+    /** - Initialize message 12 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((12U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 12;\r
+\r
+    /** - Initialize message 13 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((13U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 13;\r
+\r
+    /** - Initialize message 14 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((14U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 14;\r
+\r
+    /** - Initialize message 15 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((15U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 15;\r
+\r
+    /** - Initialize message 16 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((16U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 16;\r
+\r
+    /** - Initialize message 17 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((17U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 17;\r
+\r
+    /** - Initialize message 18 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((18U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 18;\r
+\r
+    /** - Initialize message 19 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((19U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 19;\r
+\r
+    /** - Initialize message 20 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((20U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 20;\r
+\r
+    /** - Initialize message 21 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((21U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 21;\r
+\r
+    /** - Initialize message 22 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((22U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 22;\r
+\r
+    /** - Initialize message 23 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((23U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 23;\r
+\r
+    /** - Initialize message 24 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((24U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 24;\r
+\r
+    /** - Initialize message 25 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((25U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 25;\r
+\r
+    /** - Initialize message 26 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((26U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 26;\r
+\r
+    /** - Initialize message 27 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((27U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 27;\r
+\r
+    /** - Initialize message 28 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((28U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 28;\r
+\r
+    /** - Initialize message 29 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((29U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 29;\r
+\r
+    /** - Initialize message 30 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((30U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 30;\r
+\r
+    /** - Initialize message 31 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((31U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 31;\r
+\r
+    /** - Initialize message 32 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((32U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 32;\r
+\r
+    /** - Initialize message 33 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((33U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 33;\r
+\r
+    /** - Initialize message 34 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((34U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 34;\r
+\r
+    /** - Initialize message 35 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((35U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 35;\r
+\r
+    /** - Initialize message 36 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((36U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 36;\r
+\r
+    /** - Initialize message 37 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((37U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 37;\r
+\r
+    /** - Initialize message 38 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((38U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 38;\r
+\r
+    /** - Initialize message 39 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((39U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 39;\r
+\r
+    /** - Initialize message 40 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((40U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 40;\r
+\r
+    /** - Initialize message 41 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((41U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 41;\r
+\r
+    /** - Initialize message 42 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((42U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 42;\r
+\r
+    /** - Initialize message 43 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((43U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 43;\r
+\r
+    /** - Initialize message 44 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((44U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 44;\r
+\r
+    /** - Initialize message 45 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((45U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 45;\r
+\r
+    /** - Initialize message 46 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((46U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 46;\r
+\r
+    /** - Initialize message 47 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((47U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 47;\r
+\r
+    /** - Initialize message 48 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((48U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 48;\r
+\r
+    /** - Initialize message 49 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((49U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 49;\r
+\r
+    /** - Initialize message 50 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((50U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 50;\r
+\r
+    /** - Initialize message 51 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((51U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 51;\r
+\r
+    /** - Initialize message 52 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((52U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 52;\r
+\r
+    /** - Initialize message 53 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((53U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 53;\r
+\r
+    /** - Initialize message 54 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((54U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 54;\r
+\r
+    /** - Initialize message 55 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((55U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 55;\r
+\r
+    /** - Initialize message 56 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((56U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 56;\r
+\r
+    /** - Initialize message 57 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((57U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 57;\r
+\r
+    /** - Initialize message 58 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((58U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 58;\r
+\r
+    /** - Initialize message 59 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((59U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 59;\r
+\r
+    /** - Initialize message 60 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((60U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 60;\r
+\r
+    /** - Initialize message 61 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((61U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 61;\r
+\r
+    /** - Initialize message 62 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((62U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 62;\r
+\r
+    /** - Initialize message 63 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((63U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF1CMD  = 0xF8;\r
+    canREG1->IF1NO   = 63;\r
+\r
+    /** - Initialize message 64 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((64U & 0x1FFFFFFFU) << 0U);\r
+    canREG1->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG1->IF2CMD  = 0xF8;\r
+    canREG1->IF2NO   = 64;\r
+\r
+    /** - Setup IF1 for data transmission \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set IF1 control byte\r
+    */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1CMD  = 0x87;\r
+\r
+    /** - Setup IF2 for reading data\r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set IF1 control byte\r
+    */\r
+    while (canREG1->IF2STAT & 0x80);\r
+\r
+    canREG1->IF2CMD = 0x17;\r
+\r
+    /** - Setup bit timing \r
+    *     - Setup baud rate prescaler extension\r
+    *     - Setup TSeg2\r
+    *     - Setup TSeg1\r
+    *     - Setup sample jump width\r
+    *     - Setup baud rate prescaler\r
+    */\r
+    canREG1->BTR = (0U << 16U) |\r
+                   ((4U - 1U) << 12U) |\r
+                   (((5U + 4U) - 1U) << 8U) |\r
+                   ((4U - 1U) << 6U) |\r
+                   9U;\r
+\r
+    /** - Setup TX pin to functional output */\r
+    canREG1->TIOC = 0x0000004CU;\r
+\r
+    /** - Setup RX pin to functional input */\r
+    canREG1->RIOC = 0x00000048U;\r
+\r
+    /** - Leave configuration and initialization mode  */\r
+    canREG1->CTL &= ~0x00000041U;\r
+\r
+    /** @b Initialize @b DCAN2: */\r
+\r
+    /** - Setup control register\r
+    *     - Disable automatic wakeup on bus activity\r
+    *     - Local power down mode disabled\r
+    *     - Disable DMA request lines\r
+    *     - Enable global Interrupt Line 0 and 1\r
+    *     - Disable debug mode\r
+    *     - Release from software reset\r
+    *     - Disable parity and ECC\r
+    *     - Enable/Disable auto bus on timer\r
+    *     - Setup message completion before entering debug state\r
+    *     - Setup normal operation mode\r
+    *     - Request write access to the configuration registers\r
+    *     - Setup automatic retransmission of messages\r
+    *     - Disable error interrups\r
+    *     - Disable status interrupts\r
+    *     - Enter initialization mode\r
+    */\r
+    canREG2->CTL = 0x00000000U | 0x00000000U | 0x00021443U;\r
+\r
+    /** - Clear all pending error flags and reset current status */\r
+    canREG2->ES = 0x0000031FU;\r
+\r
+    /** - Assign interrupt level for messages */\r
+    canREG2->INTMUXx[0U] = 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U;\r
+\r
+    canREG2->INTMUXx[1U] = 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U;\r
+\r
+\r
+    /** - Setup auto bus on timer pewriod */\r
+    canREG2->ABOTR = 0U;\r
+\r
+    /** - Initialize message 1 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((1U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 1;\r
+\r
+    /** - Initialize message 2 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((2U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 2;\r
+\r
+    /** - Initialize message 3 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((3U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 3;\r
+\r
+    /** - Initialize message 4 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((4U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 4;\r
+\r
+    /** - Initialize message 5 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((5U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 5;\r
+\r
+    /** - Initialize message 6 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((6U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 6;\r
+\r
+    /** - Initialize message 7 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((7U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 7;\r
+\r
+    /** - Initialize message 8 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((8U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 8;\r
+\r
+    /** - Initialize message 9 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((9U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 9;\r
+\r
+    /** - Initialize message 10 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((10U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 10;\r
+\r
+    /** - Initialize message 11 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((11U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 11;\r
+\r
+    /** - Initialize message 12 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((12U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 12;\r
+\r
+    /** - Initialize message 13 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((13U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 13;\r
+\r
+    /** - Initialize message 14 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((14U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 14;\r
+\r
+    /** - Initialize message 15 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((15U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 15;\r
+\r
+    /** - Initialize message 16 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((16U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 16;\r
+\r
+    /** - Initialize message 17 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((17U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 17;\r
+\r
+    /** - Initialize message 18 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((18U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 18;\r
+\r
+    /** - Initialize message 19 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((19U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 19;\r
+\r
+    /** - Initialize message 20 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((20U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 20;\r
+\r
+    /** - Initialize message 21 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((21U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 21;\r
+\r
+    /** - Initialize message 22 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((22U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 22;\r
+\r
+    /** - Initialize message 23 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((23U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 23;\r
+\r
+    /** - Initialize message 24 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((24U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 24;\r
+\r
+    /** - Initialize message 25 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((25U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 25;\r
+\r
+    /** - Initialize message 26 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((26U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 26;\r
+\r
+    /** - Initialize message 27 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((27U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 27;\r
+\r
+    /** - Initialize message 28 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((28U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 28;\r
+\r
+    /** - Initialize message 29 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((29U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 29;\r
+\r
+    /** - Initialize message 30 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((30U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 30;\r
+\r
+    /** - Initialize message 31 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((31U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 31;\r
+\r
+    /** - Initialize message 32 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((32U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 32;\r
+\r
+    /** - Initialize message 33 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((33U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 33;\r
+\r
+    /** - Initialize message 34 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((34U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 34;\r
+\r
+    /** - Initialize message 35 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((35U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 35;\r
+\r
+    /** - Initialize message 36 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((36U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 36;\r
+\r
+    /** - Initialize message 37 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((37U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 37;\r
+\r
+    /** - Initialize message 38 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((38U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 38;\r
+\r
+    /** - Initialize message 39 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((39U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 39;\r
+\r
+    /** - Initialize message 40 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((40U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 40;\r
+\r
+    /** - Initialize message 41 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((41U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 41;\r
+\r
+    /** - Initialize message 42 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((42U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 42;\r
+\r
+    /** - Initialize message 43 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((43U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 43;\r
+\r
+    /** - Initialize message 44 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((44U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 44;\r
+\r
+    /** - Initialize message 45 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((45U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 45;\r
+\r
+    /** - Initialize message 46 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((46U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 46;\r
+\r
+    /** - Initialize message 47 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((47U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 47;\r
+\r
+    /** - Initialize message 48 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((48U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 48;\r
+\r
+    /** - Initialize message 49 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((49U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 49;\r
+\r
+    /** - Initialize message 50 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((50U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 50;\r
+\r
+    /** - Initialize message 51 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((51U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 51;\r
+\r
+    /** - Initialize message 52 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((52U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 52;\r
+\r
+    /** - Initialize message 53 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((53U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 53;\r
+\r
+    /** - Initialize message 54 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((54U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 54;\r
+\r
+    /** - Initialize message 55 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((55U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 55;\r
+\r
+    /** - Initialize message 56 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((56U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 56;\r
+\r
+    /** - Initialize message 57 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((57U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 57;\r
+\r
+    /** - Initialize message 58 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((58U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 58;\r
+\r
+    /** - Initialize message 59 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((59U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 59;\r
+\r
+    /** - Initialize message 60 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((60U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 60;\r
+\r
+    /** - Initialize message 61 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((61U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 61;\r
+\r
+    /** - Initialize message 62 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((62U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 62;\r
+\r
+    /** - Initialize message 63 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((63U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF1CMD  = 0xF8;\r
+    canREG2->IF1NO   = 63;\r
+\r
+    /** - Initialize message 64 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((64U & 0x1FFFFFFFU) << 0U);\r
+    canREG2->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG2->IF2CMD  = 0xF8;\r
+    canREG2->IF2NO   = 64;\r
+\r
+    /** - Setup IF1 for data transmission \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set IF1 control byte\r
+    */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1CMD  = 0x87;\r
+\r
+    /** - Setup IF2 for reading data\r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set IF1 control byte\r
+    */\r
+    while (canREG2->IF2STAT & 0x80);\r
+\r
+    canREG2->IF2CMD = 0x17;\r
+\r
+    /** - Setup bit timing \r
+    *     - Setup baud rate prescaler extension\r
+    *     - Setup TSeg2\r
+    *     - Setup TSeg1\r
+    *     - Setup sample jump width\r
+    *     - Setup baud rate prescaler\r
+    */\r
+    canREG2->BTR = (0U << 16U) |\r
+                   ((4U - 1U) << 12U) |\r
+                   (((5U + 4U) - 1U) << 8U) |\r
+                   ((4U - 1U) << 6U) |\r
+                   9U;\r
+\r
+    /** - Setup TX pin to functional output */\r
+    canREG2->TIOC = 0x0000004CU;\r
+\r
+    /** - Setup RX pin to functional input */\r
+    canREG2->RIOC = 0x00000048U;\r
+\r
+    /** - Leave configuration and initialization mode  */\r
+    canREG2->CTL &= ~0x00000041U;\r
+\r
+#if 0\r
+    /** @b Initialize @b DCAN3: */\r
+\r
+    /** - Setup control register\r
+    *     - Disable automatic wakeup on bus activity\r
+    *     - Local power down mode disabled\r
+    *     - Disable DMA request lines\r
+    *     - Enable global Interrupt Line 0 and 1\r
+    *     - Disable debug mode\r
+    *     - Release from software reset\r
+    *     - Disable parity and ECC\r
+    *     - Enable/Disable auto bus on timer\r
+    *     - Setup message completion before entering debug state\r
+    *     - Setup normal operation mode\r
+    *     - Request write access to the configuration registers\r
+    *     - Setup automatic retransmission of messages\r
+    *     - Disable error interrups\r
+    *     - Disable status interrupts\r
+    *     - Enter initialization mode\r
+    */\r
+    canREG3->CTL = 0x00000000U | 0x00000000U | 0x00021443U;\r
+\r
+    /** - Clear all pending error flags and reset current status */\r
+    canREG3->ES = 0x0000031FU;\r
+\r
+    /** - Assign interrupt level for messages */\r
+    canREG3->INTMUXx[0U] = 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U\r
+                         | 0x00000000U;\r
+\r
+    /** - Setup auto bus on timer pewriod */\r
+    canREG3->ABOTR = 0U;\r
+\r
+    /** - Initialize message 1 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG3->IF1STAT & 0x80);\r
+\r
+    canREG3->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((1U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF1CMD  = 0xF8;\r
+    canREG3->IF1NO   = 1;\r
+\r
+    /** - Initialize message 2 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG3->IF2STAT & 0x80);\r
+\r
+    canREG3->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((2U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF2CMD  = 0xF8;\r
+    canREG3->IF2NO   = 2;\r
+\r
+    /** - Initialize message 3 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG3->IF1STAT & 0x80);\r
+\r
+    canREG3->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((3U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF1CMD  = 0xF8;\r
+    canREG3->IF1NO   = 3;\r
+\r
+    /** - Initialize message 4 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG3->IF2STAT & 0x80);\r
+\r
+    canREG3->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((4U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF2CMD  = 0xF8;\r
+    canREG3->IF2NO   = 4;\r
+\r
+    /** - Initialize message 5 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG3->IF1STAT & 0x80);\r
+\r
+    canREG3->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((5U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF1CMD  = 0xF8;\r
+    canREG3->IF1NO   = 5;\r
+\r
+    /** - Initialize message 6 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG3->IF2STAT & 0x80);\r
+\r
+    canREG3->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((6U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF2CMD  = 0xF8;\r
+    canREG3->IF2NO   = 6;\r
+\r
+    /** - Initialize message 7 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG3->IF1STAT & 0x80);\r
+\r
+    canREG3->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((7U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF1CMD  = 0xF8;\r
+    canREG3->IF1NO   = 7;\r
+\r
+    /** - Initialize message 8 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG3->IF2STAT & 0x80);\r
+\r
+    canREG3->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((8U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF2CMD  = 0xF8;\r
+    canREG3->IF2NO   = 8;\r
+\r
+    /** - Initialize message 9 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG3->IF1STAT & 0x80);\r
+\r
+    canREG3->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((9U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF1CMD  = 0xF8;\r
+    canREG3->IF1NO   = 9;\r
+\r
+    /** - Initialize message 10 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG3->IF2STAT & 0x80);\r
+\r
+    canREG3->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((10U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF2CMD  = 0xF8;\r
+    canREG3->IF2NO   = 10;\r
+\r
+    /** - Initialize message 11 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG3->IF1STAT & 0x80);\r
+\r
+    canREG3->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((11U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF1CMD  = 0xF8;\r
+    canREG3->IF1NO   = 11;\r
+\r
+    /** - Initialize message 12 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG3->IF2STAT & 0x80);\r
+\r
+    canREG3->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((12U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF2CMD  = 0xF8;\r
+    canREG3->IF2NO   = 12;\r
+\r
+    /** - Initialize message 13 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG3->IF1STAT & 0x80);\r
+\r
+    canREG3->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((13U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF1CMD  = 0xF8;\r
+    canREG3->IF1NO   = 13;\r
+\r
+    /** - Initialize message 14 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG3->IF2STAT & 0x80);\r
+\r
+    canREG3->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((14U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF2CMD  = 0xF8;\r
+    canREG3->IF2NO   = 14;\r
+\r
+    /** - Initialize message 15 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG3->IF1STAT & 0x80);\r
+\r
+    canREG3->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((15U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF1CMD  = 0xF8;\r
+    canREG3->IF1NO   = 15;\r
+\r
+    /** - Initialize message 16 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG3->IF2STAT & 0x80);\r
+\r
+    canREG3->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((16U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF2CMD  = 0xF8;\r
+    canREG3->IF2NO   = 16;\r
+\r
+    /** - Initialize message 17 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG3->IF1STAT & 0x80);\r
+\r
+    canREG3->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((17U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF1CMD  = 0xF8;\r
+    canREG3->IF1NO   = 17;\r
+\r
+    /** - Initialize message 18 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG3->IF2STAT & 0x80);\r
+\r
+    canREG3->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((18U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF2CMD  = 0xF8;\r
+    canREG3->IF2NO   = 18;\r
+\r
+    /** - Initialize message 19 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG3->IF1STAT & 0x80);\r
+\r
+    canREG3->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((19U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF1CMD  = 0xF8;\r
+    canREG3->IF1NO   = 19;\r
+\r
+    /** - Initialize message 20 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG3->IF2STAT & 0x80);\r
+\r
+    canREG3->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((20U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF2CMD  = 0xF8;\r
+    canREG3->IF2NO   = 20;\r
+\r
+    /** - Initialize message 21 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG3->IF1STAT & 0x80);\r
+\r
+    canREG3->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((21U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF1CMD  = 0xF8;\r
+    canREG3->IF1NO   = 21;\r
+\r
+    /** - Initialize message 22 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG3->IF2STAT & 0x80);\r
+\r
+    canREG3->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((22U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF2CMD  = 0xF8;\r
+    canREG3->IF2NO   = 22;\r
+\r
+    /** - Initialize message 23 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG3->IF1STAT & 0x80);\r
+\r
+    canREG3->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((23U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF1CMD  = 0xF8;\r
+    canREG3->IF1NO   = 23;\r
+\r
+    /** - Initialize message 24 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG3->IF2STAT & 0x80);\r
+\r
+    canREG3->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((24U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF2CMD  = 0xF8;\r
+    canREG3->IF2NO   = 24;\r
+\r
+    /** - Initialize message 25 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG3->IF1STAT & 0x80);\r
+\r
+    canREG3->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((25U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF1CMD  = 0xF8;\r
+    canREG3->IF1NO   = 25;\r
+\r
+    /** - Initialize message 26 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG3->IF2STAT & 0x80);\r
+\r
+    canREG3->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((26U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF2CMD  = 0xF8;\r
+    canREG3->IF2NO   = 26;\r
+\r
+    /** - Initialize message 27 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG3->IF1STAT & 0x80);\r
+\r
+    canREG3->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((27U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF1CMD  = 0xF8;\r
+    canREG3->IF1NO   = 27;\r
+\r
+    /** - Initialize message 28 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG3->IF2STAT & 0x80);\r
+\r
+    canREG3->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((28U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF2CMD  = 0xF8;\r
+    canREG3->IF2NO   = 28;\r
+\r
+    /** - Initialize message 29 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG3->IF1STAT & 0x80);\r
+\r
+    canREG3->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((29U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF1CMD  = 0xF8;\r
+    canREG3->IF1NO   = 29;\r
+\r
+    /** - Initialize message 30 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG3->IF2STAT & 0x80);\r
+\r
+    canREG3->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((30U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF2CMD  = 0xF8;\r
+    canREG3->IF2NO   = 30;\r
+\r
+    /** - Initialize message 31 \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF1 control byte\r
+    *     - Set IF1 message number\r
+    */\r
+    while (canREG3->IF1STAT & 0x80);\r
+\r
+    canREG3->IF1MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((31U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF1MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF1CMD  = 0xF8;\r
+    canREG3->IF1NO   = 31;\r
+\r
+    /** - Initialize message 32 \r
+    *     - Wait until IF2 is ready for use \r
+    *     - Set message mask\r
+    *     - Set message control word\r
+    *     - Set message arbitration\r
+    *     - Set IF2 control byte\r
+    *     - Set IF2 message number\r
+    */\r
+    while (canREG3->IF2STAT & 0x80);\r
+\r
+    canREG3->IF2MSK  = 0xC0000000U | ((0x000007FFU & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2ARB  = 0x00000000U | 0x40000000U | 0x20000000U | ((32U & 0x1FFFFFFFU) << 0U);\r
+    canREG3->IF2MCTL = 0x00001080U | 0x00000000U | 8U;\r
+    canREG3->IF2CMD  = 0xF8;\r
+    canREG3->IF2NO   = 32;\r
+\r
+    /** - Setup IF1 for data transmission \r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set IF1 control byte\r
+    */\r
+    while (canREG3->IF1STAT & 0x80);\r
+\r
+    canREG3->IF1CMD  = 0x87;\r
+\r
+    /** - Setup IF2 for reading data\r
+    *     - Wait until IF1 is ready for use \r
+    *     - Set IF1 control byte\r
+    */\r
+    while (canREG3->IF2STAT & 0x80);\r
+\r
+    canREG3->IF2CMD = 0x17;\r
+\r
+    /** - Setup bit timing \r
+    *     - Setup baud rate prescaler extension\r
+    *     - Setup TSeg2\r
+    *     - Setup TSeg1\r
+    *     - Setup sample jump width\r
+    *     - Setup baud rate prescaler\r
+    */\r
+    canREG3->BTR = (0U << 16U) |\r
+                   ((4U - 1U) << 12U) |\r
+                   (((5U + 4U) - 1U) << 8U) |\r
+                   ((4U - 1U) << 6U) |\r
+                   9U;\r
+\r
+    /** - Setup TX pin to functional output */\r
+    canREG3->TIOC = 0x0000004CU;\r
+\r
+    /** - Setup RX pin to functional input */\r
+    canREG3->RIOC = 0x00000048U;\r
+\r
+    /** - Leave configuration and initialization mode  */\r
+    canREG3->CTL &= ~0x00000041U;\r
+#endif\r
+\r
+    /**   @note This function has to be called before the driver can be used.\n\r
+    *           This function has to be executed in priviledged mode.\n\r
+    */\r
+\r
+/* USER CODE BEGIN (5) */\r
+/* USER CODE END */\r
+}\r
+\r
+\r
+/** @fn unsigned canTransmit(canBASE_t *node, unsigned messageBox, const unsigned char *data)\r
+*   @brief Transmits a CAN message\r
+*   @param[in] node Pointer to CAN node:\r
+*              - canREG1: DCAN1 node pointer\r
+*              - canREG2: DCAN2 node pointer\r
+*              - canREG3: DCAN3 node pointer\r
+*   @param[in] messageBox Message box number of CAN node:\r
+*              - canMESSAGE_BOX1: CAN message box 1\r
+*              - canMESSAGE_BOXn: CAN message box n [n: 1-64]\r
+*              - canMESSAGE_BOX64: CAN message box 64\r
+*   @param[in] data Pointer to CAN TX data\r
+*   @return The function will return:\r
+*           - 0: When the setup of the TX message box wasn't successful   \r
+*           - 1: When the setup of the TX message box was successful   \r
+*\r
+*   This function writes a CAN message into a CAN message box.\r
+*\r
+*/\r
+\r
+/* USER CODE BEGIN (6) */\r
+/* USER CODE END */\r
+\r
+unsigned canTransmit(canBASE_t *node, unsigned messageBox, const unsigned char *data)\r
+{\r
+    unsigned i;\r
+    unsigned success  = 0U;\r
+    unsigned regIndex = (messageBox - 1U) >> 5U;\r
+    unsigned bitIndex = 1U << ((messageBox - 1U) & 0x1FU);\r
+\r
+/* USER CODE BEGIN (7) */\r
+/* USER CODE END */\r
+\r
+    /** - Check for pending message:\r
+    *     - pending message, return 0\r
+    *     - no pending message, start new transmission \r
+    */\r
+    if (node->TXRQx[regIndex] & bitIndex)\r
+    {\r
+        return success;\r
+    }\r
+\r
+    /** - Wait until IF1 is ready for use */\r
+    while (node->IF1STAT & 0x80);\r
+\r
+    /** - Copy TX data into IF1 */\r
+    for (i = 0U; i < 8U; i++)\r
+    {\r
+#ifdef _little_endian__\r
+        node->IF1DATx[i] = *data++;\r
+#else\r
+        node->IF1DATx[s_canByteOrder[i]] = *data++;\r
+#endif\r
+    }\r
+\r
+    /** - Copy TX data into mesasge box */\r
+    node->IF1NO = messageBox;\r
+\r
+    success = 1U; \r
+\r
+    /**   @note The function canInit has to be called before this function can be used.\n\r
+    *           The user is responsible to initialize the message box.\r
+    */\r
+\r
+/* USER CODE BEGIN (8) */\r
+/* USER CODE END */\r
+\r
+    return success;\r
+}\r
+\r
+\r
+/** @fn unsigned canGetData(canBASE_t *node, unsigned messageBox, unsigned char * const data)\r
+*   @brief Gets received a CAN message\r
+*   @param[in] node Pointer to CAN node:\r
+*              - canREG1: DCAN1 node pointer\r
+*              - canREG2: DCAN2 node pointer\r
+*              - canREG3: DCAN3 node pointer\r
+*   @param[in] messageBox Message box number of CAN node:\r
+*              - canMESSAGE_BOX1: CAN message box 1\r
+*              - canMESSAGE_BOXn: CAN message box n [n: 1-64]\r
+*              - canMESSAGE_BOX64: CAN message box 64\r
+*   @param[out] data Pointer to store CAN RX data\r
+*   @return The function will return:\r
+*           - 0: When RX message box hasn't received new data   \r
+*           - 1: When RX data are stored in the data buffer   \r
+*           - 3: When RX data are stored in the data buffer and a message was lost   \r
+*\r
+*   This function writes a CAN message into a CAN message box.\r
+*\r
+*/\r
+\r
+\r
+/* USER CODE BEGIN (9) */\r
+/* USER CODE END */\r
+\r
+unsigned canGetData(canBASE_t *node, unsigned messageBox, unsigned char * const data)\r
+{\r
+    unsigned       i;\r
+    unsigned       size;\r
+    unsigned char *pData    = (unsigned char *)data;\r
+    unsigned       success  = 0U;\r
+    unsigned       regIndex = (messageBox - 1U) >> 5U;\r
+    unsigned       bitIndex = 1U << ((messageBox - 1U) & 0x1FU);\r
+\r
+/* USER CODE BEGIN (10) */\r
+/* USER CODE END */\r
+\r
+    /** - Check if new data have been arrived:\r
+    *     - no new data, return 0\r
+    *     - new data, get received message \r
+    */\r
+    if (!(node->NWDATx[regIndex] & bitIndex))\r
+    {\r
+        return success;\r
+    }\r
+\r
+    /** - Wait until IF2 is ready for use */\r
+    while (node->IF2STAT & 0x80);\r
+\r
+    /** - Copy data into IF2 */\r
+    node->IF2NO = messageBox;\r
+\r
+    /** - Wait until data are copied into IF2 */\r
+    while (node->IF2STAT & 0x80);\r
+\r
+    /** - Get number of received bytes */\r
+    size = node->IF2MCTL & 0xFU;\r
+\r
+    /** - Copy RX data into destination buffer */\r
+    for (i = 0U; i < size; i++)\r
+    {\r
+#ifdef _little_endian__\r
+        *pData++ = node->IF2DATx[i];\r
+#else\r
+        *pData++ = node->IF2DATx[s_canByteOrder[i]];\r
+#endif\r
+    }\r
+\r
+    success = 1U;\r
+\r
+    /** - Check if data have been lost:\r
+    *     - no data lost, return 1\r
+    *     - data lost, return 3 \r
+    */\r
+    if (node->IF2MCTL & 0x4000U)\r
+    {\r
+        success = 3U;\r
+    }\r
+\r
+    /**   @note The function canInit has to be called before this function can be used.\n\r
+    *           The user is responsible to initialize the message box.\r
+    */\r
+\r
+/* USER CODE BEGIN (11) */\r
+/* USER CODE END */\r
+\r
+    return success;\r
+}\r
+\r
+\r
+/** @fn unsigned canIsTxMessagePending(canBASE_t *node, unsigned messageBox)\r
+*   @brief Gets Tx message box transmission status\r
+*   @param[in] node Pointer to CAN node:\r
+*              - canREG1: DCAN1 node pointer\r
+*              - canREG2: DCAN2 node pointer\r
+*              - canREG3: DCAN3 node pointer\r
+*   @param[in] messageBox Message box number of CAN node:\r
+*              - canMESSAGE_BOX1: CAN message box 1\r
+*              - canMESSAGE_BOXn: CAN message box n [n: 1-64]\r
+*              - canMESSAGE_BOX64: CAN message box 64\r
+*   @return The function will return the tx request flag\r
+*\r
+*   Checks to see if the Tx message box has a pending Tx request, returns\r
+*   0 is flag not set otherwise will return the Tx request flag itself.\r
+*/\r
+\r
+\r
+/* USER CODE BEGIN (12) */\r
+/* USER CODE END */\r
+\r
+unsigned canIsTxMessagePending(canBASE_t *node, unsigned messageBox)\r
+{\r
+    unsigned flag;\r
+    unsigned regIndex = (messageBox - 1U) >> 5U;\r
+    unsigned bitIndex = 1U << ((messageBox - 1U) & 0x1FU);\r
+\r
+/* USER CODE BEGIN (13) */\r
+/* USER CODE END */\r
+\r
+    /** - Read Tx request reigster */\r
+    flag = node->TXRQx[regIndex] & bitIndex;\r
+\r
+/* USER CODE BEGIN (14) */\r
+/* USER CODE END */\r
+\r
+    return flag;\r
+}\r
+\r
+\r
+/** @fn unsigned canIsRxMessageArrived(canBASE_t *node, unsigned messageBox)\r
+*   @brief Gets Rx message box reception status\r
+*   @param[in] node Pointer to CAN node:\r
+*              - canREG1: DCAN1 node pointer\r
+*              - canREG2: DCAN2 node pointer\r
+*              - canREG3: DCAN3 node pointer\r
+*   @param[in] messageBox Message box number of CAN node:\r
+*              - canMESSAGE_BOX1: CAN message box 1\r
+*              - canMESSAGE_BOXn: CAN message box n [n: 1-64]\r
+*              - canMESSAGE_BOX64: CAN message box 64\r
+*   @return The function will return the new data flag\r
+*\r
+*   Checks to see if the Rx message box has pending Rx data, returns\r
+*   0 is flag not set otherwise will return the Tx request flag itself.\r
+*/\r
+\r
+\r
+/* USER CODE BEGIN (15) */\r
+/* USER CODE END */\r
+\r
+unsigned canIsRxMessageArrived(canBASE_t *node, unsigned messageBox)\r
+{\r
+    unsigned flag;\r
+    unsigned regIndex = (messageBox - 1U) >> 5U;\r
+    unsigned bitIndex = 1U << ((messageBox - 1U) & 0x1FU);\r
+\r
+/* USER CODE BEGIN (16) */\r
+/* USER CODE END */\r
+\r
+    /** - Read Tx request register */\r
+    flag = node->NWDATx[regIndex] & bitIndex;\r
+\r
+/* USER CODE BEGIN (17) */\r
+/* USER CODE END */\r
+\r
+    return flag;\r
+}\r
+\r
+\r
+/** @fn unsigned canIsMessageBoxValid(canBASE_t *node, unsigned messageBox)\r
+*   @brief Chechs if message box is valid\r
+*   @param[in] node Pointer to CAN node:\r
+*              - canREG1: DCAN1 node pointer\r
+*              - canREG2: DCAN2 node pointer\r
+*              - canREG3: DCAN3 node pointer\r
+*   @param[in] messageBox Message box number of CAN node:\r
+*              - canMESSAGE_BOX1: CAN message box 1\r
+*              - canMESSAGE_BOXn: CAN message box n [n: 1-64]\r
+*              - canMESSAGE_BOX64: CAN message box 64\r
+*   @return The function will return the new data flag\r
+*\r
+*   Checks to see if the message box is valid for operation, returns\r
+*   0 is flag not set otherwise will return the validation flag itself.\r
+*/\r
+\r
+\r
+/* USER CODE BEGIN (18) */\r
+/* USER CODE END */\r
+\r
+unsigned canIsMessageBoxValid(canBASE_t *node, unsigned messageBox)\r
+{\r
+    unsigned flag;\r
+    unsigned regIndex = (messageBox - 1U) >> 5U;\r
+    unsigned bitIndex = 1U << ((messageBox - 1U) & 0x1FU);\r
+\r
+/* USER CODE BEGIN (19) */\r
+/* USER CODE END */\r
+\r
+    /** - Read Tx request register */\r
+    flag = node->MSGVALx[regIndex] & bitIndex;\r
+\r
+/* USER CODE BEGIN (20) */\r
+/* USER CODE END */\r
+\r
+    return flag;\r
+}\r
+\r
+\r
+/** @fn unsigned canGetLastError(canBASE_t *node)\r
+*   @brief Gets last RX/TX-Error of CAN message traffic\r
+*   @param[in] node Pointer to CAN node:\r
+*              - canREG1: DCAN1 node pointer\r
+*              - canREG2: DCAN2 node pointer\r
+*              - canREG3: DCAN3 node pointer\r
+*   @return The function will return:\r
+*           - canERROR_OK (0): When no CAN error occured   \r
+*           - canERROR_STUFF (1): When a stuff error occured on RX message    \r
+*           - canERROR_FORMAT (2): When a form/format error occured on RX message   \r
+*           - canERROR_ACKNOWLEDGE (3): When a TX message wasn't acknowledged  \r
+*           - canERROR_BIT1 (4): When a TX message monitored dominant level where recessive is expected   \r
+*           - canERROR_BIT0 (5): When a TX message monitored recessive level where dominant is expected   \r
+*           - canERROR_CRC (6): When a RX message has wrong CRC value   \r
+*           - canERROR_NO (7): When no error occured since last call of this function   \r
+*\r
+*   This function returns the last occured error code of an RX or TX message,\r
+*   since the last call of this function.\r
+*\r
+*/\r
+\r
+\r
+/* USER CODE BEGIN (21) */\r
+/* USER CODE END */\r
+\r
+unsigned canGetLastError(canBASE_t *node)\r
+{\r
+    unsigned errorCode;\r
+\r
+/* USER CODE BEGIN (22) */\r
+/* USER CODE END */\r
+\r
+    /** - Get last error code */\r
+    errorCode = node->ES & 7U;\r
+\r
+    /**   @note The function canInit has to be called before this function can be used. */\r
+\r
+/* USER CODE BEGIN (23) */\r
+/* USER CODE END */\r
+\r
+    return errorCode;\r
+}\r
+\r
+\r
+/** @fn unsigned canGetErrorLevel(canBASE_t *node)\r
+*   @brief Gets error level of a CAN node\r
+*   @param[in] node Pointer to CAN node:\r
+*              - canREG1: DCAN1 node pointer\r
+*              - canREG2: DCAN2 node pointer\r
+*              - canREG3: DCAN3 node pointer\r
+*   @return The function will return:\r
+*           - canLEVEL_ACTIVE (0x00): When RX- and TX error counters are below 96   \r
+*           - canLEVEL_WARNING (0x40): When RX- or TX error counter are between 96 and 127     \r
+*           - canLEVEL_PASSIVE (0x20): When RX- or TX error counter are between 128 and 255     \r
+*           - canLEVEL_BUS_OFF (0x80): When RX- or TX error counter are above 255     \r
+*\r
+*   This function returns the current error level of a CAN node.\r
+*\r
+*/\r
+\r
+\r
+/* USER CODE BEGIN (24) */\r
+/* USER CODE END */\r
+\r
+unsigned canGetErrorLevel(canBASE_t *node)\r
+{\r
+    unsigned errorLevel;\r
+\r
+/* USER CODE BEGIN (25) */\r
+/* USER CODE END */\r
+\r
+    /** - Get error level */\r
+    errorLevel = node->ES & 0xE0U;\r
+\r
+    /**   @note The function canInit has to be called before this function can be used. */\r
+\r
+/* USER CODE BEGIN (26) */\r
+/* USER CODE END */\r
+\r
+    return errorLevel;\r
+}\r
+\r
+\r
+/** @fn void canEnableErrorNotification(canBASE_t *node)\r
+*   @brief Enable error notification\r
+*   @param[in] node Pointer to CAN node:\r
+*              - canREG1: DCAN1 node pointer\r
+*              - canREG2: DCAN2 node pointer\r
+*              - canREG3: DCAN3 node pointer\r
+*\r
+*   This function will enable the notification for the reaching the error levels warning, passive and bus off.\r
+*/\r
+\r
+/* USER CODE BEGIN (27) */\r
+/* USER CODE END */\r
+\r
+void canEnableErrorNotification(canBASE_t *node)\r
+{\r
+/* USER CODE BEGIN (28) */\r
+/* USER CODE END */\r
+\r
+    node->CTL |= 8U;\r
+\r
+    /**   @note The function canInit has to be called before this function can be used. */\r
+\r
+/* USER CODE BEGIN (29) */\r
+/* USER CODE END */\r
+}\r
+\r
+\r
+/** @fn void canDisableErrorNotification(canBASE_t *node)\r
+*   @brief Disable error notification\r
+*   @param[in] node Pointer to CAN node:\r
+*              - canREG1: DCAN1 node pointer\r
+*              - canREG2: DCAN2 node pointer\r
+*              - canREG3: DCAN3 node pointer\r
+*\r
+*   This function will disable the notification for the reaching the error levels warning, passive and bus off.\r
+*/\r
+\r
+/* USER CODE BEGIN (30) */\r
+/* USER CODE END */\r
+\r
+void canDisableErrorNotification(canBASE_t *node)\r
+{\r
+/* USER CODE BEGIN (31) */\r
+/* USER CODE END */\r
+\r
+    node->CTL &= ~8U;\r
+\r
+    /**   @note The function canInit has to be called before this function can be used. */\r
+\r
+/* USER CODE BEGIN (32) */\r
+/* USER CODE END */\r
+}\r
+\r
+\r
+/** @fn unsigned canEnableMessageNotification(canBASE_t *node, unsigned messageBox)\r
+*   @brief Enable message notification\r
+*   @param[in] node Pointer to CAN node:\r
+*              - canREG1: DCAN1 node pointer\r
+*              - canREG2: DCAN2 node pointer\r
+*              - canREG3: DCAN3 node pointer\r
+*   @param[in] messageBox Message box number of CAN node:\r
+*              - canMESSAGE_BOX1: CAN message box 1\r
+*              - canMESSAGE_BOXn: CAN message box n [n: 1-64]\r
+*              - canMESSAGE_BOX64: CAN message box 64\r
+*   @return The function will return:\r
+*           - 0: When the interrupts are not enable (message is pending)   \r
+*           - 1: When the are enabled   \r
+*\r
+*   This function will enable the notification for sucessfully receiving or transmitting a message.\r
+*/\r
+\r
+/* USER CODE BEGIN (33) */\r
+/* USER CODE END */\r
+\r
+unsigned canEnableMessageNotification(canBASE_t *node, unsigned messageBox)\r
+{\r
+    unsigned success  = 0U;\r
+    unsigned regIndex = (messageBox - 1U) >> 5U;\r
+    unsigned bitIndex = 1U << ((messageBox - 1U) & 0x1FU);\r
+\r
+/* USER CODE BEGIN (34) */\r
+/* USER CODE END */\r
+\r
+    /** - Check for pending message:\r
+    *     - pending message, return 0\r
+    *     - no pending message, enable interrupts\r
+    */\r
+    if ((node->NWDATx[regIndex] & bitIndex) || (node->TXRQx[regIndex] & bitIndex))\r
+    {\r
+        return success;\r
+    }\r
+\r
+    /** - Wait until IF2 is ready for use */\r
+    while (node->IF2STAT & 0x80);\r
+\r
+    /** - Copy data into IF2 */\r
+    node->IF2NO = messageBox;\r
+\r
+    /** - Wait until data are copied into IF2 */\r
+    while (node->IF2STAT & 0x80);\r
+\r
+    /** - Wait until IF1 is ready for use */\r
+    while (node->IF1STAT & 0x80);\r
+\r
+    /** - Adapt IF1 command to enable the interrupts */\r
+    node->IF1CMD = 0x90;\r
+\r
+    /** - Enable message interrupt */\r
+    node->IF1MCTL = node->IF2MCTL | 0xC00U;\r
+\r
+    /** - Copy data into message box */\r
+    node->IF1NO = messageBox;\r
+\r
+    /** - Wait until IF1 is ready for use */\r
+    while (node->IF1STAT & 0x80);\r
+\r
+    /** - Reset IF1 command to normal operation */\r
+    node->IF1CMD = 0x87;\r
+\r
+    success = 1U;\r
+\r
+    /**   @note The function canInit has to be called before this function can be used.\n \r
+    *           The function returns with 0 if the message box has a pending data.\r
+    */\r
+\r
+/* USER CODE BEGIN (35) */\r
+/* USER CODE END */\r
+\r
+    return success;\r
+}\r
+\r
+\r
+/** @fn unsigned canDisableMessageNotification(canBASE_t *node, unsigned messageBox)\r
+*   @brief Disable message notification\r
+*   @param[in] node Pointer to CAN node:\r
+*              - canREG1: DCAN1 node pointer\r
+*              - canREG2: DCAN2 node pointer\r
+*              - canREG3: DCAN3 node pointer\r
+*   @param[in] messageBox Message box number of CAN node:\r
+*              - canMESSAGE_BOX1: CAN message box 1\r
+*              - canMESSAGE_BOXn: CAN message box n [n: 1-64]\r
+*              - canMESSAGE_BOX64: CAN message box 64\r
+*   @return The function will return:\r
+*           - 0: When the interrupts are not enable (message is pending)   \r
+*           - 1: When the are enabled   \r
+*\r
+*   This function will disable the notification for sucessfully receiving or transmitting a message.\r
+*/\r
+\r
+/* USER CODE BEGIN (36) */\r
+/* USER CODE END */\r
+\r
+unsigned canDisableMessageNotification(canBASE_t *node, unsigned messageBox)\r
+{\r
+    unsigned success  = 0U;\r
+    unsigned regIndex = (messageBox - 1U) >> 5U;\r
+    unsigned bitIndex = 1U << ((messageBox - 1U) & 0x1FU);\r
+\r
+/* USER CODE BEGIN (37) */\r
+/* USER CODE END */\r
+\r
+    /** - Check for pending message:\r
+    *     - pending message, return 0\r
+    *     - no pending message, enable interrupts\r
+    */\r
+    if ((node->NWDATx[regIndex] & bitIndex) || (node->TXRQx[regIndex] & bitIndex))\r
+    {\r
+        return success;\r
+    }\r
+\r
+    /** - Wait until IF2 is ready for use */\r
+    while (node->IF2STAT & 0x80);\r
+\r
+    /** - Copy data into IF2 */\r
+    node->IF2NO = messageBox;\r
+\r
+    /** - Wait until data are copied into IF2 */\r
+    while (node->IF2STAT & 0x80);\r
+\r
+    /** - Wait until IF1 is ready for use */\r
+    while (node->IF1STAT & 0x80);\r
+\r
+    /** - Adapt IF1 command to disable the interrupts */\r
+    node->IF1CMD = 0x90;\r
+\r
+    /** - Disable message interrupt */\r
+    node->IF1MCTL = node->IF2MCTL & ~0xC00U;\r
+\r
+    /** - Copy data into message box */\r
+    node->IF1NO = messageBox;\r
+\r
+    /** - Wait until IF1 is ready for use */\r
+    while (node->IF1STAT & 0x80);\r
+\r
+    /** - Reset IF1 command to normal operation */\r
+    node->IF1CMD = 0x87;\r
+\r
+    success = 1U;\r
+\r
+    /**   @note The function canInit has to be called before this function can be used.\n \r
+    *           The function returns with 0 if the message box has a pending data.\r
+    */\r
+\r
+/* USER CODE BEGIN (38) */\r
+/* USER CODE END */\r
+\r
+    return success;\r
+}\r
+\r
+\r
+/** @fn void can1HighLevelInterrupt(void)\r
+*   @brief DCAN1 High Level Interrupt Handler\r
+*/\r
+\r
+/* USER CODE BEGIN (39) */\r
+/* USER CODE END */\r
+\r
+#if 0\r
+    #pragma INTERRUPT(can1HighLevelInterrupt, IRQ)\r
+#endif\r
+\r
+void can1HighLevelInterrupt(void)\r
+{\r
+    unsigned value = canREG1->INT;\r
+\r
+/* USER CODE BEGIN (40) */\r
+/* USER CODE END */\r
+\r
+    if (value == 0x8000U)\r
+    {\r
+        canErrorNotification(canREG1, canREG1->ES & 0xE0U);\r
+        return;\r
+    }\r
+\r
+    /** - Setup IF1 for clear pending interrupt flag */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1CMD = 0x08;\r
+    canREG1->IF1NO  = value;\r
+\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1CMD = 0x87;\r
+\r
+    canMessageNotification(canREG1, value);\r
+\r
+/* USER CODE BEGIN (41) */\r
+/* USER CODE END */\r
+}\r
+\r
+\r
+/** @fn void can1LowLevelInterrupt(void)\r
+*   @brief DCAN1 Low Level Interrupt Handler\r
+*/\r
+\r
+/* USER CODE BEGIN (42) */\r
+/* USER CODE END */\r
+\r
+#if 0\r
+    #pragma INTERRUPT(can1LowLevelInterrupt, IRQ)\r
+#endif\r
+\r
+void can1LowLevelInterrupt(void)\r
+{\r
+    unsigned messageBox = canREG1->INT >> 16U;\r
+\r
+/* USER CODE BEGIN (43) */\r
+/* USER CODE END */\r
+\r
+    /** - Setup IF1 for clear pending interrupt flag */\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1CMD = 0x08;\r
+    canREG1->IF1NO  = messageBox;\r
+\r
+    while (canREG1->IF1STAT & 0x80);\r
+\r
+    canREG1->IF1CMD = 0x87;\r
+\r
+    canMessageNotification(canREG1, messageBox);\r
+\r
+/* USER CODE BEGIN (44) */\r
+/* USER CODE END */\r
+}\r
+\r
+\r
+/** @fn void can2HighLevelInterrupt(void)\r
+*   @brief DCAN2 High Level Interrupt Handler\r
+*/\r
+\r
+/* USER CODE BEGIN (45) */\r
+/* USER CODE END */\r
+\r
+#if 0\r
+    #pragma INTERRUPT(can2HighLevelInterrupt, IRQ)\r
+#endif\r
+\r
+void can2HighLevelInterrupt(void)\r
+{\r
+    unsigned value = canREG2->INT;\r
+\r
+/* USER CODE BEGIN (46) */\r
+/* USER CODE END */\r
+\r
+    if (value == 0x8000U)\r
+    {\r
+        canErrorNotification(canREG2, canREG2->ES & 0xE0U);\r
+        return;\r
+    }\r
+\r
+    /** - Setup IF1 for clear pending interrupt flag */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1CMD = 0x08;\r
+    canREG2->IF1NO  = value;\r
+\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1CMD = 0x87;\r
+\r
+    canMessageNotification(canREG2, value);\r
+\r
+/* USER CODE BEGIN (47) */\r
+/* USER CODE END */\r
+}\r
+\r
+\r
+/** @fn void can2LowLevelInterrupt(void)\r
+*   @brief DCAN2 Low Level Interrupt Handler\r
+*/\r
+\r
+/* USER CODE BEGIN (48) */\r
+/* USER CODE END */\r
+\r
+#if 0\r
+    #pragma INTERRUPT(can2LowLevelInterrupt, IRQ)\r
+#endif\r
+\r
+void can2LowLevelInterrupt(void)\r
+{\r
+    unsigned messageBox = canREG2->INT >> 16U;\r
+\r
+/* USER CODE BEGIN (49) */\r
+/* USER CODE END */\r
+\r
+    /** - Setup IF1 for clear pending interrupt flag */\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1CMD = 0x08;\r
+    canREG2->IF1NO  = messageBox;\r
+\r
+    while (canREG2->IF1STAT & 0x80);\r
+\r
+    canREG2->IF1CMD = 0x87;\r
+\r
+    canMessageNotification(canREG2, messageBox);\r
+\r
+/* USER CODE BEGIN (50) */\r
+/* USER CODE END */\r
+}\r
+\r
+\r
+#if 0\r
+/** @fn void phantomInterrupt(void)\r
+*   @brief DCAN3 High Level Interrupt Handler\r
+*/\r
+\r
+/* USER CODE BEGIN (51) */\r
+/* USER CODE END */\r
+\r
+#if 0\r
+    #pragma INTERRUPT(phantomInterrupt, IRQ)\r
+#endif\r
+\r
+void phantomInterrupt(void)\r
+{\r
+    unsigned value = canREG3->INT;\r
+\r
+/* USER CODE BEGIN (52) */\r
+/* USER CODE END */\r
+\r
+    if (value == 0x8000U)\r
+    {\r
+        canErrorNotification(canREG3, canREG3->ES & 0xE0U);\r
+        return;\r
+    }\r
+\r
+    /** - Setup IF1 for clear pending interrupt flag */\r
+    while (canREG3->IF1STAT & 0x80);\r
+\r
+    canREG3->IF1CMD = 0x08;\r
+    canREG3->IF1NO  = value;\r
+\r
+    while (canREG3->IF1STAT & 0x80);\r
+\r
+    canREG3->IF1CMD = 0x87;\r
+\r
+    canMessageNotification(canREG3, value);\r
+\r
+/* USER CODE BEGIN (53) */\r
+/* USER CODE END */\r
+}\r
+\r
+\r
+/** @fn void phantomInterrupt(void)\r
+*   @brief DCAN3 Low Level Interrupt Handler\r
+*/\r
+\r
+/* USER CODE BEGIN (54) */\r
+/* USER CODE END */\r
+\r
+#if 0\r
+    #pragma INTERRUPT(phantomInterrupt, IRQ)\r
+#endif\r
+\r
+void phantomInterrupt(void)\r
+{\r
+    unsigned messageBox = canREG3->INT >> 16U;\r
+\r
+/* USER CODE BEGIN (55) */\r
+/* USER CODE END */\r
+\r
+    /** - Setup IF1 for clear pending interrupt flag */\r
+    while (canREG3->IF1STAT & 0x80);\r
+\r
+    canREG3->IF1CMD = 0x08;\r
+    canREG3->IF1NO  = messageBox;\r
+\r
+    while (canREG3->IF1STAT & 0x80);\r
+\r
+    canREG3->IF1CMD = 0x87;\r
+\r
+    canMessageNotification(canREG3, messageBox);\r
+\r
+/* USER CODE BEGIN (56) */\r
+/* USER CODE END */\r
+}\r
+#endif\r
+\r
+#endif\r
diff --git a/arch/arm/arm_cr4/drivers/can.h b/arch/arm/arm_cr4/drivers/can.h
new file mode 100644 (file)
index 0000000..3e9a8af
--- /dev/null
@@ -0,0 +1,747 @@
+/** @file can.h\r
+*   @brief CAN Driver Header File\r
+*   @date 10.August.2009\r
+*   @version 1.00.000\r
+*   \r
+*   This file contains:\r
+*   - Definitions\r
+*   - Types\r
+*   - Interface Prototypes\r
+*   .\r
+*   which are relevant for the CAN driver.\r
+*/\r
+\r
+/* (c) Texas Instruments 2009, All rights reserved. */\r
+\r
+\r
+#ifndef __CAN_H__\r
+#define __CAN_H__\r
+\r
+/* USER CODE BEGIN (0) */\r
+/* USER CODE END */\r
+\r
+\r
+/* CAN General Definitions */\r
+\r
+/** @def canLEVEL_ACTIVE\r
+*   @brief Alias name for CAN error operation level active (Error couter 0-95)  \r
+*/\r
+#define canLEVEL_ACTIVE 0x00U\r
+\r
+/** @def canLEVEL_WARNING\r
+*   @brief Alias name for CAN error operation level warning (Error couter 96-127)  \r
+*/\r
+#define canLEVEL_WARNING 0x40U\r
+\r
+/** @def canLEVEL_PASSIVE\r
+*   @brief Alias name for CAN error operation level passive (Error couter 128-255)  \r
+*/\r
+#define canLEVEL_PASSIVE 0x20U\r
+\r
+/** @def canLEVEL_BUS_OFF\r
+*   @brief Alias name for CAN error operation level bus off (Error couter 256)  \r
+*/\r
+#define canLEVEL_BUS_OFF 0x80U\r
+\r
+/** @def canERROR_NO\r
+*   @brief Alias name for no CAN error occured \r
+*/\r
+#define canERROR_OK 0U\r
+\r
+/** @def canERROR_STUFF\r
+*   @brief Alias name for CAN stuff error an RX message \r
+*/\r
+#define canERROR_STUFF 1U\r
+\r
+/** @def canERROR_FORMAT\r
+*   @brief Alias name for CAN form/format error an RX message \r
+*/\r
+#define canERROR_FORMAT 2U\r
+\r
+/** @def canERROR_ACKNOWLEDGE\r
+*   @brief Alias name for CAN TX message wasn't acknowledged  \r
+*/\r
+#define canERROR_ACKNOWLEDGE 3U\r
+\r
+/** @def canERROR_BIT1\r
+*   @brief Alias name for CAN TX message sendig recessive level but monitoring dominant  \r
+*/\r
+#define canERROR_BIT1 4U\r
+\r
+/** @def canERROR_BIT0\r
+*   @brief Alias name for CAN TX message sendig dominant level but monitoring recessive  \r
+*/\r
+#define canERROR_BIT0 5U\r
+\r
+/** @def canERROR_CRC\r
+*   @brief Alias name for CAN RX message received wrong CRC  \r
+*/\r
+#define canERROR_CRC 6U\r
+\r
+/** @def canERROR_NO\r
+*   @brief Alias name for CAN no message has send or received sinced last call of canGetLastError  \r
+*/\r
+#define canERROR_NO 7U\r
+\r
+/** @def canMESSAGE_BOX1\r
+*   @brief Alias name for CAN message box 1\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX1 1U\r
+\r
+/** @def canMESSAGE_BOX2\r
+*   @brief Alias name for CAN message box 2\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX2 2U\r
+\r
+/** @def canMESSAGE_BOX3\r
+*   @brief Alias name for CAN message box 3\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX3 3U\r
+\r
+/** @def canMESSAGE_BOX4\r
+*   @brief Alias name for CAN message box 4\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX4 4U\r
+\r
+/** @def canMESSAGE_BOX5\r
+*   @brief Alias name for CAN message box 5\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX5 5U\r
+\r
+/** @def canMESSAGE_BOX6\r
+*   @brief Alias name for CAN message box 6\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX6 6U\r
+\r
+/** @def canMESSAGE_BOX7\r
+*   @brief Alias name for CAN message box 7\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX7 7U\r
+\r
+/** @def canMESSAGE_BOX8\r
+*   @brief Alias name for CAN message box 8\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX8 8U\r
+\r
+/** @def canMESSAGE_BOX9\r
+*   @brief Alias name for CAN message box 9\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX9 9U\r
+\r
+/** @def canMESSAGE_BOX10\r
+*   @brief Alias name for CAN message box 10\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX10 10U\r
+\r
+/** @def canMESSAGE_BOX11\r
+*   @brief Alias name for CAN message box 11\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX11 11U\r
+\r
+/** @def canMESSAGE_BOX12\r
+*   @brief Alias name for CAN message box 12\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX12 12U\r
+\r
+/** @def canMESSAGE_BOX13\r
+*   @brief Alias name for CAN message box 13\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX13 13U\r
+\r
+/** @def canMESSAGE_BOX14\r
+*   @brief Alias name for CAN message box 14\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX14 14U\r
+\r
+/** @def canMESSAGE_BOX15\r
+*   @brief Alias name for CAN message box 15\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX15 15U\r
+\r
+/** @def canMESSAGE_BOX16\r
+*   @brief Alias name for CAN message box 16\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX16 16U\r
+\r
+/** @def canMESSAGE_BOX17\r
+*   @brief Alias name for CAN message box 17\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX17 17U\r
+\r
+/** @def canMESSAGE_BOX18\r
+*   @brief Alias name for CAN message box 18\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX18 18U\r
+\r
+/** @def canMESSAGE_BOX19\r
+*   @brief Alias name for CAN message box 19\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX19 19U\r
+\r
+/** @def canMESSAGE_BOX20\r
+*   @brief Alias name for CAN message box 20\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX20 20U\r
+\r
+/** @def canMESSAGE_BOX21\r
+*   @brief Alias name for CAN message box 21\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX21 21U\r
+\r
+/** @def canMESSAGE_BOX22\r
+*   @brief Alias name for CAN message box 22\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX22 22U\r
+\r
+/** @def canMESSAGE_BOX23\r
+*   @brief Alias name for CAN message box 23\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX23 23U\r
+\r
+/** @def canMESSAGE_BOX24\r
+*   @brief Alias name for CAN message box 24\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX24 24U\r
+\r
+/** @def canMESSAGE_BOX25\r
+*   @brief Alias name for CAN message box 25\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX25 25U\r
+\r
+/** @def canMESSAGE_BOX26\r
+*   @brief Alias name for CAN message box 26\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX26 26U\r
+\r
+/** @def canMESSAGE_BOX27\r
+*   @brief Alias name for CAN message box 27\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX27 27U\r
+\r
+/** @def canMESSAGE_BOX28\r
+*   @brief Alias name for CAN message box 28\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX28 28U\r
+\r
+/** @def canMESSAGE_BOX29\r
+*   @brief Alias name for CAN message box 29\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX29 29U\r
+\r
+/** @def canMESSAGE_BOX30\r
+*   @brief Alias name for CAN message box 30\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX30 30U\r
+\r
+/** @def canMESSAGE_BOX31\r
+*   @brief Alias name for CAN message box 31\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX31 31U\r
+\r
+/** @def canMESSAGE_BOX32\r
+*   @brief Alias name for CAN message box 32\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX32 32U\r
+\r
+/** @def canMESSAGE_BOX33\r
+*   @brief Alias name for CAN message box 33\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX33 33U\r
+\r
+/** @def canMESSAGE_BOX34\r
+*   @brief Alias name for CAN message box 34\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX34 34U\r
+\r
+/** @def canMESSAGE_BOX35\r
+*   @brief Alias name for CAN message box 35\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX35 35U\r
+\r
+/** @def canMESSAGE_BOX36\r
+*   @brief Alias name for CAN message box 36\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX36 36U\r
+\r
+/** @def canMESSAGE_BOX37\r
+*   @brief Alias name for CAN message box 37\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX37 37U\r
+\r
+/** @def canMESSAGE_BOX38\r
+*   @brief Alias name for CAN message box 38\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX38 38U\r
+\r
+/** @def canMESSAGE_BOX39\r
+*   @brief Alias name for CAN message box 39\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX39 39U\r
+\r
+/** @def canMESSAGE_BOX40\r
+*   @brief Alias name for CAN message box 40\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX40 40U\r
+\r
+/** @def canMESSAGE_BOX41\r
+*   @brief Alias name for CAN message box 41\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX41 41U\r
+\r
+/** @def canMESSAGE_BOX42\r
+*   @brief Alias name for CAN message box 42\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX42 42U\r
+\r
+/** @def canMESSAGE_BOX43\r
+*   @brief Alias name for CAN message box 43\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX43 43U\r
+\r
+/** @def canMESSAGE_BOX44\r
+*   @brief Alias name for CAN message box 44\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX44 44U\r
+\r
+/** @def canMESSAGE_BOX45\r
+*   @brief Alias name for CAN message box 45\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX45 45U\r
+\r
+/** @def canMESSAGE_BOX46\r
+*   @brief Alias name for CAN message box 46\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX46 46U\r
+\r
+/** @def canMESSAGE_BOX47\r
+*   @brief Alias name for CAN message box 47\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX47 47U\r
+\r
+/** @def canMESSAGE_BOX48\r
+*   @brief Alias name for CAN message box 48\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX48 48U\r
+\r
+/** @def canMESSAGE_BOX49\r
+*   @brief Alias name for CAN message box 49\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX49 49U\r
+\r
+/** @def canMESSAGE_BOX50\r
+*   @brief Alias name for CAN message box 50\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX50 50U\r
+\r
+/** @def canMESSAGE_BOX51\r
+*   @brief Alias name for CAN message box 51\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX51 51U\r
+\r
+/** @def canMESSAGE_BOX52\r
+*   @brief Alias name for CAN message box 52\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX52 52U\r
+\r
+/** @def canMESSAGE_BOX53\r
+*   @brief Alias name for CAN message box 53\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX53 53U\r
+\r
+/** @def canMESSAGE_BOX54\r
+*   @brief Alias name for CAN message box 54\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX54 54U\r
+\r
+/** @def canMESSAGE_BOX55\r
+*   @brief Alias name for CAN message box 55\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX55 55U\r
+\r
+/** @def canMESSAGE_BOX56\r
+*   @brief Alias name for CAN message box 56\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX56 56U\r
+\r
+/** @def canMESSAGE_BOX57\r
+*   @brief Alias name for CAN message box 57\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX57 57U\r
+\r
+/** @def canMESSAGE_BOX58\r
+*   @brief Alias name for CAN message box 58\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX58 58U\r
+\r
+/** @def canMESSAGE_BOX59\r
+*   @brief Alias name for CAN message box 59\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX59 59U\r
+\r
+/** @def canMESSAGE_BOX60\r
+*   @brief Alias name for CAN message box 60\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX60 60U\r
+\r
+/** @def canMESSAGE_BOX61\r
+*   @brief Alias name for CAN message box 61\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX61 61U\r
+\r
+/** @def canMESSAGE_BOX62\r
+*   @brief Alias name for CAN message box 62\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX62 62U\r
+\r
+/** @def canMESSAGE_BOX63\r
+*   @brief Alias name for CAN message box 63\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX63 63U\r
+\r
+/** @def canMESSAGE_BOX64\r
+*   @brief Alias name for CAN message box 64\r
+*\r
+*   @note This value should be used for API argument @a messageBox\r
+*/\r
+#define canMESSAGE_BOX64 64U\r
+\r
+/* USER CODE BEGIN (1) */\r
+/* USER CODE END */\r
+\r
+\r
+/** @struct canBase\r
+*   @brief CAN Register Frame Definition\r
+*\r
+*   This type is used to access the CAN Registers.\r
+*/\r
+/** @typedef canBASE_t\r
+*   @brief CAN Register Frame Type Definition\r
+*\r
+*   This type is used to access the CAN Registers.\r
+*/\r
+typedef volatile struct canBase\r
+{\r
+    unsigned      CTL;          /**< 0x0000: Control Register                       */\r
+    unsigned      ES;           /**< 0x0004: Error and Status Register              */\r
+    unsigned      EERC;         /**< 0x0008: Error Counter Register                 */\r
+    unsigned      BTR;          /**< 0x000C: Bit Timing Register                    */\r
+    unsigned      INT;          /**< 0x0010: Interrupt Register                     */\r
+    unsigned      TEST;         /**< 0x0014: Test Register                          */\r
+    unsigned      : 32U;        /**< 0x0018: Reserved                               */\r
+    unsigned      PERR;         /**< 0x001C: Parity/SECDED Error Code Register      */\r
+    unsigned      REL;          /**< 0x0020: Core Release Register                  */\r
+    unsigned      ECCDIAG;      /**< 0x0024: ECC Diagnostic Register                */\r
+    unsigned      ECCDIADSTAT;  /**< 0x0028: ECC Diagnostic Status Register         */\r
+    unsigned      : 32U;        /**< 0x002C: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0030: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0034: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0038: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x003C: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0040: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0044: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0048: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x004C: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0050: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0054: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0058: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x005C: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0060: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0064: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0068: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x006C: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0070: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0074: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0078: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x007C: Reserved                               */\r
+    unsigned      ABOTR;        /**< 0x0080: Auto Bus On Time Register              */\r
+    unsigned      TXRQX;        /**< 0x0084: Transmission Request X Register        */\r
+    unsigned      TXRQx[4U];    /**< 0x0088-0x0094: Transmission Request Registers  */\r
+    unsigned      NWDATX;       /**< 0x0098: New Data X Register                    */\r
+    unsigned      NWDATx[4U];   /**< 0x009C-0x00A8: New Data Registers              */\r
+    unsigned      INTPNDX;      /**< 0x00AC: Interrupt Pending X Register           */\r
+    unsigned      INTPNDx[4U];  /**< 0x00B0-0x00BC: Interrupt Pending Registers     */\r
+    unsigned      MSGVALX;      /**< 0x00C0: Message Valid X Register               */\r
+    unsigned      MSGVALx[4U];  /**< 0x00C4-0x00D0: Message Valid Registers         */\r
+    unsigned      : 32U;        /**< 0x00D4: Reserved                               */\r
+    unsigned      INTMUXx[4U];  /**< 0x00D8-0x00E4: Interrupt Multiplexer Registers */\r
+    unsigned      : 32U;        /**< 0x00E8: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x00EC: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x00F0: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x00F4: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x00F8: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x00FC: Reserved                               */\r
+#ifdef _little_endian__\r
+    unsigned char IF1NO;        /**< 0x0100: IF1 Command Register, Msg Number       */\r
+    unsigned char IF1STAT;      /**< 0x0100: IF1 Command Register, Status           */\r
+    unsigned char IF1CMD;       /**< 0x0100: IF1 Command Register, Command          */\r
+    unsigned      : 8U;         /**< 0x0100: IF1 Command Register, Reserved         */\r
+#else\r
+    unsigned      : 8U;         /**< 0x0100: IF1 Command Register, Reserved         */\r
+    unsigned char IF1CMD;       /**< 0x0100: IF1 Command Register, Command          */\r
+    unsigned char IF1STAT;      /**< 0x0100: IF1 Command Register, Status           */\r
+    unsigned char IF1NO;        /**< 0x0100: IF1 Command Register, Msg Number       */\r
+#endif\r
+    unsigned      IF1MSK;       /**< 0x0104: IF1 Mask Register                      */\r
+    unsigned      IF1ARB;       /**< 0x0108: IF1 Arbitration Register               */\r
+    unsigned      IF1MCTL;      /**< 0x010C: IF1 Message Control Register           */\r
+    unsigned char IF1DATx[8U];  /**< 0x0110-0x0114: IF1 Data A and B Registers      */\r
+    unsigned      : 32U;        /**< 0x0118: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x011C: Reserved                               */\r
+#ifdef _little_endian__\r
+    unsigned char IF2NO;        /**< 0x0100: IF2 Command Register, Msg No           */\r
+    unsigned char IF2STAT;      /**< 0x0100: IF2 Command Register, Status           */\r
+    unsigned char IF2CMD;       /**< 0x0100: IF2 Command Register, Command          */\r
+    unsigned      : 8U;         /**< 0x0100: IF2 Command Register, Reserved         */\r
+#else\r
+    unsigned      : 8U;         /**< 0x0100: IF2 Command Register, Reserved         */\r
+    unsigned char IF2CMD;       /**< 0x0100: IF2 Command Register, Command          */\r
+    unsigned char IF2STAT;      /**< 0x0100: IF2 Command Register, Status           */\r
+    unsigned char IF2NO;        /**< 0x0100: IF2 Command Register, Msg Number       */\r
+#endif\r
+    unsigned      IF2MSK;       /**< 0x0124: IF2 Mask Register                      */\r
+    unsigned      IF2ARB;       /**< 0x0128: IF2 Arbitration Register               */\r
+    unsigned      IF2MCTL;      /**< 0x012C: IF2 Message Control Register           */\r
+    unsigned char IF2DATx[8U];  /**< 0x0130-0x0134: IF2 Data A and B Registers      */\r
+    unsigned      : 32U;        /**< 0x0138: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x013C: Reserved                               */\r
+    unsigned      IF3OBS;       /**< 0x0140: IF3 Observation Register               */\r
+    unsigned      IF3MSK;       /**< 0x0144: IF3 Mask Register                      */\r
+    unsigned      IF3ARB;       /**< 0x0148: IF3 Arbitration Register               */\r
+    unsigned      IF3MCTL;      /**< 0x014C: IF3 Message Control Register           */\r
+    unsigned char IF3DATx[8U];  /**< 0x0150-0x0154: IF3 Data A and B Registers      */\r
+    unsigned      : 32U;        /**< 0x0158: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x015C: Reserved                               */\r
+    unsigned      IF3UEy[4U];   /**< 0x0160-0x016C: IF3 Update Enable Registers     */\r
+    unsigned      : 32U;        /**< 0x0170: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0174: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0178: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x017C: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0180: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0184: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0188: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x018C: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0190: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0194: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x0198: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x019C: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x01A0: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x01A4: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x01A8: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x01AC: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x01B0: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x01B4: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x01B8: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x01BC: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x01C0: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x01C4: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x01C8: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x01CC: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x01D0: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x01D4: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x01D8: Reserved                               */\r
+    unsigned      : 32U;        /**< 0x01DC: Reserved                               */\r
+    unsigned      TIOC;         /**< 0x01E0: TX IO Control Register                 */\r
+    unsigned      RIOC;         /**< 0x01E4: RX IO Control Register                 */\r
+} canBASE_t;\r
+\r
+\r
+/** @def canREG1\r
+*   @brief DCAN1 Register Frame Pointer\r
+*\r
+*   This pointer is used by the CAN driver to access the DCAN1 registers.\r
+*/\r
+#define canREG1 ((canBASE_t *)0xFFF7DC00U)\r
+\r
+/** @def canREG2\r
+*   @brief DCAN2 Register Frame Pointer\r
+*\r
+*   This pointer is used by the CAN driver to access the DCAN2 registers.\r
+*/\r
+#define canREG2 ((canBASE_t *)0xFFF7DE00U)\r
+\r
+/** @def canREG3\r
+*   @brief DCAN3 Register Frame Pointer\r
+*\r
+*   This pointer is used by the CAN driver to access the DCAN3 registers.\r
+*/\r
+#define canREG3 ((canBASE_t *)0xFFF7E000U)\r
+\r
+/* USER CODE BEGIN (2) */\r
+/* USER CODE END */\r
+\r
+\r
+/* CAN Interface Functions */\r
+\r
+void     canInit(void);\r
+unsigned canTransmit(canBASE_t *node, unsigned messageBox, const unsigned char *data);\r
+unsigned canGetData(canBASE_t *node, unsigned messageBox, unsigned char * const data);\r
+unsigned canIsTxMessagePending(canBASE_t *node, unsigned messageBox);\r
+unsigned canIsRxMessageArrived(canBASE_t *node, unsigned messageBox);\r
+unsigned canIsMessageBoxValid(canBASE_t *node, unsigned messageBox);\r
+unsigned canGetLastError(canBASE_t *node);\r
+unsigned canGetErrorLevel(canBASE_t *node);\r
+void     canEnableErrorNotification(canBASE_t *node);\r
+void     canDisableErrorNotification(canBASE_t *node);\r
+unsigned canEnableMessageNotification(canBASE_t *node, unsigned messageBox);\r
+unsigned canDisableMessageNotification(canBASE_t *node, unsigned messageBox);\r
+\r
+/** @fn void canErrorNotification(canBASE_t *node, unsigned notification)\r
+*   @brief Error notification\r
+*   @param[in] node Pointer to CAN node:\r
+*              - canREG1: DCAN1 node pointer\r
+*              - canREG2: DCAN2 node pointer\r
+*              - canREG3: DCAN3 node pointer\r
+*   @param[in] notification Error notification code:\r
+*           - canLEVEL_WARNING (0x40): When RX- or TX error counter are between 96 and 127     \r
+*           - canLEVEL_BUS_OFF (0x80): When RX- or TX error counter are above 255     \r
+*\r
+*   @note This function has to be provide by the user.\r
+*/\r
+void canErrorNotification(canBASE_t *node, unsigned notification);\r
+\r
+/** @fn void canMessageNotification(canBASE_t *node, unsigned messageBox)\r
+*   @brief Message notification\r
+*   @param[in] node Pointer to CAN node:\r
+*              - canREG1: DCAN1 node pointer\r
+*              - canREG2: DCAN2 node pointer\r
+*              - canREG3: DCAN3 node pointer\r
+*   @param[in] messageBox Message box number of CAN node:\r
+*              - canMESSAGE_BOX1: CAN message box 1\r
+*              - canMESSAGE_BOXn: CAN message box n [n: 1-64]\r
+*              - canMESSAGE_BOX64: CAN message box 64\r
+*\r
+*   @note This function has to be provide by the user.\r
+*/\r
+void canMessageNotification(canBASE_t *node, unsigned messageBox);\r
+\r
+/* USER CODE BEGIN (3) */\r
+/* USER CODE END */\r
+\r
+\r
+#endif\r
index 57137a2d3960ef5976b13d25136e92485e5b7ba9..bd4d0b60b04e44930610970000c2b67770b24fe5 100644 (file)
@@ -15,8 +15,7 @@
 \r
 #include "internal.h"\r
 #include "stack.h"\r
-#include "stm32f10x.h"\r
-#include "core_cm3.h"\r
+#include "core_cr4.h"\r
 \r
 \r
 /**\r
index 98a4dc9922c31d69fe81cdfe1ff7d288791b0fee..897bc79a0816be102e01db841c01589f964d35ab 100644 (file)
 #define IRQ_DISABLE()          cpsid   i\r
 \r
 \r
+\r
+\r
+\r
+\r
 // lr\r
 #define REG_SAVE r4-r8,r10,r11\r
 \r
 \r
 Irq_Handler:\r
+       mov   r2,               #0xDF  // Swich back to sys mode.\r
+    msr   cpsr_c,   r2\r
     push    {REG_SAVE,lr}\r
     sub.w   sp,sp,#C_SIZE\r
     mov.w   r4,#LC_PATTERN\r
@@ -45,7 +51,7 @@ Irq_Handler:
     bx                 lr\r
 \r
 //    b                os_lc_restore\r
-       \r
+\r
        \r
 /**\r
  * Fake an interrupt stack to be able to return to thread mode.\r
diff --git a/arch/arm/arm_cr4/kernel/core_cm3.c b/arch/arm/arm_cr4/kernel/core_cm3.c
deleted file mode 100644 (file)
index 2c4581e..0000000
+++ /dev/null
@@ -1,830 +0,0 @@
-\r
-/******************************************************************************\r
- * @file:    core_cm3.c\r
- * @purpose: CMSIS Cortex-M3 Core Peripheral Access Layer Source File\r
- * @version: V1.20\r
- * @date:    22. May 2009\r
- *----------------------------------------------------------------------------\r
- *\r
- * Copyright (C) 2009 ARM Limited. All rights reserved.\r
- *\r
- * ARM Limited (ARM) is supplying this software for use with Cortex-Mx \r
- * processor based microcontrollers.  This file can be freely distributed \r
- * within development tools that are supporting such ARM based processors. \r
- *\r
- * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED\r
- * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF\r
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.\r
- * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR\r
- * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.\r
- *\r
- ******************************************************************************/\r
-\r
-\r
-\r
-#include <stdint.h>\r
-\r
-\r
-/* define compiler specific symbols */\r
-#if defined   ( __CC_ARM   )\r
-  #define __ASM            __asm           /*!< asm keyword for armcc           */\r
-  #define __INLINE         __inline        /*!< inline keyword for armcc        */\r
-\r
-#elif defined ( __ICCARM__ )\r
-  #define __ASM           __asm            /*!< asm keyword for iarcc           */\r
-  #define __INLINE        inline           /*!< inline keyword for iarcc. Only avaiable in High optimization mode! */\r
-\r
-#elif defined (  __GNUC__  )\r
-  #define __ASM             __asm          /*!< asm keyword for gcc            */\r
-  #define __INLINE          inline         /*!< inline keyword for gcc         */\r
-\r
-#elif defined   (  __TASKING__  )\r
-  #define __ASM            __asm           /*!< asm keyword for TASKING Compiler          */\r
-  #define __INLINE         inline          /*!< inline keyword for TASKING Compiler       */\r
-\r
-#endif\r
-\r
-\r
-\r
-#if defined ( __CC_ARM   ) /*------------------RealView Compiler -----------------*/\r
-\r
-/**\r
- * @brief  Return the Process Stack Pointer\r
- *\r
- * @param  none\r
- * @return uint32_t ProcessStackPointer\r
- *\r
- * Return the actual process stack pointer\r
- */\r
-__ASM uint32_t __get_PSP(void)\r
-{\r
-  mrs r0, psp\r
-  bx lr\r
-}\r
-\r
-/**\r
- * @brief  Set the Process Stack Pointer\r
- *\r
- * @param  uint32_t Process Stack Pointer\r
- * @return none\r
- *\r
- * Assign the value ProcessStackPointer to the MSP \r
- * (process stack pointer) Cortex processor register\r
- */\r
-__ASM void __set_PSP(uint32_t topOfProcStack)\r
-{\r
-  msr psp, r0\r
-  bx lr\r
-}\r
-\r
-/**\r
- * @brief  Return the Main Stack Pointer\r
- *\r
- * @param  none\r
- * @return uint32_t Main Stack Pointer\r
- *\r
- * Return the current value of the MSP (main stack pointer)\r
- * Cortex processor register\r
- */\r
-__ASM uint32_t __get_MSP(void)\r
-{\r
-  mrs r0, msp\r
-  bx lr\r
-}\r
-\r
-/**\r
- * @brief  Set the Main Stack Pointer\r
- *\r
- * @param  uint32_t Main Stack Pointer\r
- * @return none\r
- *\r
- * Assign the value mainStackPointer to the MSP \r
- * (main stack pointer) Cortex processor register\r
- */\r
-__ASM void __set_MSP(uint32_t mainStackPointer)\r
-{\r
-  msr msp, r0\r
-  bx lr\r
-}\r
-\r
-/**\r
- * @brief  Reverse byte order in unsigned short value\r
- *\r
- * @param  uint16_t value to reverse\r
- * @return uint32_t reversed value\r
- *\r
- * Reverse byte order in unsigned short value\r
- */\r
-__ASM uint32_t __REV16(uint16_t value)\r
-{\r
-  rev16 r0, r0\r
-  bx lr\r
-}\r
-\r
-/**\r
- * @brief  Reverse byte order in signed short value with sign extension to integer\r
- *\r
- * @param  int16_t value to reverse\r
- * @return int32_t reversed value\r
- *\r
- * Reverse byte order in signed short value with sign extension to integer\r
- */\r
-__ASM int32_t __REVSH(int16_t value)\r
-{\r
-  revsh r0, r0\r
-  bx lr\r
-}\r
-\r
-\r
-#if (__ARMCC_VERSION < 400000)\r
-\r
-/**\r
- * @brief  Remove the exclusive lock created by ldrex\r
- *\r
- * @param  none\r
- * @return none\r
- *\r
- * Removes the exclusive lock which is created by ldrex.\r
- */\r
-__ASM void __CLREX(void)\r
-{\r
-  clrex\r
-}\r
-\r
-/**\r
- * @brief  Return the Base Priority value\r
- *\r
- * @param  none\r
- * @return uint32_t BasePriority\r
- *\r
- * Return the content of the base priority register\r
- */\r
-__ASM uint32_t  __get_BASEPRI(void)\r
-{\r
-  mrs r0, basepri\r
-  bx lr\r
-}\r
-\r
-/**\r
- * @brief  Set the Base Priority value\r
- *\r
- * @param  uint32_t BasePriority\r
- * @return none\r
- *\r
- * Set the base priority register\r
- */\r
-__ASM void __set_BASEPRI(uint32_t basePri)\r
-{\r
-  msr basepri, r0\r
-  bx lr\r
-}\r
-\r
-/**\r
- * @brief  Return the Priority Mask value\r
- *\r
- * @param  none\r
- * @return uint32_t PriMask\r
- *\r
- * Return the state of the priority mask bit from the priority mask\r
- * register\r
- */\r
-__ASM uint32_t __get_PRIMASK(void)\r
-{\r
-  mrs r0, primask\r
-  bx lr\r
-}\r
-\r
-/**\r
- * @brief  Set the Priority Mask value\r
- *\r
- * @param  uint32_t PriMask\r
- * @return none\r
- *\r
- * Set the priority mask bit in the priority mask register\r
- */\r
-__ASM void __set_PRIMASK(uint32_t priMask)\r
-{\r
-  msr primask, r0\r
-  bx lr\r
-}\r
-\r
-/**\r
- * @brief  Return the Fault Mask value\r
- *\r
- * @param  none\r
- * @return uint32_t FaultMask\r
- *\r
- * Return the content of the fault mask register\r
- */\r
-__ASM uint32_t  __get_FAULTMASK(void)\r
-{\r
-  mrs r0, faultmask\r
-  bx lr\r
-}\r
-\r
-/**\r
- * @brief  Set the Fault Mask value\r
- *\r
- * @param  uint32_t faultMask value\r
- * @return none\r
- *\r
- * Set the fault mask register\r
- */\r
-__ASM void __set_FAULTMASK(uint32_t faultMask)\r
-{\r
-  msr faultmask, r0\r
-  bx lr\r
-}\r
-\r
-/**\r
- * @brief  Return the Control Register value\r
- * \r
- * @param  none\r
- * @return uint32_t Control value\r
- *\r
- * Return the content of the control register\r
- */\r
-__ASM uint32_t  __get_CONTROL(void)\r
-{\r
-  mrs r0, control\r
-  bx lr\r
-}\r
-\r
-/**\r
- * @brief  Set the Control Register value\r
- *\r
- * @param  uint32_t Control value\r
- * @return none\r
- *\r
- * Set the control register\r
- */\r
-__ASM void __set_CONTROL(uint32_t control)\r
-{\r
-  msr control, r0\r
-  bx lr\r
-}\r
-\r
-#endif /* __ARMCC_VERSION  */ \r
-\r
-\r
-#elif (defined (__ICCARM__)) /*------------------ ICC Compiler -------------------*/\r
-#pragma diag_suppress=Pe940\r
-\r
-/**\r
- * @brief  Return the Process Stack Pointer\r
- *\r
- * @param  none\r
- * @return uint32_t ProcessStackPointer\r
- *\r
- * Return the actual process stack pointer\r
- */\r
-uint32_t __get_PSP(void)\r
-{\r
-  __ASM("mrs r0, psp");\r
-  __ASM("bx lr");\r
-}\r
-\r
-/**\r
- * @brief  Set the Process Stack Pointer\r
- *\r
- * @param  uint32_t Process Stack Pointer\r
- * @return none\r
- *\r
- * Assign the value ProcessStackPointer to the MSP \r
- * (process stack pointer) Cortex processor register\r
- */\r
-void __set_PSP(uint32_t topOfProcStack)\r
-{\r
-  __ASM("msr psp, r0");\r
-  __ASM("bx lr");\r
-}\r
-\r
-/**\r
- * @brief  Return the Main Stack Pointer\r
- *\r
- * @param  none\r
- * @return uint32_t Main Stack Pointer\r
- *\r
- * Return the current value of the MSP (main stack pointer)\r
- * Cortex processor register\r
- */\r
-uint32_t __get_MSP(void)\r
-{\r
-  __ASM("mrs r0, msp");\r
-  __ASM("bx lr");\r
-}\r
-\r
-/**\r
- * @brief  Set the Main Stack Pointer\r
- *\r
- * @param  uint32_t Main Stack Pointer\r
- * @return none\r
- *\r
- * Assign the value mainStackPointer to the MSP \r
- * (main stack pointer) Cortex processor register\r
- */\r
-void __set_MSP(uint32_t topOfMainStack)\r
-{\r
-  __ASM("msr msp, r0");\r
-  __ASM("bx lr");\r
-}\r
-\r
-/**\r
- * @brief  Reverse byte order in unsigned short value\r
- *\r
- * @param  uint16_t value to reverse\r
- * @return uint32_t reversed value\r
- *\r
- * Reverse byte order in unsigned short value\r
- */\r
-uint32_t __REV16(uint16_t value)\r
-{\r
-  __ASM("rev16 r0, r0");\r
-  __ASM("bx lr");\r
-}\r
-\r
-/**\r
- * @brief  Reverse bit order of value\r
- *\r
- * @param  uint32_t value to reverse\r
- * @return uint32_t reversed value\r
- *\r
- * Reverse bit order of value\r
- */\r
-uint32_t __RBIT(uint32_t value)\r
-{\r
-  __ASM("rbit r0, r0");\r
-  __ASM("bx lr");\r
-}\r
-\r
-/**\r
- * @brief  LDR Exclusive\r
- *\r
- * @param  uint8_t* address\r
- * @return uint8_t value of (*address)\r
- *\r
- * Exclusive LDR command\r
- */\r
-uint8_t __LDREXB(uint8_t *addr)\r
-{\r
-  __ASM("ldrexb r0, [r0]");\r
-  __ASM("bx lr"); \r
-}\r
-\r
-/**\r
- * @brief  LDR Exclusive\r
- *\r
- * @param  uint16_t* address\r
- * @return uint16_t value of (*address)\r
- *\r
- * Exclusive LDR command\r
- */\r
-uint16_t __LDREXH(uint16_t *addr)\r
-{\r
-  __ASM("ldrexh r0, [r0]");\r
-  __ASM("bx lr");\r
-}\r
-\r
-/**\r
- * @brief  LDR Exclusive\r
- *\r
- * @param  uint32_t* address\r
- * @return uint32_t value of (*address)\r
- *\r
- * Exclusive LDR command\r
- */\r
-uint32_t __LDREXW(uint32_t *addr)\r
-{\r
-  __ASM("ldrex r0, [r0]");\r
-  __ASM("bx lr");\r
-}\r
-\r
-/**\r
- * @brief  STR Exclusive\r
- *\r
- * @param  uint8_t *address\r
- * @param  uint8_t value to store\r
- * @return uint32_t successful / failed\r
- *\r
- * Exclusive STR command\r
- */\r
-uint32_t __STREXB(uint8_t value, uint8_t *addr)\r
-{\r
-  __ASM("strexb r0, r0, [r1]");\r
-  __ASM("bx lr");\r
-}\r
-\r
-/**\r
- * @brief  STR Exclusive\r
- *\r
- * @param  uint16_t *address\r
- * @param  uint16_t value to store\r
- * @return uint32_t successful / failed\r
- *\r
- * Exclusive STR command\r
- */\r
-uint32_t __STREXH(uint16_t value, uint16_t *addr)\r
-{\r
-  __ASM("strexh r0, r0, [r1]");\r
-  __ASM("bx lr");\r
-}\r
-\r
-/**\r
- * @brief  STR Exclusive\r
- *\r
- * @param  uint32_t *address\r
- * @param  uint32_t value to store\r
- * @return uint32_t successful / failed\r
- *\r
- * Exclusive STR command\r
- */\r
-uint32_t __STREXW(uint32_t value, uint32_t *addr)\r
-{\r
-  __ASM("strex r0, r0, [r1]");\r
-  __ASM("bx lr");\r
-}\r
-\r
-#pragma diag_default=Pe940\r
-\r
-\r
-#elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/\r
-\r
-/**\r
- * @brief  Return the Process Stack Pointer\r
- *\r
- * @param  none\r
- * @return uint32_t ProcessStackPointer\r
- *\r
- * Return the actual process stack pointer\r
- */\r
-uint32_t __get_PSP(void) __attribute__( ( naked ) );\r
-uint32_t __get_PSP(void)\r
-{\r
-  uint32_t result=0;\r
-\r
-  __ASM volatile ("MRS %0, psp\n\t" \r
-                  "MOV r0, %0 \n\t"\r
-                  "BX  lr     \n\t"  : "=r" (result) );\r
-  return(result);\r
-}\r
-\r
-\r
-/**\r
- * @brief  Set the Process Stack Pointer\r
- *\r
- * @param  uint32_t Process Stack Pointer\r
- * @return none\r
- *\r
- * Assign the value ProcessStackPointer to the MSP \r
- * (process stack pointer) Cortex processor register\r
- */\r
-void __set_PSP(uint32_t topOfProcStack) __attribute__( ( naked ) );\r
-void __set_PSP(uint32_t topOfProcStack)\r
-{\r
-  __ASM volatile ("MSR psp, %0\n\t"\r
-                  "BX  lr     \n\t" : : "r" (topOfProcStack) );\r
-}\r
-\r
-/**\r
- * @brief  Return the Main Stack Pointer\r
- *\r
- * @param  none\r
- * @return uint32_t Main Stack Pointer\r
- *\r
- * Return the current value of the MSP (main stack pointer)\r
- * Cortex processor register\r
- */\r
-uint32_t __get_MSP(void) __attribute__( ( naked ) );\r
-uint32_t __get_MSP(void)\r
-{\r
-  uint32_t result=0;\r
-\r
-  __ASM volatile ("MRS %0, msp\n\t" \r
-                  "MOV r0, %0 \n\t"\r
-                  "BX  lr     \n\t"  : "=r" (result) );\r
-  return(result);\r
-}\r
-\r
-/**\r
- * @brief  Set the Main Stack Pointer\r
- *\r
- * @param  uint32_t Main Stack Pointer\r
- * @return none\r
- *\r
- * Assign the value mainStackPointer to the MSP \r
- * (main stack pointer) Cortex processor register\r
- */\r
-void __set_MSP(uint32_t topOfMainStack) __attribute__( ( naked ) );\r
-void __set_MSP(uint32_t topOfMainStack)\r
-{\r
-  __ASM volatile ("MSR msp, %0\n\t"\r
-                  "BX  lr     \n\t" : : "r" (topOfMainStack) );\r
-}\r
-\r
-/**\r
- * @brief  Return the Base Priority value\r
- *\r
- * @param  none\r
- * @return uint32_t BasePriority\r
- *\r
- * Return the content of the base priority register\r
- */\r
-uint32_t __get_BASEPRI(void)\r
-{\r
-  uint32_t result=0;\r
-  \r
-  __ASM volatile ("MRS %0, basepri_max" : "=r" (result) );\r
-  return(result);\r
-}\r
-\r
-/**\r
- * @brief  Set the Base Priority value\r
- *\r
- * @param  uint32_t BasePriority\r
- * @return none\r
- *\r
- * Set the base priority register\r
- */\r
-void __set_BASEPRI(uint32_t value)\r
-{\r
-  __ASM volatile ("MSR basepri, %0" : : "r" (value) );\r
-}\r
-\r
-/**\r
- * @brief  Return the Priority Mask value\r
- *\r
- * @param  none\r
- * @return uint32_t PriMask\r
- *\r
- * Return the state of the priority mask bit from the priority mask\r
- * register\r
- */\r
-uint32_t __get_PRIMASK(void)\r
-{\r
-  uint32_t result=0;\r
-\r
-  __ASM volatile ("MRS %0, primask" : "=r" (result) );\r
-  return(result);\r
-}\r
-\r
-/**\r
- * @brief  Set the Priority Mask value\r
- *\r
- * @param  uint32_t PriMask\r
- * @return none\r
- *\r
- * Set the priority mask bit in the priority mask register\r
- */\r
-void __set_PRIMASK(uint32_t priMask)\r
-{\r
-  __ASM volatile ("MSR primask, %0" : : "r" (priMask) );\r
-}\r
-\r
-/**\r
- * @brief  Return the Fault Mask value\r
- *\r
- * @param  none\r
- * @return uint32_t FaultMask\r
- *\r
- * Return the content of the fault mask register\r
- */\r
-uint32_t __get_FAULTMASK(void)\r
-{\r
-  uint32_t result=0;\r
-  \r
-  __ASM volatile ("MRS %0, faultmask" : "=r" (result) );\r
-  return(result);\r
-}\r
-\r
-/**\r
- * @brief  Set the Fault Mask value\r
- *\r
- * @param  uint32_t faultMask value\r
- * @return none\r
- *\r
- * Set the fault mask register\r
- */\r
-void __set_FAULTMASK(uint32_t faultMask)\r
-{\r
-  __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) );\r
-}\r
-\r
-/**\r
- * @brief  Reverse byte order in integer value\r
- *\r
- * @param  uint32_t value to reverse\r
- * @return uint32_t reversed value\r
- *\r
- * Reverse byte order in integer value\r
- */\r
-uint32_t __REV(uint32_t value)\r
-{\r
-  uint32_t result=0;\r
-  \r
-  __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) );\r
-  return(result);\r
-}\r
-\r
-/**\r
- * @brief  Reverse byte order in unsigned short value\r
- *\r
- * @param  uint16_t value to reverse\r
- * @return uint32_t reversed value\r
- *\r
- * Reverse byte order in unsigned short value\r
- */\r
-uint32_t __REV16(uint16_t value)\r
-{\r
-  uint32_t result=0;\r
-  \r
-  __ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) );\r
-  return(result);\r
-}\r
-\r
-/**\r
- * @brief  Reverse byte order in signed short value with sign extension to integer\r
- *\r
- * @param  int32_t value to reverse\r
- * @return int32_t reversed value\r
- *\r
- * Reverse byte order in signed short value with sign extension to integer\r
- */\r
-int32_t __REVSH(int16_t value)\r
-{\r
-  uint32_t result=0;\r
-  \r
-  __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) );\r
-  return(result);\r
-}\r
-\r
-/**\r
- * @brief  Reverse bit order of value\r
- *\r
- * @param  uint32_t value to reverse\r
- * @return uint32_t reversed value\r
- *\r
- * Reverse bit order of value\r
- */\r
-uint32_t __RBIT(uint32_t value)\r
-{\r
-  uint32_t result=0;\r
-  \r
-   __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) );\r
-   return(result);\r
-}\r
-\r
-/**\r
- * @brief  LDR Exclusive\r
- *\r
- * @param  uint8_t* address\r
- * @return uint8_t value of (*address)\r
- *\r
- * Exclusive LDR command\r
- */\r
-uint8_t __LDREXB(uint8_t *addr)\r
-{\r
-    uint8_t result=0;\r
-  \r
-   __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) );\r
-   return(result);\r
-}\r
-\r
-/**\r
- * @brief  LDR Exclusive\r
- *\r
- * @param  uint16_t* address\r
- * @return uint16_t value of (*address)\r
- *\r
- * Exclusive LDR command\r
- */\r
-uint16_t __LDREXH(uint16_t *addr)\r
-{\r
-    uint16_t result=0;\r
-  \r
-   __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) );\r
-   return(result);\r
-}\r
-\r
-/**\r
- * @brief  LDR Exclusive\r
- *\r
- * @param  uint32_t* address\r
- * @return uint32_t value of (*address)\r
- *\r
- * Exclusive LDR command\r
- */\r
-uint32_t __LDREXW(uint32_t *addr)\r
-{\r
-    uint32_t result=0;\r
-  \r
-   __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) );\r
-   return(result);\r
-}\r
-\r
-/**\r
- * @brief  STR Exclusive\r
- *\r
- * @param  uint8_t *address\r
- * @param  uint8_t value to store\r
- * @return uint32_t successful / failed\r
- *\r
- * Exclusive STR command\r
- */\r
-uint32_t __STREXB(uint8_t value, uint8_t *addr)\r
-{\r
-   uint32_t result=0;\r
-  \r
-   __ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );\r
-   return(result);\r
-}\r
-\r
-/**\r
- * @brief  STR Exclusive\r
- *\r
- * @param  uint16_t *address\r
- * @param  uint16_t value to store\r
- * @return uint32_t successful / failed\r
- *\r
- * Exclusive STR command\r
- */\r
-uint32_t __STREXH(uint16_t value, uint16_t *addr)\r
-{\r
-   uint32_t result=0;\r
-  \r
-   __ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );\r
-   return(result);\r
-}\r
-\r
-/**\r
- * @brief  STR Exclusive\r
- *\r
- * @param  uint32_t *address\r
- * @param  uint32_t value to store\r
- * @return uint32_t successful / failed\r
- *\r
- * Exclusive STR command\r
- */\r
-uint32_t __STREXW(uint32_t value, uint32_t *addr)\r
-{\r
-   uint32_t result=0;\r
-  \r
-   __ASM volatile ("strex %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );\r
-   return(result);\r
-}\r
-\r
-/**\r
- * @brief  Return the Control Register value\r
- * \r
- * @param  none\r
- * @return uint32_t Control value\r
- *\r
- * Return the content of the control register\r
- */\r
-uint32_t __get_CONTROL(void)\r
-{\r
-  uint32_t result=0;\r
-\r
-  __ASM volatile ("MRS %0, control" : "=r" (result) );\r
-  return(result);\r
-}\r
-\r
-/**\r
- * @brief  Set the Control Register value\r
- *\r
- * @param  uint32_t Control value\r
- * @return none\r
- *\r
- * Set the control register\r
- */\r
-void __set_CONTROL(uint32_t control)\r
-{\r
-  __ASM volatile ("MSR control, %0" : : "r" (control) );\r
-}\r
-\r
-#elif (defined (__TASKING__)) /*------------------ TASKING Compiler ---------------------*/\r
-/* TASKING carm specific functions */\r
-\r
-/*\r
- * The CMSIS functions have been implemented as intrinsics in the compiler.\r
- * Please use "carm -?i" to get an up to date list of all instrinsics,\r
- * Including the CMSIS ones.\r
- */\r
-\r
-#endif\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
diff --git a/arch/arm/arm_cr4/kernel/core_cm3.h b/arch/arm/arm_cr4/kernel/core_cm3.h
deleted file mode 100644 (file)
index f4eae74..0000000
+++ /dev/null
@@ -1,1368 +0,0 @@
-\r
-/******************************************************************************\r
- * @file:    core_cm3.h\r
- * @purpose: CMSIS Cortex-M3 Core Peripheral Access Layer Header File\r
- * @version: V1.20\r
- * @date:    22. May 2009\r
- *----------------------------------------------------------------------------\r
- *\r
- * Copyright (C) 2009 ARM Limited. All rights reserved.\r
- *\r
- * ARM Limited (ARM) is supplying this software for use with Cortex-Mx \r
- * processor based microcontrollers.  This file can be freely distributed \r
- * within development tools that are supporting such ARM based processors. \r
- *\r
- * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED\r
- * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF\r
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.\r
- * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR\r
- * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.\r
- *\r
- ******************************************************************************/\r
-\r
-#ifndef __CM3_CORE_H__\r
-#define __CM3_CORE_H__\r
-\r
-#ifdef __cplusplus\r
- extern "C" {\r
-#endif \r
-\r
-#define __CM3_CMSIS_VERSION_MAIN  (0x01)                                                       /*!< [31:16] CMSIS HAL main version */\r
-#define __CM3_CMSIS_VERSION_SUB   (0x20)                                                       /*!< [15:0]  CMSIS HAL sub version  */\r
-#define __CM3_CMSIS_VERSION       ((__CM3_CMSIS_VERSION_MAIN << 16) | __CM3_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number       */\r
-\r
-#define __CORTEX_M                (0x03)                                                       /*!< Cortex core                    */\r
-\r
-/**\r
- *  Lint configuration \n\r
- *  ----------------------- \n\r
- *\r
- *  The following Lint messages will be suppressed and not shown: \n\r
- *  \n\r
- *    --- Error 10: --- \n\r
- *    register uint32_t __regBasePri         __asm("basepri"); \n\r
- *    Error 10: Expecting ';' \n\r
- *     \n\r
- *    --- Error 530: --- \n\r
- *    return(__regBasePri); \n\r
- *    Warning 530: Symbol '__regBasePri' (line 264) not initialized \n\r
- *     \n\r
- *    --- Error 550: --- \n\r
- *      __regBasePri = (basePri & 0x1ff); \n\r
- *    } \n\r
- *    Warning 550: Symbol '__regBasePri' (line 271) not accessed \n\r
- *     \n\r
- *    --- Error 754: --- \n\r
- *    uint32_t RESERVED0[24]; \n\r
- *    Info 754: local structure member '<some, not used in the HAL>' (line 109, file ./cm3_core.h) not referenced \n\r
- *     \n\r
- *    --- Error 750: --- \n\r
- *    #define __CM3_CORE_H__ \n\r
- *    Info 750: local macro '__CM3_CORE_H__' (line 43, file./cm3_core.h) not referenced \n\r
- *     \n\r
- *    --- Error 528: --- \n\r
- *    static __INLINE void NVIC_DisableIRQ(uint32_t IRQn) \n\r
- *    Warning 528: Symbol 'NVIC_DisableIRQ(unsigned int)' (line 419, file ./cm3_core.h) not referenced \n\r
- *     \n\r
- *    --- Error 751: --- \n\r
- *    } InterruptType_Type; \n\r
- *    Info 751: local typedef 'InterruptType_Type' (line 170, file ./cm3_core.h) not referenced \n\r
- * \n\r
- * \n\r
- *    Note:  To re-enable a Message, insert a space before 'lint' * \n\r
- *\r
- */\r
-\r
-/*lint -save */\r
-/*lint -e10  */\r
-/*lint -e530 */\r
-/*lint -e550 */\r
-/*lint -e754 */\r
-/*lint -e750 */\r
-/*lint -e528 */\r
-/*lint -e751 */\r
-\r
-\r
-#include <stdint.h>                           /* Include standard types */\r
-\r
-#if defined (__ICCARM__)\r
-  #include <intrinsics.h>                     /* IAR Intrinsics   */\r
-#endif\r
-\r
-\r
-#ifndef __NVIC_PRIO_BITS\r
-  #define __NVIC_PRIO_BITS    4               /*!< standard definition for NVIC Priority Bits */\r
-#endif\r
-\r
-\r
-\r
-\r
-/**\r
- * IO definitions\r
- *\r
- * define access restrictions to peripheral registers\r
- */\r
-\r
-#ifdef __cplusplus\r
-#define     __I     volatile                  /*!< defines 'read only' permissions      */\r
-#else\r
-#define     __I     volatile const            /*!< defines 'read only' permissions      */\r
-#endif\r
-#define     __O     volatile                  /*!< defines 'write only' permissions     */\r
-#define     __IO    volatile                  /*!< defines 'read / write' permissions   */\r
-\r
-\r
-\r
-/*******************************************************************************\r
- *                 Register Abstraction\r
- ******************************************************************************/\r
-\r
-\r
-/* System Reset */\r
-#define NVIC_VECTRESET              0         /*!< Vector Reset Bit             */\r
-#define NVIC_SYSRESETREQ            2         /*!< System Reset Request         */\r
-#define NVIC_AIRCR_VECTKEY    (0x5FA << 16)   /*!< AIRCR Key for write access   */\r
-#define NVIC_AIRCR_ENDIANESS        15        /*!< Endianess                    */\r
-\r
-/* Core Debug */\r
-#define CoreDebug_DEMCR_TRCENA (1 << 24)      /*!< DEMCR TRCENA enable          */\r
-#define ITM_TCR_ITMENA              1         /*!< ITM enable                   */\r
-\r
-\r
-\r
-\r
-/* memory mapping struct for Nested Vectored Interrupt Controller (NVIC) */\r
-typedef struct\r
-{\r
-  __IO uint32_t ISER[8];                      /*!< Interrupt Set Enable Register            */\r
-       uint32_t RESERVED0[24];\r
-  __IO uint32_t ICER[8];                      /*!< Interrupt Clear Enable Register          */\r
-       uint32_t RSERVED1[24];\r
-  __IO uint32_t ISPR[8];                      /*!< Interrupt Set Pending Register           */\r
-       uint32_t RESERVED2[24];\r
-  __IO uint32_t ICPR[8];                      /*!< Interrupt Clear Pending Register         */\r
-       uint32_t RESERVED3[24];\r
-  __IO uint32_t IABR[8];                      /*!< Interrupt Active bit Register            */\r
-       uint32_t RESERVED4[56];\r
-  __IO uint8_t  IP[240];                      /*!< Interrupt Priority Register, 8Bit wide   */\r
-       uint32_t RESERVED5[644];\r
-  __O  uint32_t STIR;                         /*!< Software Trigger Interrupt Register      */\r
-}  NVIC_Type;\r
-\r
-\r
-/* memory mapping struct for System Control Block */\r
-typedef struct\r
-{\r
-  __I  uint32_t CPUID;                        /*!< CPU ID Base Register                                     */\r
-  __IO uint32_t ICSR;                         /*!< Interrupt Control State Register                         */\r
-  __IO uint32_t VTOR;                         /*!< Vector Table Offset Register                             */\r
-  __IO uint32_t AIRCR;                        /*!< Application Interrupt / Reset Control Register           */\r
-  __IO uint32_t SCR;                          /*!< System Control Register                                  */\r
-  __IO uint32_t CCR;                          /*!< Configuration Control Register                           */\r
-  __IO uint8_t  SHP[12];                      /*!< System Handlers Priority Registers (4-7, 8-11, 12-15)    */\r
-  __IO uint32_t SHCSR;                        /*!< System Handler Control and State Register                */\r
-  __IO uint32_t CFSR;                         /*!< Configurable Fault Status Register                       */\r
-  __IO uint32_t HFSR;                         /*!< Hard Fault Status Register                               */\r
-  __IO uint32_t DFSR;                         /*!< Debug Fault Status Register                              */\r
-  __IO uint32_t MMFAR;                        /*!< Mem Manage Address Register                              */\r
-  __IO uint32_t BFAR;                         /*!< Bus Fault Address Register                               */\r
-  __IO uint32_t AFSR;                         /*!< Auxiliary Fault Status Register                          */\r
-  __I  uint32_t PFR[2];                       /*!< Processor Feature Register                               */\r
-  __I  uint32_t DFR;                          /*!< Debug Feature Register                                   */\r
-  __I  uint32_t ADR;                          /*!< Auxiliary Feature Register                               */\r
-  __I  uint32_t MMFR[4];                      /*!< Memory Model Feature Register                            */\r
-  __I  uint32_t ISAR[5];                      /*!< ISA Feature Register                                     */\r
-} SCB_Type;\r
-\r
-\r
-/* memory mapping struct for SysTick */\r
-typedef struct\r
-{\r
-  __IO uint32_t CTRL;                         /*!< SysTick Control and Status Register */\r
-  __IO uint32_t LOAD;                         /*!< SysTick Reload Value Register       */\r
-  __IO uint32_t VAL;                          /*!< SysTick Current Value Register      */\r
-  __I  uint32_t CALIB;                        /*!< SysTick Calibration Register        */\r
-} SysTick_Type;\r
-\r
-\r
-/* memory mapping structur for ITM */\r
-typedef struct\r
-{\r
-  __O  union  \r
-  {\r
-    __O  uint8_t    u8;                       /*!< ITM Stimulus Port 8-bit               */\r
-    __O  uint16_t   u16;                      /*!< ITM Stimulus Port 16-bit              */\r
-    __O  uint32_t   u32;                      /*!< ITM Stimulus Port 32-bit              */\r
-  }  PORT [32];                               /*!< ITM Stimulus Port Registers           */\r
-       uint32_t RESERVED0[864];\r
-  __IO uint32_t TER;                          /*!< ITM Trace Enable Register             */\r
-       uint32_t RESERVED1[15];\r
-  __IO uint32_t TPR;                          /*!< ITM Trace Privilege Register          */\r
-       uint32_t RESERVED2[15];\r
-  __IO uint32_t TCR;                          /*!< ITM Trace Control Register            */\r
-       uint32_t RESERVED3[29];\r
-  __IO uint32_t IWR;                          /*!< ITM Integration Write Register        */\r
-  __IO uint32_t IRR;                          /*!< ITM Integration Read Register         */\r
-  __IO uint32_t IMCR;                         /*!< ITM Integration Mode Control Register */\r
-       uint32_t RESERVED4[43];\r
-  __IO uint32_t LAR;                          /*!< ITM Lock Access Register              */\r
-  __IO uint32_t LSR;                          /*!< ITM Lock Status Register              */\r
-       uint32_t RESERVED5[6];\r
-  __I  uint32_t PID4;                         /*!< ITM Product ID Registers              */\r
-  __I  uint32_t PID5;\r
-  __I  uint32_t PID6;\r
-  __I  uint32_t PID7;\r
-  __I  uint32_t PID0;\r
-  __I  uint32_t PID1;\r
-  __I  uint32_t PID2;\r
-  __I  uint32_t PID3;\r
-  __I  uint32_t CID0;\r
-  __I  uint32_t CID1;\r
-  __I  uint32_t CID2;\r
-  __I  uint32_t CID3;\r
-} ITM_Type;\r
-\r
-\r
-/* memory mapped struct for Interrupt Type */\r
-typedef struct\r
-{\r
-       uint32_t RESERVED0;\r
-  __I  uint32_t ICTR;                         /*!< Interrupt Control Type Register  */\r
-#if ((defined __CM3_REV) && (__CM3_REV >= 0x200))\r
-  __IO uint32_t ACTLR;                        /*!< Auxiliary Control Register       */\r
-#else\r
-       uint32_t RESERVED1;\r
-#endif\r
-} InterruptType_Type;\r
-\r
-\r
-/* Memory Protection Unit */\r
-#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1)\r
-typedef struct\r
-{\r
-  __I  uint32_t TYPE;                         /*!< MPU Type Register                               */\r
-  __IO uint32_t CTRL;                         /*!< MPU Control Register                            */\r
-  __IO uint32_t RNR;                          /*!< MPU Region RNRber Register                      */\r
-  __IO uint32_t RBAR;                         /*!< MPU Region Base Address Register                */\r
-  __IO uint32_t RASR;                         /*!< MPU Region Attribute and Size Register          */\r
-  __IO uint32_t RBAR_A1;                      /*!< MPU Alias 1 Region Base Address Register        */\r
-  __IO uint32_t RASR_A1;                      /*!< MPU Alias 1 Region Attribute and Size Register  */\r
-  __IO uint32_t RBAR_A2;                      /*!< MPU Alias 2 Region Base Address Register        */\r
-  __IO uint32_t RASR_A2;                      /*!< MPU Alias 2 Region Attribute and Size Register  */\r
-  __IO uint32_t RBAR_A3;                      /*!< MPU Alias 3 Region Base Address Register        */\r
-  __IO uint32_t RASR_A3;                      /*!< MPU Alias 3 Region Attribute and Size Register  */\r
-} MPU_Type;\r
-#endif\r
-\r
-\r
-/* Core Debug Register */\r
-typedef struct\r
-{\r
-  __IO uint32_t DHCSR;                        /*!< Debug Halting Control and Status Register       */\r
-  __O  uint32_t DCRSR;                        /*!< Debug Core Register Selector Register           */\r
-  __IO uint32_t DCRDR;                        /*!< Debug Core Register Data Register               */\r
-  __IO uint32_t DEMCR;                        /*!< Debug Exception and Monitor Control Register    */\r
-} CoreDebug_Type;\r
-\r
-\r
-/* Memory mapping of Cortex-M3 Hardware */\r
-#define SCS_BASE            (0xE000E000)                              /*!< System Control Space Base Address    */\r
-#define ITM_BASE            (0xE0000000)                              /*!< ITM Base Address                     */\r
-#define CoreDebug_BASE      (0xE000EDF0)                              /*!< Core Debug Base Address              */\r
-#define SysTick_BASE        (SCS_BASE +  0x0010)                      /*!< SysTick Base Address                 */\r
-#define NVIC_BASE           (SCS_BASE +  0x0100)                      /*!< NVIC Base Address                    */\r
-#define SCB_BASE            (SCS_BASE +  0x0D00)                      /*!< System Control Block Base Address    */\r
-\r
-#define InterruptType       ((InterruptType_Type *) SCS_BASE)         /*!< Interrupt Type Register              */\r
-#define SCB                 ((SCB_Type *)           SCB_BASE)         /*!< SCB configuration struct             */\r
-#define SysTick             ((SysTick_Type *)       SysTick_BASE)     /*!< SysTick configuration struct         */\r
-#define NVIC                ((NVIC_Type *)          NVIC_BASE)        /*!< NVIC configuration struct            */\r
-#define ITM                 ((ITM_Type *)           ITM_BASE)         /*!< ITM configuration struct             */\r
-#define CoreDebug           ((CoreDebug_Type *)     CoreDebug_BASE)   /*!< Core Debug configuration struct      */\r
-\r
-#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1)\r
-  #define MPU_BASE          (SCS_BASE +  0x0D90)                      /*!< Memory Protection Unit               */\r
-  #define MPU               ((MPU_Type*)            MPU_BASE)         /*!< Memory Protection Unit               */\r
-#endif\r
-\r
-\r
-\r
-/*******************************************************************************\r
- *                Hardware Abstraction Layer\r
- ******************************************************************************/\r
-\r
-\r
-#if defined ( __CC_ARM   )\r
-  #define __ASM            __asm                                      /*!< asm keyword for ARM Compiler          */\r
-  #define __INLINE         __inline                                   /*!< inline keyword for ARM Compiler       */\r
-\r
-#elif defined ( __ICCARM__ )\r
-  #define __ASM           __asm                                       /*!< asm keyword for IAR Compiler           */\r
-  #define __INLINE        inline                                      /*!< inline keyword for IAR Compiler. Only avaiable in High optimization mode! */\r
-\r
-#elif defined   (  __GNUC__  )\r
-  #define __ASM            __asm                                      /*!< asm keyword for GNU Compiler          */\r
-  #define __INLINE         inline                                     /*!< inline keyword for GNU Compiler       */\r
-\r
-#elif defined   (  __TASKING__  )\r
-  #define __ASM            __asm                                      /*!< asm keyword for TASKING Compiler          */\r
-  #define __INLINE         inline                                     /*!< inline keyword for TASKING Compiler       */\r
-\r
-#endif\r
-\r
-\r
-/* ###################  Compiler specific Intrinsics  ########################### */\r
-\r
-#if defined ( __CC_ARM   ) /*------------------RealView Compiler -----------------*/\r
-/* ARM armcc specific functions */\r
-\r
-#define __enable_fault_irq                __enable_fiq\r
-#define __disable_fault_irq               __disable_fiq\r
-\r
-#define __NOP                             __nop\r
-#define __WFI                             __wfi\r
-#define __WFE                             __wfe\r
-#define __SEV                             __sev\r
-#define __ISB()                           __isb(0)\r
-#define __DSB()                           __dsb(0)\r
-#define __DMB()                           __dmb(0)\r
-#define __REV                             __rev\r
-#define __RBIT                            __rbit\r
-#define __LDREXB(ptr)                     ((unsigned char ) __ldrex(ptr))\r
-#define __LDREXH(ptr)                     ((unsigned short) __ldrex(ptr))\r
-#define __LDREXW(ptr)                     ((unsigned int  ) __ldrex(ptr))\r
-#define __STREXB(value, ptr)              __strex(value, ptr)\r
-#define __STREXH(value, ptr)              __strex(value, ptr)\r
-#define __STREXW(value, ptr)              __strex(value, ptr)\r
-\r
-\r
-/* intrinsic unsigned long long __ldrexd(volatile void *ptr) */\r
-/* intrinsic int __strexd(unsigned long long val, volatile void *ptr) */\r
-/* intrinsic void __enable_irq();     */\r
-/* intrinsic void __disable_irq();    */\r
-\r
-\r
-/**\r
- * @brief  Return the Process Stack Pointer\r
- *\r
- * @param  none\r
- * @return uint32_t ProcessStackPointer\r
- *\r
- * Return the actual process stack pointer\r
- */\r
-extern uint32_t __get_PSP(void);\r
-\r
-/**\r
- * @brief  Set the Process Stack Pointer\r
- *\r
- * @param  uint32_t Process Stack Pointer\r
- * @return none\r
- *\r
- * Assign the value ProcessStackPointer to the MSP \r
- * (process stack pointer) Cortex processor register\r
- */\r
-extern void __set_PSP(uint32_t topOfProcStack);\r
-\r
-/**\r
- * @brief  Return the Main Stack Pointer\r
- *\r
- * @param  none\r
- * @return uint32_t Main Stack Pointer\r
- *\r
- * Return the current value of the MSP (main stack pointer)\r
- * Cortex processor register\r
- */\r
-extern uint32_t __get_MSP(void);\r
-\r
-/**\r
- * @brief  Set the Main Stack Pointer\r
- *\r
- * @param  uint32_t Main Stack Pointer\r
- * @return none\r
- *\r
- * Assign the value mainStackPointer to the MSP \r
- * (main stack pointer) Cortex processor register\r
- */\r
-extern void __set_MSP(uint32_t topOfMainStack);\r
-\r
-/**\r
- * @brief  Reverse byte order in unsigned short value\r
- *\r
- * @param  uint16_t value to reverse\r
- * @return uint32_t reversed value\r
- *\r
- * Reverse byte order in unsigned short value\r
- */\r
-extern uint32_t __REV16(uint16_t value);\r
-\r
-/*\r
- * @brief  Reverse byte order in signed short value with sign extension to integer\r
- *\r
- * @param  int16_t value to reverse\r
- * @return int32_t reversed value\r
- *\r
- * Reverse byte order in signed short value with sign extension to integer\r
- */\r
-extern int32_t __REVSH(int16_t value);\r
-\r
-\r
-#if (__ARMCC_VERSION < 400000)\r
-\r
-/**\r
- * @brief  Remove the exclusive lock created by ldrex\r
- *\r
- * @param  none\r
- * @return none\r
- *\r
- * Removes the exclusive lock which is created by ldrex.\r
- */\r
-extern void __CLREX(void);\r
-\r
-/**\r
- * @brief  Return the Base Priority value\r
- *\r
- * @param  none\r
- * @return uint32_t BasePriority\r
- *\r
- * Return the content of the base priority register\r
- */\r
-extern uint32_t __get_BASEPRI(void);\r
-\r
-/**\r
- * @brief  Set the Base Priority value\r
- *\r
- * @param  uint32_t BasePriority\r
- * @return none\r
- *\r
- * Set the base priority register\r
- */\r
-extern void __set_BASEPRI(uint32_t basePri);\r
-\r
-/**\r
- * @brief  Return the Priority Mask value\r
- *\r
- * @param  none\r
- * @return uint32_t PriMask\r
- *\r
- * Return the state of the priority mask bit from the priority mask\r
- * register\r
- */\r
-extern uint32_t __get_PRIMASK(void);\r
-\r
-/**\r
- * @brief  Set the Priority Mask value\r
- *\r
- * @param  uint32_t PriMask\r
- * @return none\r
- *\r
- * Set the priority mask bit in the priority mask register\r
- */\r
-extern void __set_PRIMASK(uint32_t priMask);\r
-\r
-/**\r
- * @brief  Return the Fault Mask value\r
- *\r
- * @param  none\r
- * @return uint32_t FaultMask\r
- *\r
- * Return the content of the fault mask register\r
- */\r
-extern uint32_t __get_FAULTMASK(void);\r
-\r
-/**\r
- * @brief  Set the Fault Mask value\r
- *\r
- * @param  uint32_t faultMask value\r
- * @return none\r
- *\r
- * Set the fault mask register\r
- */\r
-extern void __set_FAULTMASK(uint32_t faultMask);\r
-\r
-/**\r
- * @brief  Return the Control Register value\r
- * \r
- * @param  none\r
- * @return uint32_t Control value\r
- *\r
- * Return the content of the control register\r
- */\r
-extern uint32_t __get_CONTROL(void);\r
-\r
-/**\r
- * @brief  Set the Control Register value\r
- *\r
- * @param  uint32_t Control value\r
- * @return none\r
- *\r
- * Set the control register\r
- */\r
-extern void __set_CONTROL(uint32_t control);\r
-\r
-#else  /* (__ARMCC_VERSION >= 400000)  */\r
-\r
-\r
-/**\r
- * @brief  Remove the exclusive lock created by ldrex\r
- *\r
- * @param  none\r
- * @return none\r
- *\r
- * Removes the exclusive lock which is created by ldrex.\r
- */\r
-#define __CLREX                           __clrex\r
-\r
-/**\r
- * @brief  Return the Base Priority value\r
- *\r
- * @param  none\r
- * @return uint32_t BasePriority\r
- *\r
- * Return the content of the base priority register\r
- */\r
-static __INLINE uint32_t  __get_BASEPRI(void)\r
-{\r
-  register uint32_t __regBasePri         __ASM("basepri");\r
-  return(__regBasePri);\r
-}\r
-\r
-/**\r
- * @brief  Set the Base Priority value\r
- *\r
- * @param  uint32_t BasePriority\r
- * @return none\r
- *\r
- * Set the base priority register\r
- */\r
-static __INLINE void __set_BASEPRI(uint32_t basePri)\r
-{\r
-  register uint32_t __regBasePri         __ASM("basepri");\r
-  __regBasePri = (basePri & 0x1ff);\r
-}\r
-\r
-/**\r
- * @brief  Return the Priority Mask value\r
- *\r
- * @param  none\r
- * @return uint32_t PriMask\r
- *\r
- * Return the state of the priority mask bit from the priority mask\r
- * register\r
- */\r
-static __INLINE uint32_t __get_PRIMASK(void)\r
-{\r
-  register uint32_t __regPriMask         __ASM("primask");\r
-  return(__regPriMask);\r
-}\r
-\r
-/**\r
- * @brief  Set the Priority Mask value\r
- *\r
- * @param  uint32_t PriMask\r
- * @return none\r
- *\r
- * Set the priority mask bit in the priority mask register\r
- */\r
-static __INLINE void __set_PRIMASK(uint32_t priMask)\r
-{\r
-  register uint32_t __regPriMask         __ASM("primask");\r
-  __regPriMask = (priMask);\r
-}\r
-\r
-/**\r
- * @brief  Return the Fault Mask value\r
- *\r
- * @param  none\r
- * @return uint32_t FaultMask\r
- *\r
- * Return the content of the fault mask register\r
- */\r
-static __INLINE uint32_t __get_FAULTMASK(void)\r
-{\r
-  register uint32_t __regFaultMask       __ASM("faultmask");\r
-  return(__regFaultMask);\r
-}\r
-\r
-/**\r
- * @brief  Set the Fault Mask value\r
- *\r
- * @param  uint32_t faultMask value\r
- * @return none\r
- *\r
- * Set the fault mask register\r
- */\r
-static __INLINE void __set_FAULTMASK(uint32_t faultMask)\r
-{\r
-  register uint32_t __regFaultMask       __ASM("faultmask");\r
-  __regFaultMask = (faultMask & 1);\r
-}\r
-\r
-/**\r
- * @brief  Return the Control Register value\r
- * \r
- * @param  none\r
- * @return uint32_t Control value\r
- *\r
- * Return the content of the control register\r
- */\r
-static __INLINE uint32_t __get_CONTROL(void)\r
-{\r
-  register uint32_t __regControl         __ASM("control");\r
-  return(__regControl);\r
-}\r
-\r
-/**\r
- * @brief  Set the Control Register value\r
- *\r
- * @param  uint32_t Control value\r
- * @return none\r
- *\r
- * Set the control register\r
- */\r
-static __INLINE void __set_CONTROL(uint32_t control)\r
-{\r
-  register uint32_t __regControl         __ASM("control");\r
-  __regControl = control;\r
-}\r
-\r
-#endif /* __ARMCC_VERSION  */ \r
-\r
-\r
-\r
-#elif (defined (__ICCARM__)) /*------------------ ICC Compiler -------------------*/\r
-/* IAR iccarm specific functions */\r
-\r
-#define __enable_irq                              __enable_interrupt        /*!< global Interrupt enable */\r
-#define __disable_irq                             __disable_interrupt       /*!< global Interrupt disable */\r
-\r
-static __INLINE void __enable_fault_irq()         { __ASM ("cpsie f"); }\r
-static __INLINE void __disable_fault_irq()        { __ASM ("cpsid f"); }\r
-\r
-#define __NOP                                     __no_operation()          /*!< no operation intrinsic in IAR Compiler */ \r
-static __INLINE  void __WFI()                     { __ASM ("wfi"); }\r
-static __INLINE  void __WFE()                     { __ASM ("wfe"); }\r
-static __INLINE  void __SEV()                     { __ASM ("sev"); }\r
-static __INLINE  void __CLREX()                   { __ASM ("clrex"); }\r
-\r
-/* intrinsic void __ISB(void)                                     */\r
-/* intrinsic void __DSB(void)                                     */\r
-/* intrinsic void __DMB(void)                                     */\r
-/* intrinsic void __set_PRIMASK();                                */\r
-/* intrinsic void __get_PRIMASK();                                */\r
-/* intrinsic void __set_FAULTMASK();                              */\r
-/* intrinsic void __get_FAULTMASK();                              */\r
-/* intrinsic uint32_t __REV(uint32_t value);                      */\r
-/* intrinsic uint32_t __REVSH(uint32_t value);                    */\r
-/* intrinsic unsigned long __STREX(unsigned long, unsigned long); */\r
-/* intrinsic unsigned long __LDREX(unsigned long *);              */\r
-\r
-\r
-/**\r
- * @brief  Return the Process Stack Pointer\r
- *\r
- * @param  none\r
- * @return uint32_t ProcessStackPointer\r
- *\r
- * Return the actual process stack pointer\r
- */\r
-extern uint32_t __get_PSP(void);\r
-\r
-/**\r
- * @brief  Set the Process Stack Pointer\r
- *\r
- * @param  uint32_t Process Stack Pointer\r
- * @return none\r
- *\r
- * Assign the value ProcessStackPointer to the MSP \r
- * (process stack pointer) Cortex processor register\r
- */\r
-extern void __set_PSP(uint32_t topOfProcStack);\r
-\r
-/**\r
- * @brief  Return the Main Stack Pointer\r
- *\r
- * @param  none\r
- * @return uint32_t Main Stack Pointer\r
- *\r
- * Return the current value of the MSP (main stack pointer)\r
- * Cortex processor register\r
- */\r
-extern uint32_t __get_MSP(void);\r
-\r
-/**\r
- * @brief  Set the Main Stack Pointer\r
- *\r
- * @param  uint32_t Main Stack Pointer\r
- * @return none\r
- *\r
- * Assign the value mainStackPointer to the MSP \r
- * (main stack pointer) Cortex processor register\r
- */\r
-extern void __set_MSP(uint32_t topOfMainStack);\r
-\r
-/**\r
- * @brief  Reverse byte order in unsigned short value\r
- *\r
- * @param  uint16_t value to reverse\r
- * @return uint32_t reversed value\r
- *\r
- * Reverse byte order in unsigned short value\r
- */\r
-extern uint32_t __REV16(uint16_t value);\r
-\r
-/**\r
- * @brief  Reverse bit order of value\r
- *\r
- * @param  uint32_t value to reverse\r
- * @return uint32_t reversed value\r
- *\r
- * Reverse bit order of value\r
- */\r
-extern uint32_t __RBIT(uint32_t value);\r
-\r
-/**\r
- * @brief  LDR Exclusive\r
- *\r
- * @param  uint8_t* address\r
- * @return uint8_t value of (*address)\r
- *\r
- * Exclusive LDR command\r
- */\r
-extern uint8_t __LDREXB(uint8_t *addr);\r
-\r
-/**\r
- * @brief  LDR Exclusive\r
- *\r
- * @param  uint16_t* address\r
- * @return uint16_t value of (*address)\r
- *\r
- * Exclusive LDR command\r
- */\r
-extern uint16_t __LDREXH(uint16_t *addr);\r
-\r
-/**\r
- * @brief  LDR Exclusive\r
- *\r
- * @param  uint32_t* address\r
- * @return uint32_t value of (*address)\r
- *\r
- * Exclusive LDR command\r
- */\r
-extern uint32_t __LDREXW(uint32_t *addr);\r
-\r
-/**\r
- * @brief  STR Exclusive\r
- *\r
- * @param  uint8_t *address\r
- * @param  uint8_t value to store\r
- * @return uint32_t successful / failed\r
- *\r
- * Exclusive STR command\r
- */\r
-extern uint32_t __STREXB(uint8_t value, uint8_t *addr);\r
-\r
-/**\r
- * @brief  STR Exclusive\r
- *\r
- * @param  uint16_t *address\r
- * @param  uint16_t value to store\r
- * @return uint32_t successful / failed\r
- *\r
- * Exclusive STR command\r
- */\r
-extern uint32_t __STREXH(uint16_t value, uint16_t *addr);\r
-\r
-/**\r
- * @brief  STR Exclusive\r
- *\r
- * @param  uint32_t *address\r
- * @param  uint32_t value to store\r
- * @return uint32_t successful / failed\r
- *\r
- * Exclusive STR command\r
- */\r
-extern uint32_t __STREXW(uint32_t value, uint32_t *addr);\r
-\r
-\r
-\r
-#elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/\r
-/* GNU gcc specific functions */\r
-\r
-static __INLINE void __enable_irq()               { __ASM volatile ("cpsie i"); }\r
-static __INLINE void __disable_irq()              { __ASM volatile ("cpsid i"); }\r
-\r
-static __INLINE void __enable_fault_irq()         { __ASM volatile ("cpsie f"); }\r
-static __INLINE void __disable_fault_irq()        { __ASM volatile ("cpsid f"); }\r
-\r
-static __INLINE void __NOP()                      { __ASM volatile ("nop"); }\r
-static __INLINE void __WFI()                      { __ASM volatile ("wfi"); }\r
-static __INLINE void __WFE()                      { __ASM volatile ("wfe"); }\r
-static __INLINE void __SEV()                      { __ASM volatile ("sev"); }\r
-static __INLINE void __ISB()                      { __ASM volatile ("isb"); }\r
-static __INLINE void __DSB()                      { __ASM volatile ("dsb"); }\r
-static __INLINE void __DMB()                      { __ASM volatile ("dmb"); }\r
-static __INLINE void __CLREX()                    { __ASM volatile ("clrex"); }\r
-\r
-\r
-/**\r
- * @brief  Return the Process Stack Pointer\r
- *\r
- * @param  none\r
- * @return uint32_t ProcessStackPointer\r
- *\r
- * Return the actual process stack pointer\r
- */\r
-extern uint32_t __get_PSP(void);\r
-\r
-/**\r
- * @brief  Set the Process Stack Pointer\r
- *\r
- * @param  uint32_t Process Stack Pointer\r
- * @return none\r
- *\r
- * Assign the value ProcessStackPointer to the MSP \r
- * (process stack pointer) Cortex processor register\r
- */\r
-extern void __set_PSP(uint32_t topOfProcStack);\r
-\r
-/**\r
- * @brief  Return the Main Stack Pointer\r
- *\r
- * @param  none\r
- * @return uint32_t Main Stack Pointer\r
- *\r
- * Return the current value of the MSP (main stack pointer)\r
- * Cortex processor register\r
- */\r
-extern uint32_t __get_MSP(void);\r
-\r
-/**\r
- * @brief  Set the Main Stack Pointer\r
- *\r
- * @param  uint32_t Main Stack Pointer\r
- * @return none\r
- *\r
- * Assign the value mainStackPointer to the MSP \r
- * (main stack pointer) Cortex processor register\r
- */\r
-extern void __set_MSP(uint32_t topOfMainStack);\r
-\r
-/**\r
- * @brief  Return the Base Priority value\r
- *\r
- * @param  none\r
- * @return uint32_t BasePriority\r
- *\r
- * Return the content of the base priority register\r
- */\r
-extern uint32_t __get_BASEPRI(void);\r
-\r
-/**\r
- * @brief  Set the Base Priority value\r
- *\r
- * @param  uint32_t BasePriority\r
- * @return none\r
- *\r
- * Set the base priority register\r
- */\r
-extern void __set_BASEPRI(uint32_t basePri);\r
-\r
-/**\r
- * @brief  Return the Priority Mask value\r
- *\r
- * @param  none\r
- * @return uint32_t PriMask\r
- *\r
- * Return the state of the priority mask bit from the priority mask\r
- * register\r
- */\r
-extern uint32_t  __get_PRIMASK(void);\r
-\r
-/**\r
- * @brief  Set the Priority Mask value\r
- *\r
- * @param  uint32_t PriMask\r
- * @return none\r
- *\r
- * Set the priority mask bit in the priority mask register\r
- */\r
-extern void __set_PRIMASK(uint32_t priMask);\r
-\r
-/**\r
- * @brief  Return the Fault Mask value\r
- *\r
- * @param  none\r
- * @return uint32_t FaultMask\r
- *\r
- * Return the content of the fault mask register\r
- */\r
-extern uint32_t __get_FAULTMASK(void);\r
-\r
-/**\r
- * @brief  Set the Fault Mask value\r
- *\r
- * @param  uint32_t faultMask value\r
- * @return none\r
- *\r
- * Set the fault mask register\r
- */\r
-extern void __set_FAULTMASK(uint32_t faultMask);\r
-\r
-/**\r
- * @brief  Return the Control Register value\r
-* \r
-*  @param  none\r
-*  @return uint32_t Control value\r
- *\r
- * Return the content of the control register\r
- */\r
-extern uint32_t __get_CONTROL(void);\r
-\r
-/**\r
- * @brief  Set the Control Register value\r
- *\r
- * @param  uint32_t Control value\r
- * @return none\r
- *\r
- * Set the control register\r
- */\r
-extern void __set_CONTROL(uint32_t control);\r
-\r
-/**\r
- * @brief  Reverse byte order in integer value\r
- *\r
- * @param  uint32_t value to reverse\r
- * @return uint32_t reversed value\r
- *\r
- * Reverse byte order in integer value\r
- */\r
-extern uint32_t __REV(uint32_t value);\r
-\r
-/**\r
- * @brief  Reverse byte order in unsigned short value\r
- *\r
- * @param  uint16_t value to reverse\r
- * @return uint32_t reversed value\r
- *\r
- * Reverse byte order in unsigned short value\r
- */\r
-extern uint32_t __REV16(uint16_t value);\r
-\r
-/*\r
- * Reverse byte order in signed short value with sign extension to integer\r
- *\r
- * @param  int16_t value to reverse\r
- * @return int32_t reversed value\r
- *\r
- * @brief  Reverse byte order in signed short value with sign extension to integer\r
- */\r
-extern int32_t __REVSH(int16_t value);\r
-\r
-/**\r
- * @brief  Reverse bit order of value\r
- *\r
- * @param  uint32_t value to reverse\r
- * @return uint32_t reversed value\r
- *\r
- * Reverse bit order of value\r
- */\r
-extern uint32_t __RBIT(uint32_t value);\r
-\r
-/**\r
- * @brief  LDR Exclusive\r
- *\r
- * @param  uint8_t* address\r
- * @return uint8_t value of (*address)\r
- *\r
- * Exclusive LDR command\r
- */\r
-extern uint8_t __LDREXB(uint8_t *addr);\r
-\r
-/**\r
- * @brief  LDR Exclusive\r
- *\r
- * @param  uint16_t* address\r
- * @return uint16_t value of (*address)\r
- *\r
- * Exclusive LDR command\r
- */\r
-extern uint16_t __LDREXH(uint16_t *addr);\r
-\r
-/**\r
- * @brief  LDR Exclusive\r
- *\r
- * @param  uint32_t* address\r
- * @return uint32_t value of (*address)\r
- *\r
- * Exclusive LDR command\r
- */\r
-extern uint32_t __LDREXW(uint32_t *addr);\r
-\r
-/**\r
- * @brief  STR Exclusive\r
- *\r
- * @param  uint8_t *address\r
- * @param  uint8_t value to store\r
- * @return uint32_t successful / failed\r
- *\r
- * Exclusive STR command\r
- */\r
-extern uint32_t __STREXB(uint8_t value, uint8_t *addr);\r
-\r
-/**\r
- * @brief  STR Exclusive\r
- *\r
- * @param  uint16_t *address\r
- * @param  uint16_t value to store\r
- * @return uint32_t successful / failed\r
- *\r
- * Exclusive STR command\r
- */\r
-extern uint32_t __STREXH(uint16_t value, uint16_t *addr);\r
-\r
-/**\r
- * @brief  STR Exclusive\r
- *\r
- * @param  uint32_t *address\r
- * @param  uint32_t value to store\r
- * @return uint32_t successful / failed\r
- *\r
- * Exclusive STR command\r
- */\r
-extern uint32_t __STREXW(uint32_t value, uint32_t *addr);\r
-\r
-\r
-#elif (defined (__TASKING__)) /*------------------ TASKING Compiler ---------------------*/\r
-/* TASKING carm specific functions */\r
-\r
-/*\r
- * The CMSIS functions have been implemented as intrinsics in the compiler.\r
- * Please use "carm -?i" to get an up to date list of all instrinsics,\r
- * Including the CMSIS ones.\r
- */\r
-\r
-#endif\r
-\r
-\r
-\r
-/* ##########################   NVIC functions  #################################### */\r
-\r
-\r
-/**\r
- * @brief  Set the Priority Grouping in NVIC Interrupt Controller\r
- *\r
- * @param  uint32_t priority_grouping is priority grouping field\r
- * @return none \r
- *\r
- * Set the priority grouping field using the required unlock sequence.\r
- * The parameter priority_grouping is assigned to the field \r
- * SCB->AIRCR [10:8] PRIGROUP field. Only values from 0..7 are used.\r
- * In case of a conflict between priority grouping and available\r
- * priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set.\r
- */\r
-static __INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup)\r
-{\r
-  uint32_t reg_value;\r
-  uint32_t PriorityGroupTmp = (PriorityGroup & 0x07);                         /* only values 0..7 are used          */\r
-  \r
-  reg_value  = SCB->AIRCR;                                                    /* read old register configuration    */\r
-  reg_value &= ~((0xFFFFU << 16) | (0x0F << 8));                              /* clear bits to change               */\r
-  reg_value  = ((reg_value | NVIC_AIRCR_VECTKEY | (PriorityGroupTmp << 8)));  /* Insert write key and priorty group */\r
-  SCB->AIRCR = reg_value;\r
-}\r
-\r
-/**\r
- * @brief  Get the Priority Grouping from NVIC Interrupt Controller\r
- *\r
- * @param  none\r
- * @return uint32_t   priority grouping field \r
- *\r
- * Get the priority grouping from NVIC Interrupt Controller.\r
- * priority grouping is SCB->AIRCR [10:8] PRIGROUP field.\r
- */\r
-static __INLINE uint32_t NVIC_GetPriorityGrouping(void)\r
-{\r
-  return ((SCB->AIRCR >> 8) & 0x07);                                          /* read priority grouping field */\r
-}\r
-\r
-/**\r
- * @brief  Enable Interrupt in NVIC Interrupt Controller\r
- *\r
- * @param  IRQn_Type IRQn specifies the interrupt number\r
- * @return none \r
- *\r
- * Enable a device specific interupt in the NVIC interrupt controller.\r
- * The interrupt number cannot be a negative value.\r
- */\r
-static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)\r
-{\r
-  NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */\r
-}\r
-\r
-/**\r
- * @brief  Disable the interrupt line for external interrupt specified\r
- * \r
- * @param  IRQn_Type IRQn is the positive number of the external interrupt\r
- * @return none\r
- * \r
- * Disable a device specific interupt in the NVIC interrupt controller.\r
- * The interrupt number cannot be a negative value.\r
- */\r
-static __INLINE void NVIC_DisableIRQ(IRQn_Type IRQn)\r
-{\r
-  NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */\r
-}\r
-\r
-/**\r
- * @brief  Read the interrupt pending bit for a device specific interrupt source\r
- * \r
- * @param  IRQn_Type IRQn is the number of the device specifc interrupt\r
- * @return uint32_t 1 if pending interrupt else 0\r
- *\r
- * Read the pending register in NVIC and return 1 if its status is pending, \r
- * otherwise it returns 0\r
- */\r
-static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)\r
-{\r
-  return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */\r
-}\r
-\r
-/**\r
- * @brief  Set the pending bit for an external interrupt\r
- * \r
- * @param  IRQn_Type IRQn is the Number of the interrupt\r
- * @return none\r
- *\r
- * Set the pending bit for the specified interrupt.\r
- * The interrupt number cannot be a negative value.\r
- */\r
-static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)\r
-{\r
-  NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */\r
-}\r
-\r
-/**\r
- * @brief  Clear the pending bit for an external interrupt\r
- *\r
- * @param  IRQn_Type IRQn is the Number of the interrupt\r
- * @return none\r
- *\r
- * Clear the pending bit for the specified interrupt. \r
- * The interrupt number cannot be a negative value.\r
- */\r
-static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)\r
-{\r
-  NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */\r
-}\r
-\r
-/**\r
- * @brief  Read the active bit for an external interrupt\r
- *\r
- * @param  IRQn_Type  IRQn is the Number of the interrupt\r
- * @return uint32_t   1 if active else 0\r
- *\r
- * Read the active register in NVIC and returns 1 if its status is active, \r
- * otherwise it returns 0.\r
- */\r
-static __INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn)\r
-{\r
-  return((uint32_t)((NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if active else 0 */\r
-}\r
-\r
-/**\r
- * @brief  Set the priority for an interrupt\r
- *\r
- * @param  IRQn_Type IRQn is the Number of the interrupt\r
- * @param  priority is the priority for the interrupt\r
- * @return none\r
- *\r
- * Set the priority for the specified interrupt. The interrupt \r
- * number can be positive to specify an external (device specific) \r
- * interrupt, or negative to specify an internal (core) interrupt. \n\r
- *\r
- * Note: The priority cannot be set for every core interrupt.\r
- */\r
-static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)\r
-{\r
-  if(IRQn < 0) {\r
-    SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M3 System Interrupts */\r
-  else {\r
-    NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff);    }        /* set Priority for device specific Interrupts      */\r
-}\r
-\r
-/**\r
- * @brief  Read the priority for an interrupt\r
- *\r
- * @param  IRQn_Type IRQn is the Number of the interrupt\r
- * @return uint32_t  priority is the priority for the interrupt\r
- *\r
- * Read the priority for the specified interrupt. The interrupt \r
- * number can be positive to specify an external (device specific) \r
- * interrupt, or negative to specify an internal (core) interrupt.\r
- *\r
- * The returned priority value is automatically aligned to the implemented\r
- * priority bits of the microcontroller.\r
- *\r
- * Note: The priority cannot be set for every core interrupt.\r
- */\r
-static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn)\r
-{\r
-\r
-  if(IRQn < 0) {\r
-    return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS)));  } /* get priority for Cortex-M3 system interrupts */\r
-  else {\r
-    return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)]           >> (8 - __NVIC_PRIO_BITS)));  } /* get priority for device specific interrupts  */\r
-}\r
-\r
-\r
-/**\r
- * @brief  Encode the priority for an interrupt\r
- *\r
- * @param  uint32_t PriorityGroup   is the used priority group\r
- * @param  uint32_t PreemptPriority is the preemptive priority value (starting from 0)\r
- * @param  uint32_t SubPriority     is the sub priority value (starting from 0)\r
- * @return uint32_t                    the priority for the interrupt\r
- *\r
- * Encode the priority for an interrupt with the given priority group,\r
- * preemptive priority value and sub priority value.\r
- * In case of a conflict between priority grouping and available\r
- * priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set.\r
- *\r
- * The returned priority value can be used for NVIC_SetPriority(...) function\r
- */\r
-static __INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)\r
-{\r
-  uint32_t PriorityGroupTmp = (PriorityGroup & 0x07);                         /* only values 0..7 are used          */\r
-  uint32_t PreemptPriorityBits;\r
-  uint32_t SubPriorityBits;\r
-\r
-  PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp;\r
-  SubPriorityBits     = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS;\r
\r
-  return (\r
-           ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) |\r
-           ((SubPriority     & ((1 << (SubPriorityBits    )) - 1)))\r
-         );\r
-}\r
-\r
-\r
-/**\r
- * @brief  Decode the priority of an interrupt\r
- *\r
- * @param  uint32_t   Priority       the priority for the interrupt\r
- * @param  uint32_t   PrioGroup   is the used priority group\r
- * @param  uint32_t* pPreemptPrio is the preemptive priority value (starting from 0)\r
- * @param  uint32_t* pSubPrio     is the sub priority value (starting from 0)\r
- * @return none\r
- *\r
- * Decode an interrupt priority value with the given priority group to \r
- * preemptive priority value and sub priority value.\r
- * In case of a conflict between priority grouping and available\r
- * priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set.\r
- *\r
- * The priority value can be retrieved with NVIC_GetPriority(...) function\r
- */\r
-static __INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority)\r
-{\r
-  uint32_t PriorityGroupTmp = (PriorityGroup & 0x07);                         /* only values 0..7 are used          */\r
-  uint32_t PreemptPriorityBits;\r
-  uint32_t SubPriorityBits;\r
-\r
-  PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp;\r
-  SubPriorityBits     = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS;\r
-  \r
-  *pPreemptPriority = (Priority >> SubPriorityBits) & ((1 << (PreemptPriorityBits)) - 1);\r
-  *pSubPriority     = (Priority                   ) & ((1 << (SubPriorityBits    )) - 1);\r
-}\r
-\r
-\r
-\r
-/* ##################################    SysTick function  ############################################ */\r
-\r
-#if (!defined (__Vendor_SysTickConfig)) || (__Vendor_SysTickConfig == 0)\r
-\r
-/* SysTick constants */\r
-#define SYSTICK_ENABLE              0                                          /* Config-Bit to start or stop the SysTick Timer                         */\r
-#define SYSTICK_TICKINT             1                                          /* Config-Bit to enable or disable the SysTick interrupt                 */\r
-#define SYSTICK_CLKSOURCE           2                                          /* Clocksource has the offset 2 in SysTick Control and Status Register   */\r
-#define SYSTICK_MAXCOUNT       ((1<<24) -1)                                    /* SysTick MaxCount                                                      */\r
-\r
-/**\r
- * @brief  Initialize and start the SysTick counter and its interrupt.\r
- *\r
- * @param  uint32_t ticks is the number of ticks between two interrupts\r
- * @return  none\r
- *\r
- * Initialise the system tick timer and its interrupt and start the\r
- * system tick timer / counter in free running mode to generate \r
- * periodical interrupts.\r
- */\r
-static __INLINE uint32_t SysTick_Config(uint32_t ticks)\r
-{ \r
-  if (ticks > SYSTICK_MAXCOUNT)  return (1);                                             /* Reload value impossible */\r
-\r
-  SysTick->LOAD  =  (ticks & SYSTICK_MAXCOUNT) - 1;                                      /* set reload register */\r
-  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);                            /* set Priority for Cortex-M0 System Interrupts */\r
-  SysTick->VAL   =  (0x00);                                                              /* Load the SysTick Counter Value */\r
-  SysTick->CTRL = (1 << SYSTICK_CLKSOURCE) | (1<<SYSTICK_ENABLE) | (1<<SYSTICK_TICKINT); /* Enable SysTick IRQ and SysTick Timer */\r
-  return (0);                                                                            /* Function successful */\r
-}\r
-\r
-#endif\r
-\r
-\r
-\r
-\r
-\r
-/* ##################################    Reset function  ############################################ */\r
-\r
-/**\r
- * @brief  Initiate a system reset request.\r
- *\r
- * @param   none\r
- * @return  none\r
- *\r
- * Initialize a system reset request to reset the MCU\r
- */\r
-static __INLINE void NVIC_SystemReset(void)\r
-{\r
-  SCB->AIRCR  = (NVIC_AIRCR_VECTKEY | (SCB->AIRCR & (0x700)) | (1<<NVIC_SYSRESETREQ)); /* Keep priority group unchanged */\r
-  __DSB();                                                                             /* Ensure completion of memory access */              \r
-  while(1);                                                                            /* wait until reset */\r
-}\r
-\r
-\r
-/* ##################################    Debug Output  function  ############################################ */\r
-\r
-\r
-/**\r
- * @brief  Outputs a character via the ITM channel 0\r
- *\r
- * @param   uint32_t character to output\r
- * @return  uint32_t input character\r
- *\r
- * The function outputs a character via the ITM channel 0. \r
- * The function returns when no debugger is connected that has booked the output.  \r
- * It is blocking when a debugger is connected, but the previous character send is not transmitted. \r
- */\r
-static __INLINE uint32_t ITM_SendChar (uint32_t ch)\r
-{\r
-  if (ch == '\n') ITM_SendChar('\r');\r
-  \r
-  if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA)  &&\r
-      (ITM->TCR & ITM_TCR_ITMENA)                  &&\r
-      (ITM->TER & (1UL << 0))  ) \r
-  {\r
-    while (ITM->PORT[0].u32 == 0);\r
-    ITM->PORT[0].u8 = (uint8_t) ch;\r
-  }  \r
-  return (ch);\r
-}\r
-\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
-#endif /* __CM3_CORE_H__ */\r
-\r
-/*lint -restore */\r
diff --git a/arch/arm/arm_cr4/kernel/core_cr4.h b/arch/arm/arm_cr4/kernel/core_cr4.h
new file mode 100644 (file)
index 0000000..13f7985
--- /dev/null
@@ -0,0 +1,352 @@
+/*\r
+ * core_cr4.h\r
+ *\r
+ *  Created on: 12 okt 2010\r
+ *      Author: maek\r
+ */\r
+\r
+#ifndef CORE_CR4_H_\r
+#define CORE_CR4_H_\r
+\r
+#define     __I     volatile const            /*!< defines 'read only' permissions      */\r
+#define     __O     volatile                  /*!< defines 'write only' permissions     */\r
+#define     __IO    volatile                  /*!< defines 'read / write' permissions   */\r
+\r
+\r
+typedef volatile struct vimBase\r
+{\r
+    unsigned              : 24U;    /* 0x0000        */\r
+    unsigned      IRQIVEC :  8U;    /* 0x0000        */\r
+    unsigned              : 24U;    /* 0x0004        */\r
+    unsigned      FIQIVEC :  8U;    /* 0x0004        */\r
+    unsigned      : 32U;            /* 0x0008        */\r
+    unsigned      : 32U;            /* 0x000C        */\r
+    unsigned      FIRQPR0;          /* 0x0010        */\r
+    unsigned      FIRQPR1;          /* 0x0014        */\r
+    unsigned      FIRQPR2;          /* 0x0018        */\r
+    unsigned      FIRQPR3;          /* 0x001C        */\r
+    unsigned      INTREQ0;          /* 0x0020        */\r
+    unsigned      INTREQ1;          /* 0x0024        */\r
+    unsigned      INTREQ2;          /* 0x0028        */\r
+    unsigned      INTREQ3;          /* 0x002C        */\r
+    unsigned      REQMASKSET0;      /* 0x0030        */\r
+    unsigned      REQMASKSET1;      /* 0x0034        */\r
+    unsigned      REQMASKSET2;      /* 0x0038        */\r
+    unsigned      REQMASKSET3;      /* 0x003C        */\r
+    unsigned      REQMASKCLR0;      /* 0x0040        */\r
+    unsigned      REQMASKCLR1;      /* 0x0044        */\r
+    unsigned      REQMASKCLR2;      /* 0x0048        */\r
+    unsigned      REQMASKCLR3;      /* 0x004C        */\r
+    unsigned      WAKEMASKSET0;     /* 0x0050        */\r
+    unsigned      WAKEMASKSET1;     /* 0x0054        */\r
+    unsigned      WAKEMASKSET2;     /* 0x0058        */\r
+    unsigned      WAKEMASKSET3;     /* 0x005C        */\r
+    unsigned      WAKEMASKCLR0;     /* 0x0060        */\r
+    unsigned      WAKEMASKCLR1;     /* 0x0064        */\r
+    unsigned      WAKEMASKCLR2;     /* 0x0068        */\r
+    unsigned      WAKEMASKCLR3;     /* 0x006C        */\r
+    unsigned      IRQVECREG;        /* 0x0070        */\r
+    unsigned      FIQVECREQ;        /* 0x0074        */\r
+    unsigned                 :  9U; /* 0x0078        */\r
+    unsigned      CAPEVTSRC1 :  7U; /* 0x0078        */\r
+    unsigned                 :  9U; /* 0x0078        */\r
+    unsigned      CAPEVTSRC0 :  7U; /* 0x0078        */\r
+    unsigned      : 32U;            /* 0x007C        */\r
+    unsigned char CHANMAP[64U];     /* 0x0080-0x017C */\r
+} vimBASE_t;\r
+\r
+#define vimREG ((vimBASE_t *)0xFFFFFE00U)\r
+\r
+\r
+\r
+typedef volatile struct rtiBase\r
+{\r
+    unsigned GCTRL;          /**< 0x0000: Global Control Register   */\r
+    unsigned TBCTRL;         /**< 0x0004: Timebase Control Register */\r
+    unsigned CAPCTRL;        /**< 0x0008: Capture Control Register  */\r
+    unsigned COMPCTRL;       /**< 0x000C: Compare Control Register  */\r
+    struct\r
+    {\r
+        unsigned FRCx;       /**< 0x0010,0x0030: Free Running Counter x Register         */\r
+        unsigned UCx;        /**< 0x0014,0x0034: Up Counter x Register                   */\r
+        unsigned CPUCx;      /**< 0x0018,0x0038: Compare Up Counter x Register           */\r
+        unsigned : 32;       /**< 0x001C,0x003C: Reserved                                */\r
+        unsigned CAFRCx;     /**< 0x0020,0x0040: Capture Free Running Counter x Register */\r
+        unsigned CAUCx;      /**< 0x0024,0x0044: Capture Up Counter x Register           */\r
+        unsigned : 32;       /**< 0x0028,0x0048: Reserved                                */\r
+        unsigned : 32;       /**< 0x002C,0x004C: Reserved                                */\r
+    } CNT[2U];               /**< Counter x selection:\r
+                                    - 0: Counter 0\r
+                                    - 1: Counter 1                                       */\r
+    struct\r
+    {\r
+        unsigned COMPx;      /**< 0x0050,0x0058,0x0060,0x0068: Compare x Register        */\r
+        unsigned UDCPx;      /**< 0x0054,0x005C,0x0064,0x006C: Update Compare x Register */\r
+    } CMP[4U];               /**< Compare x selection:\r
+                                    - 0: Compare 0\r
+                                    - 1: Compare 1\r
+                                    - 2: Compare 2\r
+                                    - 3: Compare 3                                       */\r
+    unsigned TBLCOMP;        /**< 0x0070: External Clock Timebase Low Compare Register   */\r
+    unsigned TBHCOMP;        /**< 0x0074: External Clock Timebase High Compare Register  */\r
+    unsigned : 32;           /**< 0x0078: Reserved                                       */\r
+    unsigned : 32;           /**< 0x007C: Reserved                                       */\r
+    unsigned SETINT;         /**< 0x0080: Set/Status Interrupt Register                  */\r
+    unsigned CLEARINT;       /**< 0x0084: Clear/Status Interrupt Register                */\r
+    unsigned INTFLAG;        /**< 0x008C: Interrupt Flag Register                        */\r
+} rtiBASE_t;\r
+\r
+/** @def rtiREG1\r
+*   @brief RTI1 Register Frame Pointer\r
+*\r
+*   This pointer is used by the RTI driver to access the RTI1 registers.\r
+*/\r
+#define rtiREG1 ((rtiBASE_t *)0xFFFFFC00)\r
+\r
+\r
+enum systemClockSource\r
+{\r
+    SYS_OSC      = 0, /**< Alias for oscillator clock Source                */\r
+    SYS_PLL      = 1, /**< Alias for Pll clock Source                       */\r
+    SYS_O32      = 2, /**< Alias for 32 kHz oscillator clock Source         */\r
+    SYS_EXTERNAL = 3, /**< Alias for external clock Source                  */\r
+    SYS_LPO_LOW  = 4, /**< Alias for low power oscillator low clock Source  */\r
+    SYS_LPO_HIGH = 5, /**< Alias for low power oscillator high clock Source */\r
+    SYS_FR_PLL   = 6, /**< Alias for flexray pll clock Source               */\r
+    SYS_VCLK     = 9  /**< Alias for synchronous VCLK1 clock Source         */\r
+};\r
+\r
+typedef volatile struct systemBase1\r
+{\r
+    unsigned SYSPC1;                 /* 0x0000 */\r
+    unsigned SYSPC2;                 /* 0x0004 */\r
+    unsigned SYSPC3;                 /* 0x0008 */\r
+    unsigned SYSPC4;                 /* 0x000C */\r
+    unsigned SYSPC5;                 /* 0x0010 */\r
+    unsigned SYSPC6;                 /* 0x0014 */\r
+    unsigned SYSPC7;                 /* 0x0018 */\r
+    unsigned SYSPC8;                 /* 0x001C */\r
+    unsigned SYSPC9;                 /* 0x0020 */\r
+    unsigned SSWPLL1;                /* 0x0024 */\r
+    unsigned SSWPLL2;                /* 0x0028 */\r
+    unsigned SSWPLL3;                /* 0x002C */\r
+    unsigned CSDIS;                  /* 0x0030 */\r
+    unsigned CSDISSET;               /* 0x0034 */\r
+    unsigned CSDISCLR;               /* 0x0038 */\r
+    unsigned CSDDIS;                 /* 0x003C */\r
+    unsigned CSDDISSET;              /* 0x0040 */\r
+    unsigned CSDDISCLR;              /* 0x0044 */\r
+    unsigned GHVSRC;                 /* 0x0048 */\r
+    unsigned VCLKASRC;               /* 0x004C */\r
+    unsigned RCLKSRC;                /* 0x0050 */\r
+    unsigned CSVSTAT;                /* 0x0054 */\r
+    unsigned MSTGCR;                 /* 0x0058 */\r
+    unsigned MINITGCR;               /* 0x005C */\r
+    unsigned MSINENA;                /* 0x0060 */\r
+    unsigned MSTFAIL;                /* 0x0064 */\r
+    unsigned MSTCGSTAT;              /* 0x0068 */\r
+    unsigned MINISTAT;               /* 0x006C */\r
+    unsigned PLLCTL1;                /* 0x0070 */\r
+    unsigned PLLCTL2;                /* 0x0074 */\r
+    unsigned UERFLAG;                /* 0x0078 */\r
+    unsigned DIEIDL;                 /* 0x007C */\r
+    unsigned DIEIDH;                 /* 0x0080 */\r
+    unsigned VRCTL;                  /* 0x0084 */\r
+    unsigned LPOMONCTL;              /* 0x0088 */\r
+    unsigned CLKTEST;                /* 0x008C */\r
+    unsigned DFTCTRLREG1;            /* 0x0090 */\r
+    unsigned DFTCTRLREG2;            /* 0x0094 */\r
+    unsigned : 32U;                  /* 0x0098 */\r
+    unsigned : 32U;                  /* 0x009C */\r
+    unsigned GPREG1;                 /* 0x00A0 */\r
+    unsigned BTRMSEL;                /* 0x00A4 */\r
+    unsigned IMPFASTS;               /* 0x00A8 */\r
+    unsigned IMPFTADD;               /* 0x00AC */\r
+    unsigned SSISR1;                 /* 0x00B0 */\r
+    unsigned SSISR2;                 /* 0x00B4 */\r
+    unsigned SSISR3;                 /* 0x00B8 */\r
+    unsigned SSISR4;                 /* 0x00BC */\r
+    unsigned RAMGCR;                 /* 0x00C0 */\r
+    unsigned BMMCR1;                 /* 0x00C4 */\r
+    unsigned BMMCR2;                 /* 0x00C8 */\r
+    unsigned MMUGCR;                 /* 0x00CC */\r
+#ifdef _little_endian__\r
+    unsigned        : 8U;            /* 0x00D0 */\r
+    unsigned PENA   : 1U;            /* 0x00D0 */\r
+    unsigned        : 7U;            /* 0x00D0 */\r
+    unsigned VCLKR  : 4U;            /* 0x00D0 */\r
+    unsigned        : 4U;            /* 0x00D0 */\r
+    unsigned VCLK2R : 4U;            /* 0x00D0 */\r
+    unsigned        : 4U;            /* 0x00D0 */\r
+#else\r
+    unsigned        : 4U;            /* 0x00D0 */\r
+    unsigned VCLK2R : 4U;            /* 0x00D0 */\r
+    unsigned        : 4U;            /* 0x00D0 */\r
+    unsigned VCLKR  : 4U;            /* 0x00D0 */\r
+    unsigned        : 7U;            /* 0x00D0 */\r
+    unsigned PENA   : 1U;            /* 0x00D0 */\r
+    unsigned        : 8U;            /* 0x00D0 */\r
+#endif\r
+    unsigned : 32U;                  /* 0x00D4 */\r
+    unsigned DSPGCR;                 /* 0x00D8 */\r
+    unsigned DEVCR1;                 /* 0x00DC */\r
+    unsigned SYSECR;                 /* 0x00E0 */\r
+    unsigned SYSESR;                 /* 0x00E4 */\r
+    unsigned ITIFLAG;                /* 0x00E8 */\r
+    unsigned GBLSTAT;                /* 0x00EC */\r
+    unsigned DEV;                    /* 0x00F0 */\r
+    unsigned SSIVEC;                 /* 0x00F4 */\r
+    unsigned SSIF;                   /* 0x00F8 */\r
+} systemBASE1_t;\r
+\r
+\r
+/** @def systemREG1\r
+*   @brief System Register Frame 1 Pointer\r
+*\r
+*   This pointer is used by the system driver to access the system frame 1 registers.\r
+*/\r
+#define systemREG1 ((systemBASE1_t *)0xFFFFFF00U)\r
+\r
+\r
+/** @def PRE1\r
+*   @brief Alias name for RTI1CLK PRE clock source\r
+*\r
+*   This is an alias name for the RTI1CLK pre clock source.\r
+*   This can be either:\r
+*     - Oscillator\r
+*     - Pll\r
+*     - 32 kHz Oscillator\r
+*     - External\r
+*     - Low Power Oscillator Low\r
+*     - Low Power Oscillator High\r
+*     - Flexray Pll\r
+*/\r
+#define PRE1 SYS_PLL\r
+\r
+/** @def PRE2\r
+*   @brief Alias name for RTI2CLK pre clock source\r
+*\r
+*   This is an alias name for the RTI2CLK pre clock source.\r
+*   This can be either:\r
+*     - Oscillator\r
+*     - Pll\r
+*     - 32 kHz Oscillator\r
+*     - External\r
+*     - Low Power Oscillator Low\r
+*     - Low Power Oscillator High\r
+*     - Flexray Pll\r
+*/\r
+#define PRE2 SYS_PLL\r
+\r
+typedef volatile struct systemBase2\r
+{\r
+    unsigned PLLCTL3;        /* 0x0000 */\r
+    unsigned : 32U;          /* 0x0004 */\r
+    unsigned STCCLKDIV;      /* 0x0008 */\r
+    unsigned CLKHB_GLBREG;   /* 0x000C */\r
+    unsigned CLKHB_RTIDREG;  /* 0x0010 */\r
+    unsigned HBCD_STAT;      /* 0x0014 */\r
+    unsigned : 32U;          /* 0x0018 */\r
+    unsigned : 32U;          /* 0x001C */\r
+    unsigned CLKTRMI1;       /* 0x0020 */\r
+    unsigned ECPCNTRL0;      /* 0x0024 */\r
+    unsigned ECPCNTRL1;      /* 0x0028 */\r
+    unsigned ECPCNTRL2;      /* 0x002C */\r
+    unsigned ECPCNTRL3;      /* 0x0030 */\r
+} systemBASE2_t;\r
+\r
+\r
+/** @def systemREG2\r
+*   @brief System Register Frame 2 Pointer\r
+*\r
+*   This pointer is used by the system driver to access the system frame 2 registers.\r
+*/\r
+#define systemREG2 ((systemBASE2_t *)0xFFFFE100U)\r
+\r
+typedef volatile struct pcrBase\r
+{\r
+    unsigned PMPROTSET0;    /* 0x0000 */\r
+    unsigned PMPROTSET1;    /* 0x0004 */\r
+    unsigned : 32U;         /* 0x0008 */\r
+    unsigned : 32U;         /* 0x000C */\r
+    unsigned PMPROTCLR0;    /* 0x0010 */\r
+    unsigned PMPROTCLR1;    /* 0x0014 */\r
+    unsigned : 32U;         /* 0x0018 */\r
+    unsigned : 32U;         /* 0x001C */\r
+    unsigned PPROTSET0;     /* 0x0020 */\r
+    unsigned PPROTSET1;     /* 0x0024 */\r
+    unsigned PPROTSET2;     /* 0x0028 */\r
+    unsigned PPROTSET3;     /* 0x002C */\r
+    unsigned : 32U;         /* 0x0030 */\r
+    unsigned : 32U;         /* 0x0034 */\r
+    unsigned : 32U;         /* 0x0038 */\r
+    unsigned : 32U;         /* 0x003C */\r
+    unsigned PPROTCLR0;     /* 0x0040 */\r
+    unsigned PPROTCLR1;     /* 0x0044 */\r
+    unsigned PPROTCLR2;     /* 0x0048 */\r
+    unsigned PPROTCLR3;     /* 0x004C */\r
+    unsigned : 32U;         /* 0x0050 */\r
+    unsigned : 32U;         /* 0x0054 */\r
+    unsigned : 32U;         /* 0x0058 */\r
+    unsigned : 32U;         /* 0x005C */\r
+    unsigned PCSPWRDWNSET0; /* 0x0060 */\r
+    unsigned PCSPWRDWNSET1; /* 0x0064 */\r
+    unsigned : 32U;         /* 0x0068 */\r
+    unsigned : 32U;         /* 0x006C */\r
+    unsigned PCSPWRDWNCLR0; /* 0x0070 */\r
+    unsigned PCSPWRDWNCLR1; /* 0x0074 */\r
+    unsigned : 32U;         /* 0x0078 */\r
+    unsigned : 32U;         /* 0x007C */\r
+    unsigned PSPWRDWNSET0;  /* 0x0080 */\r
+    unsigned PSPWRDWNSET1;  /* 0x0084 */\r
+    unsigned PSPWRDWNSET2;  /* 0x0088 */\r
+    unsigned PSPWRDWNSET3;  /* 0x008C */\r
+    unsigned : 32U;         /* 0x0090 */\r
+    unsigned : 32U;         /* 0x0094 */\r
+    unsigned : 32U;         /* 0x0098 */\r
+    unsigned : 32U;         /* 0x009C */\r
+    unsigned PSPWRDWNCLR0;  /* 0x00A0 */\r
+    unsigned PSPWRDWNCLR1;  /* 0x00A4 */\r
+    unsigned PSPWRDWNCLR2;  /* 0x00A8 */\r
+    unsigned PSPWRDWNCLR3;  /* 0x00AC */\r
+} pcrBASE_t;\r
+\r
+/** @def pcrREG\r
+*   @brief Pcr Register Frame Pointer\r
+*\r
+*   This pointer is used by the system driver to access the Pcr registers.\r
+*/\r
+#define pcrREG ((pcrBASE_t *)0xFFFFE000U)\r
+\r
+\r
+typedef struct\r
+{\r
+  __IO uint32_t CTRL;                         /*!< SysTick Control and Status Register */\r
+  __IO uint32_t LOAD;                         /*!< SysTick Reload Value Register       */\r
+  __IO uint32_t VAL;                          /*!< SysTick Current Value Register      */\r
+  __I  uint32_t CALIB;                        /*!< SysTick Calibration Register        */\r
+} SysTick_Type;\r
+\r
+static inline void __disable_irq() {\r
+  __asm volatile("CPSID if");\r
+}\r
+static inline void __enable_irq() {\r
+       __asm volatile("CPSIE if");\r
+\r
+       /*\r
+       __asm volatile("MRS R1, CPSR");\r
+       __asm volatile("BIC R1, R1, #0x80");\r
+       __asm volatile("MSR CPSR, R1");\r
+\r
+       __asm volatile("MRC p15 ,#0 ,R1 ,c1 ,c0 ,#0");\r
+       __asm volatile("ORR R1 ,R1 ,#0x01000000"); //Mask 0-31 bits except bit 24 in Sys ; Ctrl Reg of CORTEX-R4\r
+       __asm volatile("MCR p15 ,#0 ,R1 ,c1 ,c0 ,#0"); //; Enable bit 24\r
+       //__asm volatile("SVC #1");\r
+       */\r
+\r
+}\r
+\r
+\r
+\r
+\r
+#endif /* CORE_CR4_H_ */\r
index 08405454e79efc89cdcbd2e4f2bcf0051d4c6d11..282d4a5f579eaef1a96872b4b356797e62005677 100644 (file)
@@ -16,9 +16,8 @@
 #include "internal.h"
 #include "task_i.h"
 #include "hooks.h"
-#include "stm32f10x.h"
 #include "irq.h"
-#include "core_cm3.h"
+#include "core_cr4.h"
 
 extern void *Irq_VectorTable[NUMBER_OF_INTERRUPTS_AND_EXCEPTIONS];
 
@@ -33,24 +32,26 @@ extern void *Irq_VectorTable[NUMBER_OF_INTERRUPTS_AND_EXCEPTIONS];
 #define AIRCR_VECTKEY    ((uint32_t)0x05FA0000)
 
 /** Set NVIC prio group */
+/* TODO remove
 static void NVIC_SetPrioGroup(uint32_t prioGroup)
 {
   SCB->AIRCR = AIRCR_VECTKEY | (prioGroup<<8);
 }
+*/
 
-void Irq_Init( void ) {
-       //NVIC_SetPrioGroup(3); // No sub prioritys
+
+
+static inline void Irq_Setup() {
+       vimREG->FIRQPR0 = 0x0;
+       vimREG->FIRQPR1 = 0x0;
 }
 
-void Irq_EOI( void ) {
-       /* Note!
-        * This is not applicable on the Cortex-M3 since we
-        * can't terminate the interrupt request without popping
-        * back registers..have to be solved in the context switches
-        * themselves.
-        */
+void Irq_Init( void ) {
+       Irq_Setup();
+       Irq_Enable();
 }
 
+
 #define ICSR_VECTACTIVE                0x1ff
 
 /**
@@ -60,9 +61,11 @@ void Irq_EOI( void ) {
  * Registers. INTISR[0] has vector number 16.
  *
  */
+/* TODO remove
 static uint32_t NVIC_GetActiveVector( void) {
        return (SCB->ICSR &  ICSR_VECTACTIVE);
 }
+*/
 
 /**
  * Init NVIC vector. We do not use subriority
@@ -75,6 +78,7 @@ static uint32_t NVIC_GetActiveVector( void) {
  * @param vector       The IRQ number
  * @param prio      NVIC priority, 0-15, 0-high prio
  */
+/* TODO remove
 static void NVIC_InitVector(IRQn_Type vector, uint32_t prio)
 {
        // Set prio
@@ -85,6 +89,7 @@ static void NVIC_InitVector(IRQn_Type vector, uint32_t prio)
        //NVIC_EnableIRQ(vector);
     NVIC->ISER[vector >> 5] = (uint32_t)1 << (vector & (uint8_t)0x1F);
 }
+*/
 
 /**
  *
@@ -95,23 +100,16 @@ static void NVIC_InitVector(IRQn_Type vector, uint32_t prio)
  */
 void *Irq_Entry( void *stack_p )
 {
-       uint32_t vector = 0;
        uint32_t *stack;
 
+       // Get the active interrupt channel
+       uint8 channel = IrqGetCurrentInterruptSource();
+
        Irq_Disable();
        stack = (uint32_t *)stack_p;
 
-       /* 0. Set the default handler here....
-        * 1. Grab the vector from the interrupt controller
-        *    INT_CTRL_ST[VECTACTIVE]
-        * 2. Irq_VectorTable[vector] is odd -> ISR1
-        *    Irq_VectorTable[vector] is even-> ISR2
-        */
-
-
-       vector = NVIC_GetActiveVector();
+       stack = Os_Isr(stack, (void *)Irq_VectorTable[channel]);
 
-       stack = Os_Isr(stack, (void *)Irq_VectorTable[vector]);
        Irq_Enable();
        return stack;
 }
@@ -159,9 +157,10 @@ void Irq_AttachIsr2(TaskType tid,void *int_ctrl,IrqType vector ) {
        OsPcbType *pcb;
 
        pcb = os_find_task(tid);
-       Irq_VectorTable[vector+16] = (void *)pcb;
+       Irq_VectorTable[vector] = (void *)pcb;
+       IrqActivateChannel(vector);
 
-       NVIC_InitVector(vector, osPrioToCpuPio(pcb->prio));
+       // TOdo replace NVIC_InitVector(vector, osPrioToCpuPio(pcb->prio));
 }
 
 
@@ -173,7 +172,7 @@ void Irq_AttachIsr2(TaskType tid,void *int_ctrl,IrqType vector ) {
  */
 void Irq_GenerateSoftInt( IrqType vector ) {
 
-       NVIC->STIR = (vector);
+       // Todo replace NVIC->STIR = (vector);
 }
 
 /**
index 2d5461ee1c915e4a519216e9e9e448e0f834a404..f48851b1c9b187576cbad5bdbd0ba935f1aaeb6c 100644 (file)
 #ifndef IRQ_TYPES_H\r
 #define IRQ_TYPES_H\r
 \r
-#include "stm32f10x.h"\r
+#define IrqGetCurrentInterruptSource() \\r
+       (((uint8)vimREG->IRQIVEC) - 1)\r
+\r
+/** IrqActivateChannel turns the selected channel on in the VIM */\r
+#define IrqActivateChannel(_channel) \\r
+       vimREG->REQMASKSET0 |= (1 << _channel)\r
+\r
+\r
+/** IrqDeactivateChannel turns the selected channel off in the VIM */\r
+#define IrqDeactivateChannel(_channel) \\r
+       vimREG->REQMASKCLR0 = (1 << _channel)\r
+\r
+\r
+#define Irq_SOI() \\r
+       uint8 channel = IrqGetCurrentInterruptSource(); \\r
+       IrqDeactivateChannel(channel)\r
+\r
+\r
+#define Irq_EOI() \\r
+       IrqActivateChannel(channel)\r
+\r
+\r
+\r
+typedef enum IRQn\r
+{\r
+/******  Cortex-M3 Processor Exceptions Numbers ***************************************************/\r
+  NonMaskableInt_IRQn         = -14,    /*!< 2 Non Maskable Interrupt                             */\r
+  MemoryManagement_IRQn       = -12,    /*!< 4 Cortex-M3 Memory Management Interrupt              */\r
+  BusFault_IRQn               = -11,    /*!< 5 Cortex-M3 Bus Fault Interrupt                      */\r
+  UsageFault_IRQn             = -10,    /*!< 6 Cortex-M3 Usage Fault Interrupt                    */\r
+  SVCall_IRQn                 = -5,     /*!< 11 Cortex-M3 SV Call Interrupt                       */\r
+  DebugMonitor_IRQn           = -4,     /*!< 12 Cortex-M3 Debug Monitor Interrupt                 */\r
+  PendSV_IRQn                 = -2,     /*!< 14 Cortex-M3 Pend SV Interrupt                       */\r
+  SysTick_IRQn                = -1,     /*!< 15 Cortex-M3 System Tick Interrupt                   */\r
+\r
+/******  STM32 specific Interrupt Numbers *********************************************************/\r
+  WWDG_IRQn                   = 0,      /*!< Window WatchDog Interrupt                            */\r
+  PVD_IRQn                    = 1,      /*!< PVD through EXTI Line detection Interrupt            */\r
+  TAMPER_IRQn                 = 2,      /*!< Tamper Interrupt                                     */\r
+  RTC_IRQn                    = 3,      /*!< RTC global Interrupt                                 */\r
+  FLASH_IRQn                  = 4,      /*!< FLASH global Interrupt                               */\r
+  RCC_IRQn                    = 5,      /*!< RCC global Interrupt                                 */\r
+  EXTI0_IRQn                  = 6,      /*!< EXTI Line0 Interrupt                                 */\r
+  EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                 */\r
+  EXTI2_IRQn                  = 8,      /*!< EXTI Line2 Interrupt                                 */\r
+  EXTI3_IRQn                  = 9,      /*!< EXTI Line3 Interrupt                                 */\r
+  EXTI4_IRQn                  = 10,     /*!< EXTI Line4 Interrupt                                 */\r
+  DMA1_Channel1_IRQn          = 11,     /*!< DMA1 Channel 1 global Interrupt                      */\r
+  DMA1_Channel2_IRQn          = 12,     /*!< DMA1 Channel 2 global Interrupt                      */\r
+  DMA1_Channel3_IRQn          = 13,     /*!< DMA1 Channel 3 global Interrupt                      */\r
+  DMA1_Channel4_IRQn          = 14,     /*!< DMA1 Channel 4 global Interrupt                      */\r
+  DMA1_Channel5_IRQn          = 15,     /*!< DMA1 Channel 5 global Interrupt                      */\r
+  DMA1_Channel6_IRQn          = 16,     /*!< DMA1 Channel 6 global Interrupt                      */\r
+  DMA1_Channel7_IRQn          = 17,     /*!< DMA1 Channel 7 global Interrupt                      */\r
+  ADC1_2_IRQn                 = 18,     /*!< ADC1 and ADC2 global Interrupt                       */\r
+\r
+#ifdef STM32F10X_LD\r
+  USB_HP_CAN1_TX_IRQn         = 19,     /*!< USB Device High Priority or CAN1 TX Interrupts       */\r
+  USB_LP_CAN1_RX0_IRQn        = 20,     /*!< USB Device Low Priority or CAN1 RX0 Interrupts       */\r
+  CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                   */\r
+  CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                   */\r
+  EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */\r
+  TIM1_BRK_IRQn               = 24,     /*!< TIM1 Break Interrupt                                 */\r
+  TIM1_UP_IRQn                = 25,     /*!< TIM1 Update Interrupt                                */\r
+  TIM1_TRG_COM_IRQn           = 26,     /*!< TIM1 Trigger and Commutation Interrupt               */\r
+  TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */\r
+  TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */\r
+  TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */\r
+  I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */\r
+  I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */\r
+  SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */\r
+  USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */\r
+  USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */\r
+  EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */\r
+  RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */\r
+  USBWakeUp_IRQn              = 42,     /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */\r
+#endif /* STM32F10X_LD */\r
+\r
+#ifdef STM32F10X_MD\r
+  USB_HP_CAN1_TX_IRQn         = 19,     /*!< USB Device High Priority or CAN1 TX Interrupts       */\r
+  USB_LP_CAN1_RX0_IRQn        = 20,     /*!< USB Device Low Priority or CAN1 RX0 Interrupts       */\r
+  CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                   */\r
+  CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                   */\r
+  EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */\r
+  TIM1_BRK_IRQn               = 24,     /*!< TIM1 Break Interrupt                                 */\r
+  TIM1_UP_IRQn                = 25,     /*!< TIM1 Update Interrupt                                */\r
+  TIM1_TRG_COM_IRQn           = 26,     /*!< TIM1 Trigger and Commutation Interrupt               */\r
+  TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */\r
+  TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */\r
+  TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */\r
+  TIM4_IRQn                   = 30,     /*!< TIM4 global Interrupt                                */\r
+  I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */\r
+  I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */\r
+  I2C2_EV_IRQn                = 33,     /*!< I2C2 Event Interrupt                                 */\r
+  I2C2_ER_IRQn                = 34,     /*!< I2C2 Error Interrupt                                 */\r
+  SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */\r
+  SPI2_IRQn                   = 36,     /*!< SPI2 global Interrupt                                */\r
+  USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */\r
+  USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */\r
+  USART3_IRQn                 = 39,     /*!< USART3 global Interrupt                              */\r
+  EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */\r
+  RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */\r
+  USBWakeUp_IRQn              = 42,     /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */\r
+#endif /* STM32F10X_MD */\r
+\r
+#ifdef STM32F10X_HD\r
+  USB_HP_CAN1_TX_IRQn         = 19,     /*!< USB Device High Priority or CAN1 TX Interrupts       */\r
+  USB_LP_CAN1_RX0_IRQn        = 20,     /*!< USB Device Low Priority or CAN1 RX0 Interrupts       */\r
+  CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                   */\r
+  CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                   */\r
+  EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */\r
+  TIM1_BRK_IRQn               = 24,     /*!< TIM1 Break Interrupt                                 */\r
+  TIM1_UP_IRQn                = 25,     /*!< TIM1 Update Interrupt                                */\r
+  TIM1_TRG_COM_IRQn           = 26,     /*!< TIM1 Trigger and Commutation Interrupt               */\r
+  TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */\r
+  TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */\r
+  TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */\r
+  TIM4_IRQn                   = 30,     /*!< TIM4 global Interrupt                                */\r
+  I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */\r
+  I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */\r
+  I2C2_EV_IRQn                = 33,     /*!< I2C2 Event Interrupt                                 */\r
+  I2C2_ER_IRQn                = 34,     /*!< I2C2 Error Interrupt                                 */\r
+  SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */\r
+  SPI2_IRQn                   = 36,     /*!< SPI2 global Interrupt                                */\r
+  USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */\r
+  USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */\r
+  USART3_IRQn                 = 39,     /*!< USART3 global Interrupt                              */\r
+  EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */\r
+  RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */\r
+  USBWakeUp_IRQn              = 42,     /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */\r
+  TIM8_BRK_IRQn               = 43,     /*!< TIM8 Break Interrupt                                 */\r
+  TIM8_UP_IRQn                = 44,     /*!< TIM8 Update Interrupt                                */\r
+  TIM8_TRG_COM_IRQn           = 45,     /*!< TIM8 Trigger and Commutation Interrupt               */\r
+  TIM8_CC_IRQn                = 46,     /*!< TIM8 Capture Compare Interrupt                       */\r
+  ADC3_IRQn                   = 47,     /*!< ADC3 global Interrupt                                */\r
+  FSMC_IRQn                   = 48,     /*!< FSMC global Interrupt                                */\r
+  SDIO_IRQn                   = 49,     /*!< SDIO global Interrupt                                */\r
+  TIM5_IRQn                   = 50,     /*!< TIM5 global Interrupt                                */\r
+  SPI3_IRQn                   = 51,     /*!< SPI3 global Interrupt                                */\r
+  UART4_IRQn                  = 52,     /*!< UART4 global Interrupt                               */\r
+  UART5_IRQn                  = 53,     /*!< UART5 global Interrupt                               */\r
+  TIM6_IRQn                   = 54,     /*!< TIM6 global Interrupt                                */\r
+  TIM7_IRQn                   = 55,     /*!< TIM7 global Interrupt                                */\r
+  DMA2_Channel1_IRQn          = 56,     /*!< DMA2 Channel 1 global Interrupt                      */\r
+  DMA2_Channel2_IRQn          = 57,     /*!< DMA2 Channel 2 global Interrupt                      */\r
+  DMA2_Channel3_IRQn          = 58,     /*!< DMA2 Channel 3 global Interrupt                      */\r
+  DMA2_Channel4_5_IRQn        = 59      /*!< DMA2 Channel 4 and Channel 5 global Interrupt        */\r
+#endif /* STM32F10X_HD */\r
+\r
+#ifdef STM32F10X_CL\r
+  CAN1_TX_IRQn                = 19,     /*!< USB Device High Priority or CAN1 TX Interrupts       */\r
+  CAN1_RX0_IRQn               = 20,     /*!< USB Device Low Priority or CAN1 RX0 Interrupts       */\r
+  CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                   */\r
+  CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                   */\r
+  EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */\r
+  TIM1_BRK_IRQn               = 24,     /*!< TIM1 Break Interrupt                                 */\r
+  TIM1_UP_IRQn                = 25,     /*!< TIM1 Update Interrupt                                */\r
+  TIM1_TRG_COM_IRQn           = 26,     /*!< TIM1 Trigger and Commutation Interrupt               */\r
+  TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */\r
+  TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */\r
+  TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */\r
+  TIM4_IRQn                   = 30,     /*!< TIM4 global Interrupt                                */\r
+  I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */\r
+  I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */\r
+  I2C2_EV_IRQn                = 33,     /*!< I2C2 Event Interrupt                                 */\r
+  I2C2_ER_IRQn                = 34,     /*!< I2C2 Error Interrupt                                 */\r
+  SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */\r
+  SPI2_IRQn                   = 36,     /*!< SPI2 global Interrupt                                */\r
+  USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */\r
+  USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */\r
+  USART3_IRQn                 = 39,     /*!< USART3 global Interrupt                              */\r
+  EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */\r
+  RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */\r
+  OTG_FS_WKUP_IRQn            = 42,     /*!< USB OTG FS WakeUp from suspend through EXTI Line Interrupt */\r
+  TIM5_IRQn                   = 50,     /*!< TIM5 global Interrupt                                */\r
+  SPI3_IRQn                   = 51,     /*!< SPI3 global Interrupt                                */\r
+  UART4_IRQn                  = 52,     /*!< UART4 global Interrupt                               */\r
+  UART5_IRQn                  = 53,     /*!< UART5 global Interrupt                               */\r
+  TIM6_IRQn                   = 54,     /*!< TIM6 global Interrupt                                */\r
+  TIM7_IRQn                   = 55,     /*!< TIM7 global Interrupt                                */\r
+  DMA2_Channel1_IRQn          = 56,     /*!< DMA2 Channel 1 global Interrupt                      */\r
+  DMA2_Channel2_IRQn          = 57,     /*!< DMA2 Channel 2 global Interrupt                      */\r
+  DMA2_Channel3_IRQn          = 58,     /*!< DMA2 Channel 3 global Interrupt                      */\r
+  DMA2_Channel4_IRQn          = 59,     /*!< DMA2 Channel 4 global Interrupt                      */\r
+  DMA2_Channel5_IRQn          = 60,     /*!< DMA2 Channel 5 global Interrupt                      */\r
+  ETH_IRQn                    = 61,     /*!< Ethernet global Interrupt                            */\r
+  ETH_WKUP_IRQn               = 62,     /*!< Ethernet Wakeup through EXTI line Interrupt          */\r
+  CAN2_TX_IRQn                = 63,     /*!< CAN2 TX Interrupt                                    */\r
+  CAN2_RX0_IRQn               = 64,     /*!< CAN2 RX0 Interrupt                                   */\r
+  CAN2_RX1_IRQn               = 65,     /*!< CAN2 RX1 Interrupt                                   */\r
+  CAN2_SCE_IRQn               = 66,     /*!< CAN2 SCE Interrupt                                   */\r
+  OTG_FS_IRQn                 = 67      /*!< USB OTG FS global Interrupt                          */\r
+#endif /* STM32F10X_CL */\r
+} IRQn_Type;\r
 \r
 typedef IRQn_Type IrqType;\r
 \r
 /* Offset from start of exceptions to interrupts\r
  * Exceptions have negative offsets while interrupts have positive\r
  */\r
-#define IRQ_INTERRUPT_OFFSET  16\r
+//#define IRQ_INTERRUPT_OFFSET  16\r
 \r
 /* Total number of interrupts and exceptions\r
  */\r
-\r
-#if   defined(STM32F10X_LD) || defined(STM32F10X_MD)\r
-#define NUMBER_OF_INTERRUPTS_AND_EXCEPTIONS (USBWakeUp_IRQn+IRQ_INTERRUPT_OFFSET)\r
-#elif defined(STM32F10X_HD)\r
-#define NUMBER_OF_INTERRUPTS_AND_EXCEPTIONS (DMA2_Channel4_5_IRQn+IRQ_INTERRUPT_OFFSET)\r
-#elif defined(STM32F10X_CL)\r
-#define NUMBER_OF_INTERRUPTS_AND_EXCEPTIONS (OTG_FS_IRQn+IRQ_INTERRUPT_OFFSET)\r
-#else\r
-#error No device selected\r
-#endif\r
-\r
+#define NUMBER_OF_INTERRUPTS_AND_EXCEPTIONS 65\r
 \r
 typedef enum {\r
          PERIPHERAL_CLOCK_AHB,\r
index c24b1eff204ed04c10b922926060549339611954..8896fd2758ae7fa3792871c20fc5206dedd34a02 100644 (file)
        .type   Reset_Handler, %function\r
 Reset_Handler: \r
 \r
-/* Copy the data segment initializers from flash to SRAM */  \r
-  movs r1, #0\r
-  b    LoopCopyDataInit\r
+/* Set big endian state */\r
+       SETEND BE\r
+\r
+/* Copy the data segment initializers from flash to SRAM */\r
+       movs    r1, #0\r
+\r
+\r
+Init_Registers:\r
+\r
+        mov   r0,         #0x0000\r
+        mov   r1,         #0x0000\r
+        mov   r2,         #0x0000\r
+        mov   r3,         #0x0000\r
+        mov   r4,         #0x0000\r
+        mov   r5,         #0x0000\r
+        mov   r6,         #0x0000\r
+        mov   r7,         #0x0000\r
+        mov   r8,         #0x0000\r
+        mov   r9,         #0x0000\r
+        mov   r10,        #0x0000\r
+        mov   r11,        #0x0000\r
+        mov   r12,        #0x0000\r
+        mov   r1,         #0x03D0\r
+        orr   r2,        r1,     #0x0001\r
+        msr   cpsr_cxsf,  r2\r
+        msr   spsr_cxsf,  r2\r
+        mov   r8,         #0x0000\r
+        mov   r9,         #0x0000\r
+        mov   r10,        #0x0000\r
+        mov   r11,        #0x0000\r
+        mov   r12,        #0x0000\r
+        orr   r12,        r1,     #0x0002\r
+        msr   cpsr_c,     r12\r
+        msr   spsr_cxsf,  r12\r
+        orr   r12,        r1,     #0x0007\r
+        msr   cpsr_c,     r12\r
+        msr   spsr_cxsf,  r12\r
+        orr   r12,        r1,     #0x000B\r
+        msr   cpsr_c,     r12\r
+        msr   spsr_cxsf,  r12\r
+        orr   r12,        r1,     #0x0003\r
+        msr   cpsr_c,     r12\r
+        msr   spsr_cxsf,  r12\r
+\r
+        /* System level configuration */\r
+        mrc   p15,0,r11,c1,c0,0       /* Read current system configuration */\r
+        mov   r12,               #0x40000000 /* Set THUMB instruction set mode for interrupts and exceptions */\r
+        orr   r12, r12, r11\r
+        mcr   p15,0,r12,c1,c0,0       /* Write new configuration */\r
+\r
+\r
+Init_Stack_Pointers:\r
+\r
+user:   .word _estack\r
+svc:    .word _estack\r
+fiq:    .word _estack\r
+irq:    .word _estack\r
+abort:  .word _estack\r
+undef:  .word _estack\r
+\r
+               mov   r2,               #0xD1\r
+        msr   cpsr_c,   r2\r
+        ldr   sp,       fiq\r
+\r
+        mov   r2,              #0xD2\r
+        msr   cpsr_c,   r2\r
+        ldr   sp,       irq\r
+\r
+        mov   r2,              #0xD7\r
+        msr   cpsr_c,   r2\r
+        ldr   sp,       abort\r
+\r
+        mov   r2,              #0xDB\r
+        msr   cpsr_c,   r2\r
+        ldr   sp,       undef\r
+\r
+        mov   r2,              #0xDF\r
+        msr   cpsr_c,   r2\r
+        ldr   sp,       user\r
+\r
+        mov   r2,              #0xD3\r
+        msr   cpsr_c,   r2\r
+        ldr   sp,       svc\r
+\r
+\r
+CopyInitializedData:\r
+       ldr     r0, =_sdata       /* r0 holds start of data in ram */\r
+       ldr     r3, =_edata       /* r3 holds end of data in ram */\r
+       ldr     r5, =_sidata      /* r5 start of data in flash */\r
+       movs  r1,       #0    /* r1 is the counter */\r
+       b       LoopCopyDataInit\r
 \r
 CopyDataInit:\r
-       ldr     r3, =_sidata\r
-       ldr     r3, [r3, r1]\r
-       str     r3, [r0, r1]\r
-       adds    r1, r1, #4\r
+       ldr     r4, [r5, r1]          /* read current position in flash */\r
+       str     r4, [r0, r1]          /* store current position in ram */\r
+       adds    r1, r1, #4        /* increment counter */\r
     \r
 LoopCopyDataInit:\r
-       ldr     r0, =_sdata\r
-       ldr     r3, =_edata\r
-       adds    r2, r0, r1\r
-       cmp     r2, r3\r
-       bcc     CopyDataInit\r
-       ldr     r2, =_sbss\r
-       b       LoopFillZerobss\r
+       adds    r2, r0, r1        /* are we at the final position? */\r
+       cmp     r2, r3                /* ... */\r
+       bcc     CopyDataInit          /* nope, continue */\r
+\r
+/* Fill zero areas */\r
+       ldr     r2, =_sbss            /* r2 holds the start address */\r
+       ldr r5, =_ebss            /* r5 holds the end address */\r
+       bl      LoopFillZero\r
+\r
+       ldr     r2, =_sstack            /* r2 holds the start address */\r
+       ldr r5, =_estack            /* r5 holds the end address */\r
+       bl      LoopFillZero\r
+\r
+/* Call the application's entry point.*/\r
+       mov   r2,               #0xDF\r
+    msr   cpsr_c,   r2\r
+       bl      main\r
+       bx      lr\r
+\r
 /* Zero fill the bss segment. */  \r
-FillZerobss:\r
+FillZero:\r
        movs    r3, #0\r
-       str     r3, [r2], #4\r
+       str         r3, [r2], #4\r
     \r
-LoopFillZerobss:\r
-       ldr     r3, = _ebss\r
-       cmp     r2, r3\r
-       bcc     FillZerobss\r
-/* Call the application's entry point.*/\r
-       bl      main\r
-       bx      lr    \r
+LoopFillZero:\r
+       cmp     r2, r5\r
+       bcc     FillZero\r
+       bx  lr\r
+\r
+Dummy_Irq:\r
+       nop\r
+       nop\r
+       b Dummy_Irq\r
+\r
 .size  Reset_Handler, .-Reset_Handler\r
 \r
 /**\r
@@ -85,55 +187,20 @@ Default_Handler:
 Infinite_Loop:\r
        b       Infinite_Loop\r
        .size   Default_Handler, .-Default_Handler\r
+\r
+\r
 /******************************************************************************\r
-* Vector table for a Cortex M3. Vectors start at addr 0x0.\r
+* Interrupt and exception vectors. Vectors start at addr 0x0.\r
 ******************************************************************************/    \r
-       .section        .isr_vector,"a",%progbits\r
-       .type   g_pfnVectors, %object\r
-       .size   g_pfnVectors, .-g_pfnVectors\r
-\r
+       .section        .int_vecs,"ax",%progbits\r
        .extern Irq_Handler\r
 \r
-       .word   _estack\r
-       .word   Reset_Handler\r
-       .word   NMI_Handler\r
-       .word   HardFault_Handler\r
-       .word   MemManage_Handler\r
-       .word   BusFault_Handler\r
-       .word   UsageFault_Handler\r
-       .word   0\r
-       .word   0\r
-       .word   0\r
-       .word   0\r
-       .word   SVC_Handler\r
-       .word   DebugMon_Handler\r
-       .word   0\r
-       .word   PendSV_Handler\r
-       .word   Irq_Handler+1           /* SysTick */\r
-       .rept   83\r
-       .word   Irq_Handler+1\r
-       .endr\r
-    \r
-      .weak    NMI_Handler\r
-       .thumb_set NMI_Handler,Default_Handler\r
-\r
-       .weak   HardFault_Handler\r
-       .thumb_set HardFault_Handler,Default_Handler\r
-\r
-       .weak   MemManage_Handler\r
-       .thumb_set MemManage_Handler,Default_Handler\r
-\r
-       .weak   BusFault_Handler\r
-       .thumb_set BusFault_Handler,Default_Handler\r
-\r
-       .weak   UsageFault_Handler\r
-       .thumb_set UsageFault_Handler,Default_Handler\r
-\r
-       .weak   SVC_Handler\r
-       .thumb_set SVC_Handler,Default_Handler\r
-\r
-       .weak   DebugMon_Handler\r
-       .thumb_set DebugMon_Handler,Default_Handler\r
+        b   Dummy_Irq          /* Reset? */\r
+        b   Dummy_Irq          /* Undef? */\r
+        b   Dummy_Irq          /* SVC */\r
+        b   Dummy_Irq          /* Prefetch */\r
+        b   Dummy_Irq          /* data */\r
+        b   Dummy_Irq          /* ? */\r
+        b   Irq_Handler        /* IRQ */\r
+           b   Irq_Handler        /* FIR */\r
 \r
-       .weak   PendSV_Handler\r
-       .thumb_set PendSV_Handler,Default_Handler\r
diff --git a/arch/arm/arm_cr4/kernel/sys_core.asm b/arch/arm/arm_cr4/kernel/sys_core.asm
new file mode 100644 (file)
index 0000000..47f9245
--- /dev/null
@@ -0,0 +1,433 @@
+;-------------------------------------------------------------------------------\r
+; sys_core.asm\r
+;\r
+; (c) Texas Instruments 2009, All rights reserved.\r
+;\r
+\r
+    .text\r
+    .arm\r
+\r
+;-------------------------------------------------------------------------------\r
+; Initialize CPU Registers\r
+\r
+    .global  _coreInitRegisters_\r
+    .asmfunc\r
+\r
+_coreInitRegisters_:\r
+\r
+        mov   r0,         lr\r
+        mov   r1,         #0x03D0\r
+        mov   r2,         #0x0000\r
+        mov   r3,         #0x0000\r
+        mov   r4,         #0x0000\r
+        mov   r5,         #0x0000\r
+        mov   r6,         #0x0000\r
+        mov   r7,         #0x0000\r
+        mov   r8,         #0x0000\r
+        mov   r9,         #0x0000\r
+        mov   r10,        #0x0000\r
+        mov   r11,        #0x0000\r
+        mov   r12,        #0x0000\r
+        orr   r13,        r1,     #0x0001\r
+        msr   cpsr_cxsf,  r13\r
+        msr   spsr_cxsf,  r13\r
+        mov   lr,         r0\r
+        mov   r8,         #0x0000\r
+        mov   r9,         #0x0000\r
+        mov   r10,        #0x0000\r
+        mov   r11,        #0x0000\r
+        mov   r12,        #0x0000\r
+        orr   r13,        r1,     #0x0002\r
+        msr   cpsr_c,     r13\r
+        msr   spsr_cxsf,  r13\r
+        mov   lr,         r0\r
+        orr   r13,        r1,     #0x0007\r
+        msr   cpsr_c,     r13\r
+        msr   spsr_cxsf,  r13\r
+        mov   lr,         r0\r
+        orr   r13,        r1,     #0x000B\r
+        msr   cpsr_c,     r13\r
+        msr   spsr_cxsf,  r13\r
+        mov   lr,         r0\r
+        orr   r13,        r1,     #0x0003\r
+        msr   cpsr_c,     r13\r
+        msr   spsr_cxsf,  r13\r
+\r
+       .if 1\r
+        fmdrr d0,        r1,     r1\r
+        fmdrr d1,        r1,     r1\r
+        fmdrr d2,        r1,     r1\r
+        fmdrr d3,        r1,     r1\r
+        fmdrr d4,        r1,     r1\r
+        fmdrr d5,        r1,     r1\r
+        fmdrr d6,        r1,     r1\r
+        fmdrr d7,        r1,     r1\r
+        fmdrr d8,        r1,     r1\r
+        fmdrr d9,        r1,     r1\r
+        fmdrr d10,       r1,     r1\r
+        fmdrr d11,       r1,     r1\r
+        fmdrr d12,       r1,     r1\r
+        fmdrr d13,       r1,     r1\r
+        fmdrr d14,       r1,     r1\r
+        fmdrr d15,       r1,     r1\r
+    .endif\r
+\r
+        bl    $+4\r
+        bl    $+4\r
+        bl    $+4\r
+        bl    $+4\r
+        bx    r0\r
+\r
+    .endasmfunc\r
+\r
+\r
+;-------------------------------------------------------------------------------\r
+; Initialize Stack Pointers\r
+\r
+    .global  _coreInitStackPointer_\r
+    .asmfunc\r
+\r
+_coreInitStackPointer_:\r
+\r
+        msr   cpsr_c,   #0xD1\r
+        ldr   sp,       fiq\r
+        msr   cpsr_c,   #0xD2\r
+        ldr   sp,       irq\r
+        msr   cpsr_c,   #0xD7\r
+        ldr   sp,       abort\r
+        msr   cpsr_c,   #0xDB\r
+        ldr   sp,       undef\r
+        msr   cpsr_c,   #0xDF\r
+        ldr   sp,       user\r
+        msr   cpsr_c,   #0xD3\r
+        ldr   sp,       svc\r
+        bx    lr\r
+\r
+user:   .word 0x08000000+0x00001000\r
+svc:    .word 0x08000000+0x00001000+0x00000100\r
+fiq:    .word 0x08000000+0x00001000+0x00000100+0x00000100\r
+irq:    .word 0x08000000+0x00001000+0x00000100+0x00000100+0x00000100\r
+abort:  .word 0x08000000+0x00001000+0x00000100+0x00000100+0x00000100+0x00000100\r
+undef:  .word 0x08000000+0x00001000+0x00000100+0x00000100+0x00000100+0x00000100+0x00000100\r
+\r
+    .endasmfunc\r
+\r
+\r
+;-------------------------------------------------------------------------------\r
+; Enable VFP Unit\r
+\r
+    .global  _coreEnableVfp_\r
+    .asmfunc\r
+\r
+_coreEnableVfp_:\r
+\r
+       .if 1\r
+        mrc   p15,     #0x00,      r0,       c1, c0, #0x02\r
+        orr   r0,      r0,         #0xF00000\r
+        mcr   p15,     #0x00,      r0,       c1, c0, #0x02\r
+        mov   r0,      #0x40000000\r
+        fmxr  fpexc,   r0\r
+       .endif\r
+\r
+        bx    lr\r
+\r
+    .endasmfunc\r
+\r
+\r
+;-------------------------------------------------------------------------------\r
+; Enable Event Bus Export\r
+\r
+    .global  _coreEnableEventBusExport_\r
+    .asmfunc\r
+\r
+_coreEnableEventBusExport_:\r
+\r
+        mrc   p15, #0x00, r0,         c9, c12, #0x00\r
+        orr   r0,  r0,    #0x10\r
+        mcr   p15, #0x00, r0,         c9, c12, #0x00\r
+        bx    lr\r
+\r
+    .endasmfunc\r
+\r
+\r
+;-------------------------------------------------------------------------------\r
+; Disable Event Bus Export\r
+\r
+    .global  _coreDisableEventBusExport_\r
+    .asmfunc\r
+\r
+_coreDisableEventBusExport_:\r
+\r
+        mrc   p15, #0x00, r0,         c9, c12, #0x00\r
+        bic   r0,  r0,    #0x10\r
+        mcr   p15, #0x00, r0,         c9, c12, #0x00\r
+        bx    lr\r
+\r
+    .endasmfunc\r
+\r
+\r
+;-------------------------------------------------------------------------------\r
+; Enable RAM ECC Support\r
+\r
+    .global  _coreEnableRamEcc_\r
+    .asmfunc\r
+\r
+_coreEnableRamEcc_:\r
+\r
+        mrc   p15, #0x00, r0,         c1, c0,  #0x01\r
+        orr   r0,  r0,    #0x0C000000\r
+        mcr   p15, #0x00, r0,         c1, c0,  #0x01\r
+        bx    lr\r
+\r
+    .endasmfunc\r
+\r
+\r
+;-------------------------------------------------------------------------------\r
+; Disable RAM ECC Support\r
+\r
+    .global  _coreDisableRamEcc_\r
+    .asmfunc\r
+\r
+_coreDisableRamEcc_:\r
+\r
+        mrc   p15, #0x00, r0,         c1, c0,  #0x01\r
+        bic   r0,  r0,    #0x0C000000\r
+        mcr   p15, #0x00, r0,         c1, c0,  #0x01\r
+        bx    lr\r
+\r
+    .endasmfunc\r
+\r
+\r
+;-------------------------------------------------------------------------------\r
+; Enable Flash ECC Support\r
+\r
+    .global  _coreEnableFlashEcc_\r
+    .asmfunc\r
+\r
+_coreEnableFlashEcc_:\r
+\r
+        mrc   p15, #0x00, r0,         c1, c0,  #0x01\r
+        orr   r0,  r0,    #0x02000000\r
+        mcr   p15, #0x00, r0,         c1, c0,  #0x01\r
+        bx    lr\r
+\r
+    .endasmfunc\r
+\r
+\r
+;-------------------------------------------------------------------------------\r
+; Disable Flash ECC Support\r
+\r
+    .global  _coreDisableFlashEcc_\r
+    .asmfunc\r
+\r
+_coreDisableFlashEcc_:\r
+\r
+        mrc   p15, #0x00, r0,         c1, c0,  #0x01\r
+        bic   r0,  r0,    #0x02000000\r
+        mcr   p15, #0x00, r0,         c1, c0,  #0x01\r
+        bx    lr\r
+\r
+    .endasmfunc\r
+\r
+\r
+;-------------------------------------------------------------------------------\r
+; Enable Offset via Vic controller\r
+\r
+    .global  _coreEnableIrqVicOffset_\r
+    .asmfunc\r
+\r
+_coreEnableIrqVicOffset_:\r
+\r
+        mrc   p15, #0, r0,         c1, c0,  #0\r
+        orr   r0,  r0,    #0x01000000\r
+        mcr   p15, #0, r0,         c1, c0,  #0\r
+        bx    lr\r
+\r
+    .endasmfunc\r
+\r
+\r
+;-------------------------------------------------------------------------------\r
+; Get data fault status register\r
+\r
+    .global  _coreGetDataFault_\r
+    .asmfunc\r
+\r
+_coreGetDataFault_:\r
+\r
+        mrc   p15, #0, r0, c5, c0,  #0\r
+        bx    lr\r
+\r
+    .endasmfunc\r
+\r
+\r
+;-------------------------------------------------------------------------------\r
+; Clear data fault status register\r
+\r
+    .global  _coreClearDataFault_\r
+    .asmfunc\r
+\r
+_coreClearDataFault_:\r
+\r
+        mov   r0,  #0\r
+        mcr   p15, #0, r0, c5, c0,  #0\r
+        bx    lr\r
+\r
+    .endasmfunc\r
+\r
+\r
+;-------------------------------------------------------------------------------\r
+; Get instruction fault status register\r
+\r
+    .global  _coreGetInstructionFault_\r
+    .asmfunc\r
+\r
+_coreGetInstructionFault_:\r
+\r
+        mrc   p15, #0, r0, c5, c0, #1\r
+        bx    lr\r
+\r
+    .endasmfunc\r
+\r
+\r
+;-------------------------------------------------------------------------------\r
+; Clear instruction fault status register\r
+\r
+    .global  _coreClearInstructionFault_\r
+    .asmfunc\r
+\r
+_coreClearInstructionFault_:\r
+\r
+        mov   r0,  #0\r
+        mcr   p15, #0, r0, c5, c0, #1\r
+        bx    lr\r
+\r
+    .endasmfunc\r
+\r
+\r
+;-------------------------------------------------------------------------------\r
+; Get data fault address register\r
+\r
+    .global  _coreGetDataFaultAddress_\r
+    .asmfunc\r
+\r
+_coreGetDataFaultAddress_:\r
+\r
+        mrc   p15, #0, r0, c6, c0,  #0\r
+        bx    lr\r
+\r
+    .endasmfunc\r
+\r
+\r
+;-------------------------------------------------------------------------------\r
+; Clear data fault address register\r
+\r
+    .global  _coreClearDataFaultAddress_\r
+    .asmfunc\r
+\r
+_coreClearDataFaultAddress_:\r
+\r
+        mov   r0,  #0\r
+        mcr   p15, #0, r0, c6, c0,  #0\r
+        bx    lr\r
+\r
+    .endasmfunc\r
+\r
+\r
+;-------------------------------------------------------------------------------\r
+; Get instruction fault address register\r
+\r
+    .global  _coreGetInstructionFaultAddress_\r
+    .asmfunc\r
+\r
+_coreGetInstructionFaultAddress_:\r
+\r
+        mrc   p15, #0, r0, c6, c0, #2\r
+        bx    lr\r
+\r
+    .endasmfunc\r
+\r
+\r
+;-------------------------------------------------------------------------------\r
+; Clear instruction fault address register\r
+\r
+    .global  _coreClearInstructionFaultAddress_\r
+    .asmfunc\r
+\r
+_coreClearInstructionFaultAddress_:\r
+\r
+        mov   r0,  #0\r
+        mcr   p15, #0, r0, c6, c0, #2\r
+        bx    lr\r
+\r
+    .endasmfunc\r
+\r
+\r
+;-------------------------------------------------------------------------------\r
+; Get auxiliary data fault status register\r
+\r
+    .global  _coreGetAuxiliaryDataFault_\r
+    .asmfunc\r
+\r
+_coreGetAuxiliaryDataFault_:\r
+\r
+        mrc   p15, #0, r0, c5, c1, #0\r
+        bx    lr\r
+\r
+    .endasmfunc\r
+\r
+\r
+;-------------------------------------------------------------------------------\r
+; Clear auxiliary data fault status register\r
+\r
+    .global  _coreClearAuxiliaryDataFault_\r
+    .asmfunc\r
+\r
+_coreClearAuxiliaryDataFault_:\r
+\r
+        mov   r0,  #0\r
+        mcr   p15, #0, r0, c5, c1, #0\r
+        bx    lr\r
+\r
+    .endasmfunc\r
+\r
+\r
+;-------------------------------------------------------------------------------\r
+; Get auxiliary instruction fault status register\r
+\r
+    .global  _coreGetAuxiliaryInstructionFault_\r
+    .asmfunc\r
+\r
+_coreGetAuxiliaryInstructionFault_:\r
+\r
+        mrc   p15, #0, r0, c5, c1, #1\r
+        bx    lr\r
+\r
+    .endasmfunc\r
+\r
+\r
+;-------------------------------------------------------------------------------\r
+; Clear auxiliary instruction fault status register\r
+\r
+    .global  _coreClearAuxiliaryInstructionFault_\r
+    .asmfunc\r
+\r
+_coreClearAuxiliaryInstructionFault_:\r
+\r
+        mov   r0,  #0\r
+        mrc   p15, #0, r0, c5, c1, #1\r
+        bx    lr\r
+\r
+    .endasmfunc\r
+    \r
+    \r
+;-------------------------------------------------------------------------------\r
+; C++ construct table pointers\r
+\r
+    .global __TI_PINIT_Base, __TI_PINIT_Limit\r
+    .weak   SHT$$INIT_ARRAY$$Base, SHT$$INIT_ARRAY$$Limit\r
+\r
+__TI_PINIT_Base:  .long SHT$$INIT_ARRAY$$Base\r
+__TI_PINIT_Limit: .long SHT$$INIT_ARRAY$$Limit\r
+\r
+;-------------------------------------------------------------------------------\r
+\r
index 553ef61cce4e52d67c618393898d1b088f30d150..0d9c0a117f27b69b11edb0a6ab7a96f9c152496e 100644 (file)
@@ -15,8 +15,7 @@
 \r
 #include "Os.h"\r
 #include "internal.h"\r
-#include "stm32f10x.h"\r
-#include "core_cm3.h"\r
+#include "core_cr4.h"\r
 #include "irq.h"\r
 #include "arc.h"\r
 \r
  */\r
 void Os_SysTickInit( void ) {\r
        TaskType tid;\r
-       tid = Os_Arc_CreateIsr(OsTick,6/*prio*/,"OsTick");\r
-       Irq_AttachIsr2(tid,NULL, SysTick_IRQn);\r
+       tid = Os_Arc_CreateIsr(OsTick,6,"OsTick");\r
+       Irq_AttachIsr2(tid,NULL, 2);\r
+}\r
+\r
+\r
+static inline uint32_t SysTick_Config(uint32_t ticks)\r
+{\r
+\r
+           /** - Setup NTU source, debug options and disable both counter blocks */\r
+           rtiREG1->GCTRL = 0x0;\r
+\r
+           /** - Setup timebase for free running counter 0 */\r
+           rtiREG1->TBCTRL = 0x0;\r
+\r
+           /** - Enable/Disable capture event sources for both counter blocks */\r
+           rtiREG1->CAPCTRL = 0x0;\r
+\r
+           /** - Setup input source compare 0-3 */\r
+           rtiREG1->COMPCTRL = 0x0;\r
+\r
+           /** - Reset up counter 0 */\r
+           rtiREG1->CNT[0U].UCx = 0x00000000U;\r
+\r
+           /** - Reset free running counter 0 */\r
+           rtiREG1->CNT[0U].FRCx = 0x00000000U;\r
+\r
+           /** - Setup up counter 0 compare value\r
+           *     - 0x00000000: Divide by 2^32\r
+           *     - 0x00000001-0xFFFFFFFF: Divide by (CPUC0 + 1)\r
+           */\r
+           rtiREG1->CNT[0U].CPUCx = 4U;\r
+\r
+           /** - Setup compare 0 value. This value is compared with selected free running counter. */\r
+           rtiREG1->CMP[0U].COMPx = 9360U;\r
+\r
+           /** - Setup update compare 0 value. This value is added to the compare 0 value on each compare match. */\r
+           rtiREG1->CMP[0U].UDCPx = 9360U;\r
+\r
+           /** - Clear all pending interrupts */\r
+           rtiREG1->INTFLAG = 0x0;\r
+\r
+           /** - Disable all interrupts */\r
+           rtiREG1->CLEARINT = 0x0;\r
+\r
+  return (0);                                                                            /* Function successful */\r
 }\r
 \r
 /**\r
@@ -36,7 +78,6 @@ void Os_SysTickInit( void ) {
  * @param period_ticks How long the period in timer ticks should be.\r
  *\r
  */\r
-\r
 void Os_SysTickStart(uint32_t period_ticks) {\r
 \r
        /* Cortex-M3 have a 24-bit system timer that counts down\r
@@ -44,9 +85,12 @@ void Os_SysTickStart(uint32_t period_ticks) {
         */\r
 \r
        SysTick_Config(period_ticks);\r
+       rtiREG1->GCTRL  = 0x1;\r
+       rtiREG1->SETINT = 0x1;\r
+\r
 \r
         /* Set SysTick Priority to 3 */\r
-       NVIC_SetPriority(SysTick_IRQn, 0x0C);\r
+       // TODO removeNVIC_SetPriority(SysTick_IRQn, 0x0C);\r
 \r
 #if 0\r
        // SysTick interrupt each 250ms with counter clock equal to 9MHz\r
@@ -68,7 +112,8 @@ void Os_SysTickStart(uint32_t period_ticks) {
 \r
 uint32_t Os_SysTickGetValue( void )\r
 {\r
-       return (SysTick->LOAD) - (SysTick->VAL);\r
+       //return (SysTick->LOAD) - (SysTick->VAL);\r
+       return 0;\r
 }\r
 \r
 \r
@@ -76,8 +121,12 @@ TickType Os_SysTickGetElapsedValue( uint32_t preValue ) {
        uint32_t curr;\r
        uint32_t max;\r
 \r
+       /*\r
        curr = (SysTick->VAL);\r
        max  = (SysTick->LOAD);\r
+       */\r
+       curr = 0;\r
+       max = 0;\r
        return Os_CounterDiff((max - curr),preValue,max);\r
 }\r
 \r
index 0f0585117167c88e154d59010002e6d781f7735c..1a629cdf430f93a6402035a3a68bd5155941b3c3 100644 (file)
@@ -2,10 +2,10 @@
 # prefered version\r
 CC_VERSION=4.5.1\r
 # ARMv7, Thumb-2, little endian, soft-float. \r
-cflags-y       += -mthumb -mcpu=cortex-r4 #-mfix-cortex-m3-ldrd\r
-cflags-y       += -ggdb\r
+cflags-y       += -mthumb -mcpu=cortex-r4f -mbig-endian #-mfix-cortex-m3-ldrd\r
+cflags-y       += -ggdb -mbig-endian\r
 \r
 lib-y          += -lgcc -lc\r
-ASFLAGS        += -mcpu=cortex-r4 -mthumb\r
-\r
+ASFLAGS        +=  -mcpu=cortex-r4f -mbig-endian -mthumb\r
 \r
+LDFLAGS     += 
\ No newline at end of file
index 0a937c3adabda71d5bb5b9b4dd3273b879b9aba0..97973478b953768d74aee02306392f66d9e96eae 100644 (file)
@@ -10,7 +10,7 @@
  * _etext  - ?\r
  */\r
 \r
-OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm","elf32-littlearm")\r
+OUTPUT_FORMAT("elf32-bigarm")\r
 OUTPUT_ARCH(arm)\r
 ENTRY(Reset_Handler)\r
 \r
@@ -22,12 +22,10 @@ MEMORY
 SECTIONS\r
 {\r
 \r
-    .isr_vector :\r
+    .int_vecs :\r
     {\r
-       . = ALIGN(4);\r
-        KEEP(*(.isr_vector))\r
-       . = ALIGN(4);\r
-    } > flash\r
+        KEEP(*(.int_vecs))\r
+    } > intvecs\r
 \r
     .text :\r
        {\r
@@ -62,13 +60,13 @@ SECTIONS
        /* Read-only data section. */\r
        .rodata :       { \r
                *(.rodata .rodata.* .gnu.linkonce.r.*)\r
-               _sidata = .;\r
+               _sidata = ALIGN(.,4);\r
        } > flash\r
 \r
        .data : AT(ALIGN(LOADADDR(.rodata)+SIZEOF(.rodata),4)) {\r
-               _sdata = .\r
+               _sdata = ALIGN(.,4)\r
                *(.data .data.* .gnu.linkonce.d.* .gnu.linkonce.r.* .eh_frame)\r
-               _edata = .;             \r
+               _edata = ALIGN(.,4);            \r
        } > ram\r
 \r
        .t32_outport ALIGN(0x10): { *(.t32_outport); } > ram\r
@@ -80,8 +78,11 @@ SECTIONS
        \r
        .init_stack ALIGN(16) (NOLOAD) : \r
        {       \r
-               . = . + 200;    \r
+               _sstack = .;\r
+               . = . + 8000;   \r
                _estack = .; \r
+               . = . + 1;\r
+               . = ALIGN(4);\r
        } > ram\r
        \r
        /* Fls RAM section */\r