Subversion Repositories EngineBay2

Rev

Rev 2 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2 Rev 28
Line 1... Line 1...
1
/**************************************************************************//**
1
/**************************************************************************//**
2
 * @file     core_cm0plus.h
2
 * @file     core_cm0plus.h
3
 * @brief    CMSIS Cortex-M0+ Core Peripheral Access Layer Header File
3
 * @brief    CMSIS Cortex-M0+ Core Peripheral Access Layer Header File
4
 * @version  V4.30
4
 * @version  V5.0.6
5
 * @date     20. October 2015
5
 * @date     28. May 2018
6
 ******************************************************************************/
6
 ******************************************************************************/
-
 
7
/*
7
/* Copyright (c) 2009 - 2015 ARM LIMITED
8
 * Copyright (c) 2009-2018 Arm Limited. All rights reserved.
8
 
9
 *
9
   All rights reserved.
10
 * SPDX-License-Identifier: Apache-2.0
10
   Redistribution and use in source and binary forms, with or without
-
 
11
   modification, are permitted provided that the following conditions are met:
-
 
-
 
11
 *
12
   - Redistributions of source code must retain the above copyright
12
 * Licensed under the Apache License, Version 2.0 (the License); you may
13
     notice, this list of conditions and the following disclaimer.
13
 * not use this file except in compliance with the License.
14
   - Redistributions in binary form must reproduce the above copyright
14
 * You may obtain a copy of the License at
15
     notice, this list of conditions and the following disclaimer in the
-
 
16
     documentation and/or other materials provided with the distribution.
-
 
17
   - Neither the name of ARM nor the names of its contributors may be used
-
 
18
     to endorse or promote products derived from this software without
-
 
-
 
15
 *
19
     specific prior written permission.
16
 * www.apache.org/licenses/LICENSE-2.0
20
   *
17
 *
21
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-
 
22
   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-
 
23
   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-
 
24
   ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
-
 
25
   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-
 
26
   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-
 
27
   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
18
 * Unless required by applicable law or agreed to in writing, software
28
   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
19
 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
29
   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
20
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
30
   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
21
 * See the License for the specific language governing permissions and
31
   POSSIBILITY OF SUCH DAMAGE.
22
 * limitations under the License.
32
   ---------------------------------------------------------------------------*/
-
 
33
 
23
 */
34
 
24
 
35
#if   defined ( __ICCARM__ )
25
#if   defined ( __ICCARM__ )
36
 #pragma system_include         /* treat file as system include file for MISRA check */
26
  #pragma system_include         /* treat file as system include file for MISRA check */
37
#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
27
#elif defined (__clang__)
38
  #pragma clang system_header   /* treat file as system include file */
28
  #pragma clang system_header   /* treat file as system include file */
39
#endif
29
#endif
40
 
30
 
41
#ifndef __CORE_CM0PLUS_H_GENERIC
31
#ifndef __CORE_CM0PLUS_H_GENERIC
42
#define __CORE_CM0PLUS_H_GENERIC
32
#define __CORE_CM0PLUS_H_GENERIC
Line 68... Line 58...
68
/**
58
/**
69
  \ingroup Cortex-M0+
59
  \ingroup Cortex-M0+
70
  @{
60
  @{
71
 */
61
 */
72
 
62
 
-
 
63
#include "cmsis_version.h"
-
 
64
 
73
/*  CMSIS CM0+ definitions */
65
/*  CMSIS CM0+ definitions */
74
#define __CM0PLUS_CMSIS_VERSION_MAIN (0x04U)                                   /*!< [31:16] CMSIS HAL main version */
66
#define __CM0PLUS_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN)                  /*!< \deprecated [31:16] CMSIS HAL main version */
75
#define __CM0PLUS_CMSIS_VERSION_SUB  (0x1EU)                                   /*!< [15:0]  CMSIS HAL sub version */
67
#define __CM0PLUS_CMSIS_VERSION_SUB  (__CM_CMSIS_VERSION_SUB)                   /*!< \deprecated [15:0]  CMSIS HAL sub version */
76
#define __CM0PLUS_CMSIS_VERSION      ((__CM0PLUS_CMSIS_VERSION_MAIN << 16U) | \
68
#define __CM0PLUS_CMSIS_VERSION      ((__CM0PLUS_CMSIS_VERSION_MAIN << 16U) | \
77
                                       __CM0PLUS_CMSIS_VERSION_SUB           ) /*!< CMSIS HAL version number */
69
                                       __CM0PLUS_CMSIS_VERSION_SUB           )  /*!< \deprecated CMSIS HAL version number */
78
 
-
 
79
#define __CORTEX_M                (0x00U)                                      /*!< Cortex-M Core */
-
 
80
 
-
 
81
 
-
 
82
#if   defined ( __CC_ARM )
-
 
83
  #define __ASM            __asm                                      /*!< asm keyword for ARM Compiler */
-
 
84
  #define __INLINE         __inline                                   /*!< inline keyword for ARM Compiler */
-
 
85
  #define __STATIC_INLINE  static __inline
-
 
86
 
-
 
87
#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
-
 
88
  #define __ASM            __asm                                      /*!< asm keyword for ARM Compiler */
-
 
89
  #define __INLINE         __inline                                   /*!< inline keyword for ARM Compiler */
-
 
90
  #define __STATIC_INLINE  static __inline
-
 
91
 
-
 
92
#elif defined ( __GNUC__ )
-
 
93
  #define __ASM            __asm                                      /*!< asm keyword for GNU Compiler */
-
 
94
  #define __INLINE         inline                                     /*!< inline keyword for GNU Compiler */
-
 
95
  #define __STATIC_INLINE  static inline
-
 
96
 
-
 
97
#elif defined ( __ICCARM__ )
-
 
98
  #define __ASM            __asm                                      /*!< asm keyword for IAR Compiler */
-
 
99
  #define __INLINE         inline                                     /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */
-
 
100
  #define __STATIC_INLINE  static inline
-
 
101
 
-
 
102
#elif defined ( __TMS470__ )
-
 
103
  #define __ASM            __asm                                      /*!< asm keyword for TI CCS Compiler */
-
 
104
  #define __STATIC_INLINE  static inline
-
 
105
 
-
 
106
#elif defined ( __TASKING__ )
-
 
107
  #define __ASM            __asm                                      /*!< asm keyword for TASKING Compiler */
-
 
108
  #define __INLINE         inline                                     /*!< inline keyword for TASKING Compiler */
-
 
109
  #define __STATIC_INLINE  static inline
-
 
110
 
-
 
111
#elif defined ( __CSMC__ )
-
 
112
  #define __packed
-
 
113
  #define __ASM            _asm                                      /*!< asm keyword for COSMIC Compiler */
-
 
114
  #define __INLINE         inline                                    /*!< inline keyword for COSMIC Compiler. Use -pc99 on compile line */
-
 
115
  #define __STATIC_INLINE  static inline
-
 
116
 
70
 
117
#else
-
 
118
  #error Unknown compiler
71
#define __CORTEX_M                   (0U)                                       /*!< Cortex-M Core */
119
#endif
-
 
120
 
72
 
121
/** __FPU_USED indicates whether an FPU is used or not.
73
/** __FPU_USED indicates whether an FPU is used or not.
122
    This core does not support an FPU at all
74
    This core does not support an FPU at all
123
*/
75
*/
124
#define __FPU_USED       0U
76
#define __FPU_USED       0U
Line 126... Line 78...
126
#if defined ( __CC_ARM )
78
#if defined ( __CC_ARM )
127
  #if defined __TARGET_FPU_VFP
79
  #if defined __TARGET_FPU_VFP
128
    #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
80
    #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
129
  #endif
81
  #endif
130
 
82
 
131
#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
83
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
132
  #if defined __ARM_PCS_VFP
84
  #if defined __ARM_PCS_VFP
133
    #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
85
    #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
134
  #endif
86
  #endif
135
 
87
 
136
#elif defined ( __GNUC__ )
88
#elif defined ( __GNUC__ )
Line 141... Line 93...
141
#elif defined ( __ICCARM__ )
93
#elif defined ( __ICCARM__ )
142
  #if defined __ARMVFP__
94
  #if defined __ARMVFP__
143
    #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
95
    #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
144
  #endif
96
  #endif
145
 
97
 
146
#elif defined ( __TMS470__ )
98
#elif defined ( __TI_ARM__ )
147
  #if defined __TI_VFP_SUPPORT__
99
  #if defined __TI_VFP_SUPPORT__
148
    #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
100
    #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
149
  #endif
101
  #endif
150
 
102
 
151
#elif defined ( __TASKING__ )
103
#elif defined ( __TASKING__ )
Line 158... Line 110...
158
    #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
110
    #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
159
  #endif
111
  #endif
160
 
112
 
161
#endif
113
#endif
162
 
114
 
163
#include "core_cmInstr.h"                /* Core Instruction Access */
115
#include "cmsis_compiler.h"               /* CMSIS compiler specific defines */
164
#include "core_cmFunc.h"                 /* Core Function Access */
-
 
-
 
116
 
165
 
117
 
166
#ifdef __cplusplus
118
#ifdef __cplusplus
167
}
119
}
168
#endif
120
#endif
169
 
121
 
Line 402... Line 354...
402
 */
354
 */
403
typedef struct
355
typedef struct
404
{
356
{
405
  __IM  uint32_t CPUID;                  /*!< Offset: 0x000 (R/ )  CPUID Base Register */
357
  __IM  uint32_t CPUID;                  /*!< Offset: 0x000 (R/ )  CPUID Base Register */
406
  __IOM uint32_t ICSR;                   /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register */
358
  __IOM uint32_t ICSR;                   /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register */
407
#if (__VTOR_PRESENT == 1U)
359
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
408
  __IOM uint32_t VTOR;                   /*!< Offset: 0x008 (R/W)  Vector Table Offset Register */
360
  __IOM uint32_t VTOR;                   /*!< Offset: 0x008 (R/W)  Vector Table Offset Register */
409
#else
361
#else
410
        uint32_t RESERVED0;
362
        uint32_t RESERVED0;
411
#endif
363
#endif
412
  __IOM uint32_t AIRCR;                  /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register */
364
  __IOM uint32_t AIRCR;                  /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register */
Line 459... Line 411...
459
#define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */
411
#define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */
460
 
412
 
461
#define SCB_ICSR_VECTACTIVE_Pos             0U                                            /*!< SCB ICSR: VECTACTIVE Position */
413
#define SCB_ICSR_VECTACTIVE_Pos             0U                                            /*!< SCB ICSR: VECTACTIVE Position */
462
#define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/)       /*!< SCB ICSR: VECTACTIVE Mask */
414
#define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/)       /*!< SCB ICSR: VECTACTIVE Mask */
463
 
415
 
464
#if (__VTOR_PRESENT == 1U)
416
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
465
/* SCB Interrupt Control State Register Definitions */
417
/* SCB Interrupt Control State Register Definitions */
466
#define SCB_VTOR_TBLOFF_Pos                 8U                                            /*!< SCB VTOR: TBLOFF Position */
418
#define SCB_VTOR_TBLOFF_Pos                 8U                                            /*!< SCB VTOR: TBLOFF Position */
467
#define SCB_VTOR_TBLOFF_Msk                (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos)            /*!< SCB VTOR: TBLOFF Mask */
419
#define SCB_VTOR_TBLOFF_Msk                (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos)            /*!< SCB VTOR: TBLOFF Mask */
468
#endif
420
#endif
469
 
421
 
Line 556... Line 508...
556
#define SysTick_CALIB_TENMS_Pos             0U                                            /*!< SysTick CALIB: TENMS Position */
508
#define SysTick_CALIB_TENMS_Pos             0U                                            /*!< SysTick CALIB: TENMS Position */
557
#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/)    /*!< SysTick CALIB: TENMS Mask */
509
#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/)    /*!< SysTick CALIB: TENMS Mask */
558
 
510
 
559
/*@} end of group CMSIS_SysTick */
511
/*@} end of group CMSIS_SysTick */
560
 
512
 
561
#if (__MPU_PRESENT == 1U)
513
#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)
562
/**
514
/**
563
  \ingroup  CMSIS_core_register
515
  \ingroup  CMSIS_core_register
564
  \defgroup CMSIS_MPU     Memory Protection Unit (MPU)
516
  \defgroup CMSIS_MPU     Memory Protection Unit (MPU)
565
  \brief    Type definitions for the Memory Protection Unit (MPU)
517
  \brief    Type definitions for the Memory Protection Unit (MPU)
566
  @{
518
  @{
Line 576... Line 528...
576
  __IOM uint32_t RNR;                    /*!< Offset: 0x008 (R/W)  MPU Region RNRber Register */
528
  __IOM uint32_t RNR;                    /*!< Offset: 0x008 (R/W)  MPU Region RNRber Register */
577
  __IOM uint32_t RBAR;                   /*!< Offset: 0x00C (R/W)  MPU Region Base Address Register */
529
  __IOM uint32_t RBAR;                   /*!< Offset: 0x00C (R/W)  MPU Region Base Address Register */
578
  __IOM uint32_t RASR;                   /*!< Offset: 0x010 (R/W)  MPU Region Attribute and Size Register */
530
  __IOM uint32_t RASR;                   /*!< Offset: 0x010 (R/W)  MPU Region Attribute and Size Register */
579
} MPU_Type;
531
} MPU_Type;
580
 
532
 
-
 
533
#define MPU_TYPE_RALIASES                  1U
-
 
534
 
581
/* MPU Type Register Definitions */
535
/* MPU Type Register Definitions */
582
#define MPU_TYPE_IREGION_Pos               16U                                            /*!< MPU TYPE: IREGION Position */
536
#define MPU_TYPE_IREGION_Pos               16U                                            /*!< MPU TYPE: IREGION Position */
583
#define MPU_TYPE_IREGION_Msk               (0xFFUL << MPU_TYPE_IREGION_Pos)               /*!< MPU TYPE: IREGION Mask */
537
#define MPU_TYPE_IREGION_Msk               (0xFFUL << MPU_TYPE_IREGION_Pos)               /*!< MPU TYPE: IREGION Mask */
584
 
538
 
585
#define MPU_TYPE_DREGION_Pos                8U                                            /*!< MPU TYPE: DREGION Position */
539
#define MPU_TYPE_DREGION_Pos                8U                                            /*!< MPU TYPE: DREGION Position */
Line 665... Line 619...
665
 */
619
 */
666
 
620
 
667
/**
621
/**
668
  \brief   Mask and shift a bit field value for use in a register bit range.
622
  \brief   Mask and shift a bit field value for use in a register bit range.
669
  \param[in] field  Name of the register bit field.
623
  \param[in] field  Name of the register bit field.
670
  \param[in] value  Value of the bit field.
624
  \param[in] value  Value of the bit field. This parameter is interpreted as an uint32_t type.
671
  \return           Masked and shifted value.
625
  \return           Masked and shifted value.
672
*/
626
*/
673
#define _VAL2FLD(field, value)    ((value << field ## _Pos) & field ## _Msk)
627
#define _VAL2FLD(field, value)    (((uint32_t)(value) << field ## _Pos) & field ## _Msk)
674
 
628
 
675
/**
629
/**
676
  \brief     Mask and shift a register value to extract a bit filed value.
630
  \brief     Mask and shift a register value to extract a bit filed value.
677
  \param[in] field  Name of the register bit field.
631
  \param[in] field  Name of the register bit field.
678
  \param[in] value  Value of register.
632
  \param[in] value  Value of register. This parameter is interpreted as an uint32_t type.
679
  \return           Masked and shifted bit field value.
633
  \return           Masked and shifted bit field value.
680
*/
634
*/
681
#define _FLD2VAL(field, value)    ((value & field ## _Msk) >> field ## _Pos)
635
#define _FLD2VAL(field, value)    (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)
682
 
636
 
683
/*@} end of group CMSIS_core_bitfield */
637
/*@} end of group CMSIS_core_bitfield */
684
 
638
 
685
 
639
 
686
/**
640
/**
Line 688... Line 642...
688
  \defgroup   CMSIS_core_base     Core Definitions
642
  \defgroup   CMSIS_core_base     Core Definitions
689
  \brief      Definitions for base addresses, unions, and structures.
643
  \brief      Definitions for base addresses, unions, and structures.
690
  @{
644
  @{
691
 */
645
 */
692
 
646
 
693
/* Memory mapping of Cortex-M0+ Hardware */
647
/* Memory mapping of Core Hardware */
694
#define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address */
648
#define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address */
695
#define SysTick_BASE        (SCS_BASE +  0x0010UL)                    /*!< SysTick Base Address */
649
#define SysTick_BASE        (SCS_BASE +  0x0010UL)                    /*!< SysTick Base Address */
696
#define NVIC_BASE           (SCS_BASE +  0x0100UL)                    /*!< NVIC Base Address */
650
#define NVIC_BASE           (SCS_BASE +  0x0100UL)                    /*!< NVIC Base Address */
697
#define SCB_BASE            (SCS_BASE +  0x0D00UL)                    /*!< System Control Block Base Address */
651
#define SCB_BASE            (SCS_BASE +  0x0D00UL)                    /*!< System Control Block Base Address */
698
 
652
 
699
#define SCB                 ((SCB_Type       *)     SCB_BASE      )   /*!< SCB configuration struct */
653
#define SCB                 ((SCB_Type       *)     SCB_BASE      )   /*!< SCB configuration struct */
700
#define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct */
654
#define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct */
701
#define NVIC                ((NVIC_Type      *)     NVIC_BASE     )   /*!< NVIC configuration struct */
655
#define NVIC                ((NVIC_Type      *)     NVIC_BASE     )   /*!< NVIC configuration struct */
702
 
656
 
703
#if (__MPU_PRESENT == 1U)
657
#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)
704
  #define MPU_BASE          (SCS_BASE +  0x0D90UL)                    /*!< Memory Protection Unit */
658
  #define MPU_BASE          (SCS_BASE +  0x0D90UL)                    /*!< Memory Protection Unit */
705
  #define MPU               ((MPU_Type       *)     MPU_BASE      )   /*!< Memory Protection Unit */
659
  #define MPU               ((MPU_Type       *)     MPU_BASE      )   /*!< Memory Protection Unit */
706
#endif
660
#endif
707
 
661
 
708
/*@} */
662
/*@} */
Line 728... Line 682...
728
  \defgroup CMSIS_Core_NVICFunctions NVIC Functions
682
  \defgroup CMSIS_Core_NVICFunctions NVIC Functions
729
  \brief    Functions that manage interrupts and exceptions via the NVIC.
683
  \brief    Functions that manage interrupts and exceptions via the NVIC.
730
  @{
684
  @{
731
 */
685
 */
732
 
686
 
-
 
687
#ifdef CMSIS_NVIC_VIRTUAL
-
 
688
  #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE
-
 
689
    #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h"
-
 
690
  #endif
-
 
691
  #include CMSIS_NVIC_VIRTUAL_HEADER_FILE
-
 
692
#else
-
 
693
  #define NVIC_SetPriorityGrouping    __NVIC_SetPriorityGrouping
-
 
694
  #define NVIC_GetPriorityGrouping    __NVIC_GetPriorityGrouping
-
 
695
  #define NVIC_EnableIRQ              __NVIC_EnableIRQ
-
 
696
  #define NVIC_GetEnableIRQ           __NVIC_GetEnableIRQ
-
 
697
  #define NVIC_DisableIRQ             __NVIC_DisableIRQ
-
 
698
  #define NVIC_GetPendingIRQ          __NVIC_GetPendingIRQ
-
 
699
  #define NVIC_SetPendingIRQ          __NVIC_SetPendingIRQ
-
 
700
  #define NVIC_ClearPendingIRQ        __NVIC_ClearPendingIRQ
-
 
701
/*#define NVIC_GetActive              __NVIC_GetActive             not available for Cortex-M0+ */
-
 
702
  #define NVIC_SetPriority            __NVIC_SetPriority
-
 
703
  #define NVIC_GetPriority            __NVIC_GetPriority
-
 
704
  #define NVIC_SystemReset            __NVIC_SystemReset
-
 
705
#endif /* CMSIS_NVIC_VIRTUAL */
-
 
706
 
-
 
707
#ifdef CMSIS_VECTAB_VIRTUAL
-
 
708
  #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE
-
 
709
    #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h"
-
 
710
  #endif
-
 
711
  #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE
-
 
712
#else
-
 
713
  #define NVIC_SetVector              __NVIC_SetVector
-
 
714
  #define NVIC_GetVector              __NVIC_GetVector
-
 
715
#endif  /* (CMSIS_VECTAB_VIRTUAL) */
-
 
716
 
-
 
717
#define NVIC_USER_IRQ_OFFSET          16
-
 
718
 
-
 
719
 
-
 
720
/* The following EXC_RETURN values are saved the LR on exception entry */
-
 
721
#define EXC_RETURN_HANDLER         (0xFFFFFFF1UL)     /* return to Handler mode, uses MSP after return                               */
-
 
722
#define EXC_RETURN_THREAD_MSP      (0xFFFFFFF9UL)     /* return to Thread mode, uses MSP after return                                */
-
 
723
#define EXC_RETURN_THREAD_PSP      (0xFFFFFFFDUL)     /* return to Thread mode, uses PSP after return                                */
-
 
724
 
-
 
725
 
733
/* Interrupt Priorities are WORD accessible only under ARMv6M                   */
726
/* Interrupt Priorities are WORD accessible only under Armv6-M                  */
734
/* The following MACROS handle generation of the register offset and byte masks */
727
/* The following MACROS handle generation of the register offset and byte masks */
735
#define _BIT_SHIFT(IRQn)         (  ((((uint32_t)(int32_t)(IRQn))         )      &  0x03UL) * 8UL)
728
#define _BIT_SHIFT(IRQn)         (  ((((uint32_t)(int32_t)(IRQn))         )      &  0x03UL) * 8UL)
736
#define _SHP_IDX(IRQn)           ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >>    2UL)      )
729
#define _SHP_IDX(IRQn)           ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >>    2UL)      )
737
#define _IP_IDX(IRQn)            (   (((uint32_t)(int32_t)(IRQn))                >>    2UL)      )
730
#define _IP_IDX(IRQn)            (   (((uint32_t)(int32_t)(IRQn))                >>    2UL)      )
738
 
731
 
-
 
732
#define __NVIC_SetPriorityGrouping(X) (void)(X)
-
 
733
#define __NVIC_GetPriorityGrouping()  (0U)
739
 
734
 
740
/**
735
/**
741
  \brief   Enable External Interrupt
736
  \brief   Enable Interrupt
742
  \details Enables a device-specific interrupt in the NVIC interrupt controller.
737
  \details Enables a device specific interrupt in the NVIC interrupt controller.
743
  \param [in]      IRQn  External interrupt number. Value cannot be negative.
738
  \param [in]      IRQn  Device specific interrupt number.
-
 
739
  \note    IRQn must not be negative.
744
 */
740
 */
745
__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
741
__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)
746
{
742
{
-
 
743
  if ((int32_t)(IRQn) >= 0)
-
 
744
  {
747
  NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));
745
    NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
-
 
746
  }
748
}
747
}
749
 
748
 
750
 
749
 
751
/**
750
/**
752
  \brief   Disable External Interrupt
751
  \brief   Get Interrupt Enable status
753
  \details Disables a device-specific interrupt in the NVIC interrupt controller.
752
  \details Returns a device specific interrupt enable status from the NVIC interrupt controller.
754
  \param [in]      IRQn  External interrupt number. Value cannot be negative.
753
  \param [in]      IRQn  Device specific interrupt number.
-
 
754
  \return             0  Interrupt is not enabled.
-
 
755
  \return             1  Interrupt is enabled.
-
 
756
  \note    IRQn must not be negative.
755
 */
757
 */
756
__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn)
758
__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)
757
{
759
{
-
 
760
  if ((int32_t)(IRQn) >= 0)
-
 
761
  {
-
 
762
    return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
-
 
763
  }
-
 
764
  else
-
 
765
  {
-
 
766
    return(0U);
-
 
767
  }
-
 
768
}
-
 
769
 
-
 
770
 
-
 
771
/**
-
 
772
  \brief   Disable Interrupt
-
 
773
  \details Disables a device specific interrupt in the NVIC interrupt controller.
-
 
774
  \param [in]      IRQn  Device specific interrupt number.
-
 
775
  \note    IRQn must not be negative.
-
 
776
 */
-
 
777
__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)
-
 
778
{
-
 
779
  if ((int32_t)(IRQn) >= 0)
-
 
780
  {
758
  NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));
781
    NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
-
 
782
    __DSB();
-
 
783
    __ISB();
-
 
784
  }
759
}
785
}
760
 
786
 
761
 
787
 
762
/**
788
/**
763
  \brief   Get Pending Interrupt
789
  \brief   Get Pending Interrupt
764
  \details Reads the pending register in the NVIC and returns the pending bit for the specified interrupt.
790
  \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt.
765
  \param [in]      IRQn  Interrupt number.
791
  \param [in]      IRQn  Device specific interrupt number.
766
  \return             0  Interrupt status is not pending.
792
  \return             0  Interrupt status is not pending.
767
  \return             1  Interrupt status is pending.
793
  \return             1  Interrupt status is pending.
-
 
794
  \note    IRQn must not be negative.
768
 */
795
 */
769
__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)
796
__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)
770
{
797
{
-
 
798
  if ((int32_t)(IRQn) >= 0)
-
 
799
  {
771
  return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
800
    return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
-
 
801
  }
-
 
802
  else
-
 
803
  {
-
 
804
    return(0U);
-
 
805
  }
772
}
806
}
773
 
807
 
774
 
808
 
775
/**
809
/**
776
  \brief   Set Pending Interrupt
810
  \brief   Set Pending Interrupt
777
  \details Sets the pending bit of an external interrupt.
811
  \details Sets the pending bit of a device specific interrupt in the NVIC pending register.
778
  \param [in]      IRQn  Interrupt number. Value cannot be negative.
812
  \param [in]      IRQn  Device specific interrupt number.
-
 
813
  \note    IRQn must not be negative.
779
 */
814
 */
780
__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)
815
__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)
781
{
816
{
-
 
817
  if ((int32_t)(IRQn) >= 0)
-
 
818
  {
782
  NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));
819
    NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
-
 
820
  }
783
}
821
}
784
 
822
 
785
 
823
 
786
/**
824
/**
787
  \brief   Clear Pending Interrupt
825
  \brief   Clear Pending Interrupt
788
  \details Clears the pending bit of an external interrupt.
826
  \details Clears the pending bit of a device specific interrupt in the NVIC pending register.
789
  \param [in]      IRQn  External interrupt number. Value cannot be negative.
827
  \param [in]      IRQn  Device specific interrupt number.
-
 
828
  \note    IRQn must not be negative.
790
 */
829
 */
791
__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)
830
__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)
792
{
831
{
-
 
832
  if ((int32_t)(IRQn) >= 0)
-
 
833
  {
793
  NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));
834
    NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
-
 
835
  }
794
}
836
}
795
 
837
 
796
 
838
 
797
/**
839
/**
798
  \brief   Set Interrupt Priority
840
  \brief   Set Interrupt Priority
799
  \details Sets the priority of an interrupt.
841
  \details Sets the priority of a device specific interrupt or a processor exception.
800
  \note    The priority cannot be set for every core interrupt.
842
           The interrupt number can be positive to specify a device specific interrupt,
-
 
843
           or negative to specify a processor exception.
801
  \param [in]      IRQn  Interrupt number.
844
  \param [in]      IRQn  Interrupt number.
802
  \param [in]  priority  Priority to set.
845
  \param [in]  priority  Priority to set.
-
 
846
  \note    The priority cannot be set for every processor exception.
803
 */
847
 */
804
__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
848
__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
805
{
849
{
806
  if ((int32_t)(IRQn) < 0)
850
  if ((int32_t)(IRQn) >= 0)
807
  {
851
  {
808
    SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
852
    NVIC->IP[_IP_IDX(IRQn)]  = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)]  & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
809
       (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
853
       (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
810
  }
854
  }
811
  else
855
  else
812
  {
856
  {
813
    NVIC->IP[_IP_IDX(IRQn)]  = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)]  & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
857
    SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
814
       (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
858
       (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
815
  }
859
  }
816
}
860
}
817
 
861
 
818
 
862
 
819
/**
863
/**
820
  \brief   Get Interrupt Priority
864
  \brief   Get Interrupt Priority
821
  \details Reads the priority of an interrupt.
865
  \details Reads the priority of a device specific interrupt or a processor exception.
822
           The interrupt number can be positive to specify an external (device specific) interrupt,
866
           The interrupt number can be positive to specify a device specific interrupt,
823
           or negative to specify an internal (core) interrupt.
867
           or negative to specify a processor exception.
824
  \param [in]   IRQn  Interrupt number.
868
  \param [in]   IRQn  Interrupt number.
825
  \return             Interrupt Priority.
869
  \return             Interrupt Priority.
826
                      Value is aligned automatically to the implemented priority bits of the microcontroller.
870
                      Value is aligned automatically to the implemented priority bits of the microcontroller.
827
 */
871
 */
828
__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn)
872
__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)
829
{
873
{
830
 
874
 
831
  if ((int32_t)(IRQn) < 0)
875
  if ((int32_t)(IRQn) >= 0)
832
  {
876
  {
833
    return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));
877
    return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));
834
  }
878
  }
835
  else
879
  else
836
  {
880
  {
837
    return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));
881
    return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));
838
  }
882
  }
839
}
883
}
840
 
884
 
841
 
885
 
842
/**
886
/**
-
 
887
  \brief   Encode Priority
-
 
888
  \details Encodes the priority for an interrupt with the given priority group,
-
 
889
           preemptive priority value, and subpriority value.
-
 
890
           In case of a conflict between priority grouping and available
-
 
891
           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.
-
 
892
  \param [in]     PriorityGroup  Used priority group.
-
 
893
  \param [in]   PreemptPriority  Preemptive priority value (starting from 0).
-
 
894
  \param [in]       SubPriority  Subpriority value (starting from 0).
-
 
895
  \return                        Encoded priority. Value can be used in the function \ref NVIC_SetPriority().
-
 
896
 */
-
 
897
__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)
-
 
898
{
-
 
899
  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */
-
 
900
  uint32_t PreemptPriorityBits;
-
 
901
  uint32_t SubPriorityBits;
-
 
902
 
-
 
903
  PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);
-
 
904
  SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));
-
 
905
 
-
 
906
  return (
-
 
907
           ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |
-
 
908
           ((SubPriority     & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL)))
-
 
909
         );
-
 
910
}
-
 
911
 
-
 
912
 
-
 
913
/**
-
 
914
  \brief   Decode Priority
-
 
915
  \details Decodes an interrupt priority value with a given priority group to
-
 
916
           preemptive priority value and subpriority value.
-
 
917
           In case of a conflict between priority grouping and available
-
 
918
           priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set.
-
 
919
  \param [in]         Priority   Priority value, which can be retrieved with the function \ref NVIC_GetPriority().
-
 
920
  \param [in]     PriorityGroup  Used priority group.
-
 
921
  \param [out] pPreemptPriority  Preemptive priority value (starting from 0).
-
 
922
  \param [out]     pSubPriority  Subpriority value (starting from 0).
-
 
923
 */
-
 
924
__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority)
-
 
925
{
-
 
926
  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */
-
 
927
  uint32_t PreemptPriorityBits;
-
 
928
  uint32_t SubPriorityBits;
-
 
929
 
-
 
930
  PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);
-
 
931
  SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));
-
 
932
 
-
 
933
  *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL);
-
 
934
  *pSubPriority     = (Priority                   ) & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL);
-
 
935
}
-
 
936
 
-
 
937
 
-
 
938
/**
-
 
939
  \brief   Set Interrupt Vector
-
 
940
  \details Sets an interrupt vector in SRAM based interrupt vector table.
-
 
941
           The interrupt number can be positive to specify a device specific interrupt,
-
 
942
           or negative to specify a processor exception.
-
 
943
           VTOR must been relocated to SRAM before.
-
 
944
           If VTOR is not present address 0 must be mapped to SRAM.
-
 
945
  \param [in]   IRQn      Interrupt number
-
 
946
  \param [in]   vector    Address of interrupt handler function
-
 
947
 */
-
 
948
__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)
-
 
949
{
-
 
950
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
-
 
951
  uint32_t *vectors = (uint32_t *)SCB->VTOR;
-
 
952
#else
-
 
953
    uint32_t *vectors = (uint32_t *)0x0U;
-
 
954
#endif
-
 
955
  vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector;
-
 
956
}
-
 
957
 
-
 
958
 
-
 
959
/**
-
 
960
  \brief   Get Interrupt Vector
-
 
961
  \details Reads an interrupt vector from interrupt vector table.
-
 
962
           The interrupt number can be positive to specify a device specific interrupt,
-
 
963
           or negative to specify a processor exception.
-
 
964
  \param [in]   IRQn      Interrupt number.
-
 
965
  \return                 Address of interrupt handler function
-
 
966
 */
-
 
967
__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)
-
 
968
{
-
 
969
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
-
 
970
  uint32_t *vectors = (uint32_t *)SCB->VTOR;
-
 
971
#else
-
 
972
  uint32_t *vectors = (uint32_t *)0x0U;
-
 
973
#endif
-
 
974
  return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET];
-
 
975
 
-
 
976
}
-
 
977
 
-
 
978
 
-
 
979
/**
843
  \brief   System Reset
980
  \brief   System Reset
844
  \details Initiates a system reset request to reset the MCU.
981
  \details Initiates a system reset request to reset the MCU.
845
 */
982
 */
846
__STATIC_INLINE void NVIC_SystemReset(void)
983
__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void)
847
{
984
{
848
  __DSB();                                                          /* Ensure all outstanding memory accesses included
985
  __DSB();                                                          /* Ensure all outstanding memory accesses included
849
                                                                       buffered write are completed before reset */
986
                                                                       buffered write are completed before reset */
850
  SCB->AIRCR  = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
987
  SCB->AIRCR  = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
851
                 SCB_AIRCR_SYSRESETREQ_Msk);
988
                 SCB_AIRCR_SYSRESETREQ_Msk);
Line 857... Line 994...
857
  }
994
  }
858
}
995
}
859
 
996
 
860
/*@} end of CMSIS_Core_NVICFunctions */
997
/*@} end of CMSIS_Core_NVICFunctions */
861
 
998
 
-
 
999
/* ##########################  MPU functions  #################################### */
-
 
1000
 
-
 
1001
#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)
-
 
1002
 
-
 
1003
#include "mpu_armv7.h"
-
 
1004
 
-
 
1005
#endif
-
 
1006
 
-
 
1007
/* ##########################  FPU functions  #################################### */
-
 
1008
/**
-
 
1009
  \ingroup  CMSIS_Core_FunctionInterface
-
 
1010
  \defgroup CMSIS_Core_FpuFunctions FPU Functions
-
 
1011
  \brief    Function that provides FPU type.
-
 
1012
  @{
-
 
1013
 */
-
 
1014
 
-
 
1015
/**
-
 
1016
  \brief   get FPU type
-
 
1017
  \details returns the FPU type
-
 
1018
  \returns
-
 
1019
   - \b  0: No FPU
-
 
1020
   - \b  1: Single precision FPU
-
 
1021
   - \b  2: Double + Single precision FPU
-
 
1022
 */
-
 
1023
__STATIC_INLINE uint32_t SCB_GetFPUType(void)
-
 
1024
{
-
 
1025
    return 0U;           /* No FPU */
-
 
1026
}
-
 
1027
 
-
 
1028
 
-
 
1029
/*@} end of CMSIS_Core_FpuFunctions */
-
 
1030
 
862
 
1031
 
863
 
1032
 
864
/* ##################################    SysTick function  ############################################ */
1033
/* ##################################    SysTick function  ############################################ */
865
/**
1034
/**
866
  \ingroup  CMSIS_Core_FunctionInterface
1035
  \ingroup  CMSIS_Core_FunctionInterface
867
  \defgroup CMSIS_Core_SysTickFunctions SysTick Functions
1036
  \defgroup CMSIS_Core_SysTickFunctions SysTick Functions
868
  \brief    Functions that configure the System.
1037
  \brief    Functions that configure the System.
869
  @{
1038
  @{
870
 */
1039
 */
871
 
1040
 
872
#if (__Vendor_SysTickConfig == 0U)
1041
#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)
873
 
1042
 
874
/**
1043
/**
875
  \brief   System Tick Configuration
1044
  \brief   System Tick Configuration
876
  \details Initializes the System Timer and its interrupt, and starts the System Tick Timer.
1045
  \details Initializes the System Timer and its interrupt, and starts the System Tick Timer.
877
           Counter is in free running mode to generate periodic interrupts.
1046
           Counter is in free running mode to generate periodic interrupts.