Rev 2 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2 | Rev 9 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | /**************************************************************************//** |
1 | /**************************************************************************//** |
2 | * @file core_sc000.h |
2 | * @file core_sc000.h |
3 | * @brief CMSIS SC000 Core Peripheral Access Layer Header File |
3 | * @brief CMSIS SC000 Core Peripheral Access Layer Header File |
4 | * @version V4.30 |
4 | * @version V5.0.5 |
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_SC000_H_GENERIC |
31 | #ifndef __CORE_SC000_H_GENERIC |
42 | #define __CORE_SC000_H_GENERIC |
32 | #define __CORE_SC000_H_GENERIC |
Line 68... | Line 58... | ||
68 | /** |
58 | /** |
69 | \ingroup SC000 |
59 | \ingroup SC000 |
70 | @{ |
60 | @{ |
71 | */ |
61 | */ |
72 | 62 | ||
- | 63 | #include "cmsis_version.h" |
|
- | 64 | ||
73 | /* CMSIS SC000 definitions */ |
65 | /* CMSIS SC000 definitions */ |
74 | #define __SC000_CMSIS_VERSION_MAIN (0x04U) /*!< [31:16] CMSIS HAL main version */ |
66 | #define __SC000_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ |
75 | #define __SC000_CMSIS_VERSION_SUB (0x1EU) /*!< [15:0] CMSIS HAL sub version */ |
67 | #define __SC000_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ |
76 | #define __SC000_CMSIS_VERSION ((__SC000_CMSIS_VERSION_MAIN << 16U) | \ |
68 | #define __SC000_CMSIS_VERSION ((__SC000_CMSIS_VERSION_MAIN << 16U) | \ |
77 | __SC000_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ |
69 | __SC000_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ |
78 | - | ||
79 | #define __CORTEX_SC (000U) /*!< Cortex secure 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 | 70 | ||
111 | #elif defined ( __CSMC__ ) |
- | |
112 | #define __packed |
- | |
113 | #define __ASM _asm /*!< asm keyword for COSMIC Compiler */ |
71 | #define __CORTEX_SC (000U) /*!< Cortex secure core */ |
114 | #define __INLINE inline /*!< inline keyword for COSMIC Compiler. Use -pc99 on compile line */ |
- | |
115 | #define __STATIC_INLINE static inline |
- | |
116 | - | ||
117 | #else |
- | |
118 | #error Unknown compiler |
- | |
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 567... | Line 519... | ||
567 | #define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ |
519 | #define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ |
568 | #define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ |
520 | #define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ |
569 | 521 | ||
570 | /*@} end of group CMSIS_SysTick */ |
522 | /*@} end of group CMSIS_SysTick */ |
571 | 523 | ||
572 | #if (__MPU_PRESENT == 1U) |
524 | #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) |
573 | /** |
525 | /** |
574 | \ingroup CMSIS_core_register |
526 | \ingroup CMSIS_core_register |
575 | \defgroup CMSIS_MPU Memory Protection Unit (MPU) |
527 | \defgroup CMSIS_MPU Memory Protection Unit (MPU) |
576 | \brief Type definitions for the Memory Protection Unit (MPU) |
528 | \brief Type definitions for the Memory Protection Unit (MPU) |
577 | @{ |
529 | @{ |
Line 676... | Line 628... | ||
676 | */ |
628 | */ |
677 | 629 | ||
678 | /** |
630 | /** |
679 | \brief Mask and shift a bit field value for use in a register bit range. |
631 | \brief Mask and shift a bit field value for use in a register bit range. |
680 | \param[in] field Name of the register bit field. |
632 | \param[in] field Name of the register bit field. |
681 | \param[in] value Value of the bit field. |
633 | \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. |
682 | \return Masked and shifted value. |
634 | \return Masked and shifted value. |
683 | */ |
635 | */ |
684 | #define _VAL2FLD(field, value) ((value << field ## _Pos) & field ## _Msk) |
636 | #define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) |
685 | 637 | ||
686 | /** |
638 | /** |
687 | \brief Mask and shift a register value to extract a bit filed value. |
639 | \brief Mask and shift a register value to extract a bit filed value. |
688 | \param[in] field Name of the register bit field. |
640 | \param[in] field Name of the register bit field. |
689 | \param[in] value Value of register. |
641 | \param[in] value Value of register. This parameter is interpreted as an uint32_t type. |
690 | \return Masked and shifted bit field value. |
642 | \return Masked and shifted bit field value. |
691 | */ |
643 | */ |
692 | #define _FLD2VAL(field, value) ((value & field ## _Msk) >> field ## _Pos) |
644 | #define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) |
693 | 645 | ||
694 | /*@} end of group CMSIS_core_bitfield */ |
646 | /*@} end of group CMSIS_core_bitfield */ |
695 | 647 | ||
696 | 648 | ||
697 | /** |
649 | /** |
Line 699... | Line 651... | ||
699 | \defgroup CMSIS_core_base Core Definitions |
651 | \defgroup CMSIS_core_base Core Definitions |
700 | \brief Definitions for base addresses, unions, and structures. |
652 | \brief Definitions for base addresses, unions, and structures. |
701 | @{ |
653 | @{ |
702 | */ |
654 | */ |
703 | 655 | ||
704 | /* Memory mapping of SC000 Hardware */ |
656 | /* Memory mapping of Core Hardware */ |
705 | #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ |
657 | #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ |
706 | #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ |
658 | #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ |
707 | #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ |
659 | #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ |
708 | #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ |
660 | #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ |
709 | 661 | ||
710 | #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ |
662 | #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ |
711 | #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ |
663 | #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ |
712 | #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ |
664 | #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ |
713 | #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ |
665 | #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ |
714 | 666 | ||
715 | #if (__MPU_PRESENT == 1U) |
667 | #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) |
716 | #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ |
668 | #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ |
717 | #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ |
669 | #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ |
718 | #endif |
670 | #endif |
719 | 671 | ||
720 | /*@} */ |
672 | /*@} */ |
Line 740... | Line 692... | ||
740 | \defgroup CMSIS_Core_NVICFunctions NVIC Functions |
692 | \defgroup CMSIS_Core_NVICFunctions NVIC Functions |
741 | \brief Functions that manage interrupts and exceptions via the NVIC. |
693 | \brief Functions that manage interrupts and exceptions via the NVIC. |
742 | @{ |
694 | @{ |
743 | */ |
695 | */ |
744 | 696 | ||
- | 697 | #ifdef CMSIS_NVIC_VIRTUAL |
|
- | 698 | #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE |
|
- | 699 | #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" |
|
- | 700 | #endif |
|
- | 701 | #include CMSIS_NVIC_VIRTUAL_HEADER_FILE |
|
- | 702 | #else |
|
- | 703 | /*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for SC000 */ |
|
- | 704 | /*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for SC000 */ |
|
- | 705 | #define NVIC_EnableIRQ __NVIC_EnableIRQ |
|
- | 706 | #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ |
|
- | 707 | #define NVIC_DisableIRQ __NVIC_DisableIRQ |
|
- | 708 | #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ |
|
- | 709 | #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ |
|
- | 710 | #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ |
|
- | 711 | /*#define NVIC_GetActive __NVIC_GetActive not available for SC000 */ |
|
- | 712 | #define NVIC_SetPriority __NVIC_SetPriority |
|
- | 713 | #define NVIC_GetPriority __NVIC_GetPriority |
|
- | 714 | #define NVIC_SystemReset __NVIC_SystemReset |
|
- | 715 | #endif /* CMSIS_NVIC_VIRTUAL */ |
|
- | 716 | ||
- | 717 | #ifdef CMSIS_VECTAB_VIRTUAL |
|
- | 718 | #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE |
|
- | 719 | #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" |
|
- | 720 | #endif |
|
- | 721 | #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE |
|
- | 722 | #else |
|
- | 723 | #define NVIC_SetVector __NVIC_SetVector |
|
- | 724 | #define NVIC_GetVector __NVIC_GetVector |
|
- | 725 | #endif /* (CMSIS_VECTAB_VIRTUAL) */ |
|
- | 726 | ||
- | 727 | #define NVIC_USER_IRQ_OFFSET 16 |
|
- | 728 | ||
- | 729 | ||
- | 730 | /* The following EXC_RETURN values are saved the LR on exception entry */ |
|
- | 731 | #define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ |
|
- | 732 | #define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ |
|
- | 733 | #define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ |
|
- | 734 | ||
- | 735 | ||
745 | /* Interrupt Priorities are WORD accessible only under ARMv6M */ |
736 | /* Interrupt Priorities are WORD accessible only under Armv6-M */ |
746 | /* The following MACROS handle generation of the register offset and byte masks */ |
737 | /* The following MACROS handle generation of the register offset and byte masks */ |
747 | #define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) |
738 | #define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) |
748 | #define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) |
739 | #define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) |
749 | #define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) |
740 | #define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) |
750 | 741 | ||
751 | 742 | ||
752 | /** |
743 | /** |
753 | \brief Enable External Interrupt |
744 | \brief Enable Interrupt |
754 | \details Enables a device-specific interrupt in the NVIC interrupt controller. |
745 | \details Enables a device specific interrupt in the NVIC interrupt controller. |
755 | \param [in] IRQn External interrupt number. Value cannot be negative. |
746 | \param [in] IRQn Device specific interrupt number. |
- | 747 | \note IRQn must not be negative. |
|
756 | */ |
748 | */ |
757 | __STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) |
749 | __STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) |
758 | { |
750 | { |
- | 751 | if ((int32_t)(IRQn) >= 0) |
|
- | 752 | { |
|
759 | NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); |
753 | NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); |
- | 754 | } |
|
760 | } |
755 | } |
761 | 756 | ||
762 | 757 | ||
763 | /** |
758 | /** |
764 | \brief Disable External Interrupt |
759 | \brief Get Interrupt Enable status |
765 | \details Disables a device-specific interrupt in the NVIC interrupt controller. |
760 | \details Returns a device specific interrupt enable status from the NVIC interrupt controller. |
766 | \param [in] IRQn External interrupt number. Value cannot be negative. |
761 | \param [in] IRQn Device specific interrupt number. |
- | 762 | \return 0 Interrupt is not enabled. |
|
- | 763 | \return 1 Interrupt is enabled. |
|
- | 764 | \note IRQn must not be negative. |
|
767 | */ |
765 | */ |
768 | __STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) |
766 | __STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) |
769 | { |
767 | { |
- | 768 | if ((int32_t)(IRQn) >= 0) |
|
- | 769 | { |
|
- | 770 | return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); |
|
- | 771 | } |
|
- | 772 | else |
|
- | 773 | { |
|
- | 774 | return(0U); |
|
- | 775 | } |
|
- | 776 | } |
|
- | 777 | ||
- | 778 | ||
- | 779 | /** |
|
- | 780 | \brief Disable Interrupt |
|
- | 781 | \details Disables a device specific interrupt in the NVIC interrupt controller. |
|
- | 782 | \param [in] IRQn Device specific interrupt number. |
|
- | 783 | \note IRQn must not be negative. |
|
- | 784 | */ |
|
- | 785 | __STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) |
|
- | 786 | { |
|
- | 787 | if ((int32_t)(IRQn) >= 0) |
|
- | 788 | { |
|
770 | NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); |
789 | NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); |
- | 790 | __DSB(); |
|
- | 791 | __ISB(); |
|
- | 792 | } |
|
771 | } |
793 | } |
772 | 794 | ||
773 | 795 | ||
774 | /** |
796 | /** |
775 | \brief Get Pending Interrupt |
797 | \brief Get Pending Interrupt |
776 | \details Reads the pending register in the NVIC and returns the pending bit for the specified interrupt. |
798 | \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. |
777 | \param [in] IRQn Interrupt number. |
799 | \param [in] IRQn Device specific interrupt number. |
778 | \return 0 Interrupt status is not pending. |
800 | \return 0 Interrupt status is not pending. |
779 | \return 1 Interrupt status is pending. |
801 | \return 1 Interrupt status is pending. |
- | 802 | \note IRQn must not be negative. |
|
780 | */ |
803 | */ |
781 | __STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) |
804 | __STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) |
782 | { |
805 | { |
- | 806 | if ((int32_t)(IRQn) >= 0) |
|
- | 807 | { |
|
783 | return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); |
808 | return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); |
- | 809 | } |
|
- | 810 | else |
|
- | 811 | { |
|
- | 812 | return(0U); |
|
- | 813 | } |
|
784 | } |
814 | } |
785 | 815 | ||
786 | 816 | ||
787 | /** |
817 | /** |
788 | \brief Set Pending Interrupt |
818 | \brief Set Pending Interrupt |
789 | \details Sets the pending bit of an external interrupt. |
819 | \details Sets the pending bit of a device specific interrupt in the NVIC pending register. |
790 | \param [in] IRQn Interrupt number. Value cannot be negative. |
820 | \param [in] IRQn Device specific interrupt number. |
- | 821 | \note IRQn must not be negative. |
|
791 | */ |
822 | */ |
792 | __STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) |
823 | __STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) |
793 | { |
824 | { |
- | 825 | if ((int32_t)(IRQn) >= 0) |
|
- | 826 | { |
|
794 | NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); |
827 | NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); |
- | 828 | } |
|
795 | } |
829 | } |
796 | 830 | ||
797 | 831 | ||
798 | /** |
832 | /** |
799 | \brief Clear Pending Interrupt |
833 | \brief Clear Pending Interrupt |
800 | \details Clears the pending bit of an external interrupt. |
834 | \details Clears the pending bit of a device specific interrupt in the NVIC pending register. |
801 | \param [in] IRQn External interrupt number. Value cannot be negative. |
835 | \param [in] IRQn Device specific interrupt number. |
- | 836 | \note IRQn must not be negative. |
|
802 | */ |
837 | */ |
803 | __STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) |
838 | __STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) |
804 | { |
839 | { |
- | 840 | if ((int32_t)(IRQn) >= 0) |
|
- | 841 | { |
|
805 | NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); |
842 | NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); |
- | 843 | } |
|
806 | } |
844 | } |
807 | 845 | ||
808 | 846 | ||
809 | /** |
847 | /** |
810 | \brief Set Interrupt Priority |
848 | \brief Set Interrupt Priority |
811 | \details Sets the priority of an interrupt. |
849 | \details Sets the priority of a device specific interrupt or a processor exception. |
812 | \note The priority cannot be set for every core interrupt. |
850 | The interrupt number can be positive to specify a device specific interrupt, |
- | 851 | or negative to specify a processor exception. |
|
813 | \param [in] IRQn Interrupt number. |
852 | \param [in] IRQn Interrupt number. |
814 | \param [in] priority Priority to set. |
853 | \param [in] priority Priority to set. |
- | 854 | \note The priority cannot be set for every processor exception. |
|
815 | */ |
855 | */ |
816 | __STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) |
856 | __STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) |
817 | { |
857 | { |
818 | if ((int32_t)(IRQn) < 0) |
858 | if ((int32_t)(IRQn) >= 0) |
819 | { |
859 | { |
820 | SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | |
860 | NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | |
821 | (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); |
861 | (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); |
822 | } |
862 | } |
823 | else |
863 | else |
824 | { |
864 | { |
825 | NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | |
865 | SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | |
826 | (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); |
866 | (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); |
827 | } |
867 | } |
828 | } |
868 | } |
829 | 869 | ||
830 | 870 | ||
831 | /** |
871 | /** |
832 | \brief Get Interrupt Priority |
872 | \brief Get Interrupt Priority |
833 | \details Reads the priority of an interrupt. |
873 | \details Reads the priority of a device specific interrupt or a processor exception. |
834 | The interrupt number can be positive to specify an external (device specific) interrupt, |
874 | The interrupt number can be positive to specify a device specific interrupt, |
835 | or negative to specify an internal (core) interrupt. |
875 | or negative to specify a processor exception. |
836 | \param [in] IRQn Interrupt number. |
876 | \param [in] IRQn Interrupt number. |
837 | \return Interrupt Priority. |
877 | \return Interrupt Priority. |
838 | Value is aligned automatically to the implemented priority bits of the microcontroller. |
878 | Value is aligned automatically to the implemented priority bits of the microcontroller. |
839 | */ |
879 | */ |
840 | __STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) |
880 | __STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) |
841 | { |
881 | { |
842 | 882 | ||
843 | if ((int32_t)(IRQn) < 0) |
883 | if ((int32_t)(IRQn) >= 0) |
844 | { |
884 | { |
845 | return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); |
885 | return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); |
846 | } |
886 | } |
847 | else |
887 | else |
848 | { |
888 | { |
849 | return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); |
889 | return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); |
850 | } |
890 | } |
851 | } |
891 | } |
852 | 892 | ||
853 | 893 | ||
854 | /** |
894 | /** |
- | 895 | \brief Set Interrupt Vector |
|
- | 896 | \details Sets an interrupt vector in SRAM based interrupt vector table. |
|
- | 897 | The interrupt number can be positive to specify a device specific interrupt, |
|
- | 898 | or negative to specify a processor exception. |
|
- | 899 | VTOR must been relocated to SRAM before. |
|
- | 900 | \param [in] IRQn Interrupt number |
|
- | 901 | \param [in] vector Address of interrupt handler function |
|
- | 902 | */ |
|
- | 903 | __STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) |
|
- | 904 | { |
|
- | 905 | uint32_t *vectors = (uint32_t *)SCB->VTOR; |
|
- | 906 | vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; |
|
- | 907 | } |
|
- | 908 | ||
- | 909 | ||
- | 910 | /** |
|
- | 911 | \brief Get Interrupt Vector |
|
- | 912 | \details Reads an interrupt vector from interrupt vector table. |
|
- | 913 | The interrupt number can be positive to specify a device specific interrupt, |
|
- | 914 | or negative to specify a processor exception. |
|
- | 915 | \param [in] IRQn Interrupt number. |
|
- | 916 | \return Address of interrupt handler function |
|
- | 917 | */ |
|
- | 918 | __STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) |
|
- | 919 | { |
|
- | 920 | uint32_t *vectors = (uint32_t *)SCB->VTOR; |
|
- | 921 | return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; |
|
- | 922 | } |
|
- | 923 | ||
- | 924 | ||
- | 925 | /** |
|
855 | \brief System Reset |
926 | \brief System Reset |
856 | \details Initiates a system reset request to reset the MCU. |
927 | \details Initiates a system reset request to reset the MCU. |
857 | */ |
928 | */ |
858 | __STATIC_INLINE void NVIC_SystemReset(void) |
929 | __NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) |
859 | { |
930 | { |
860 | __DSB(); /* Ensure all outstanding memory accesses included |
931 | __DSB(); /* Ensure all outstanding memory accesses included |
861 | buffered write are completed before reset */ |
932 | buffered write are completed before reset */ |
862 | SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | |
933 | SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | |
863 | SCB_AIRCR_SYSRESETREQ_Msk); |
934 | SCB_AIRCR_SYSRESETREQ_Msk); |
Line 870... | Line 941... | ||
870 | } |
941 | } |
871 | 942 | ||
872 | /*@} end of CMSIS_Core_NVICFunctions */ |
943 | /*@} end of CMSIS_Core_NVICFunctions */ |
873 | 944 | ||
874 | 945 | ||
- | 946 | /* ########################## FPU functions #################################### */ |
|
- | 947 | /** |
|
- | 948 | \ingroup CMSIS_Core_FunctionInterface |
|
- | 949 | \defgroup CMSIS_Core_FpuFunctions FPU Functions |
|
- | 950 | \brief Function that provides FPU type. |
|
- | 951 | @{ |
|
- | 952 | */ |
|
- | 953 | ||
- | 954 | /** |
|
- | 955 | \brief get FPU type |
|
- | 956 | \details returns the FPU type |
|
- | 957 | \returns |
|
- | 958 | - \b 0: No FPU |
|
- | 959 | - \b 1: Single precision FPU |
|
- | 960 | - \b 2: Double + Single precision FPU |
|
- | 961 | */ |
|
- | 962 | __STATIC_INLINE uint32_t SCB_GetFPUType(void) |
|
- | 963 | { |
|
- | 964 | return 0U; /* No FPU */ |
|
- | 965 | } |
|
- | 966 | ||
- | 967 | ||
- | 968 | /*@} end of CMSIS_Core_FpuFunctions */ |
|
- | 969 | ||
- | 970 | ||
875 | 971 | ||
876 | /* ################################## SysTick function ############################################ */ |
972 | /* ################################## SysTick function ############################################ */ |
877 | /** |
973 | /** |
878 | \ingroup CMSIS_Core_FunctionInterface |
974 | \ingroup CMSIS_Core_FunctionInterface |
879 | \defgroup CMSIS_Core_SysTickFunctions SysTick Functions |
975 | \defgroup CMSIS_Core_SysTickFunctions SysTick Functions |
880 | \brief Functions that configure the System. |
976 | \brief Functions that configure the System. |
881 | @{ |
977 | @{ |
882 | */ |
978 | */ |
883 | 979 | ||
884 | #if (__Vendor_SysTickConfig == 0U) |
980 | #if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) |
885 | 981 | ||
886 | /** |
982 | /** |
887 | \brief System Tick Configuration |
983 | \brief System Tick Configuration |
888 | \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. |
984 | \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. |
889 | Counter is in free running mode to generate periodic interrupts. |
985 | Counter is in free running mode to generate periodic interrupts. |