YAHAL
Yet Another Hardware Abstraction Library
Loading...
Searching...
No Matches
core_cm0plus.h
Go to the documentation of this file.
1/**************************************************************************/
7/*
8 * Copyright (c) 2009-2023 Arm Limited. All rights reserved.
9 *
10 * SPDX-License-Identifier: Apache-2.0
11 *
12 * Licensed under the Apache License, Version 2.0 (the License); you may
13 * not use this file except in compliance with the License.
14 * You may obtain a copy of the License at
15 *
16 * www.apache.org/licenses/LICENSE-2.0
17 *
18 * Unless required by applicable law or agreed to in writing, software
19 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
20 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21 * See the License for the specific language governing permissions and
22 * limitations under the License.
23 */
24
25#if defined ( __ICCARM__ )
26 #pragma system_include /* treat file as system include file for MISRA check */
27#elif defined (__clang__)
28 #pragma clang system_header /* treat file as system include file */
29#endif
30
31#ifndef __CORE_CM0PLUS_H_GENERIC
32#define __CORE_CM0PLUS_H_GENERIC
33
34#include <stdint.h>
35
36#ifdef __cplusplus
37 extern "C" {
38#endif
39
55/*******************************************************************************
56 * CMSIS definitions
57 ******************************************************************************/
63#include "cmsis_version.h"
64
65/* CMSIS CM0+ definitions */
66#define __CM0PLUS_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN)
67#define __CM0PLUS_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB)
68#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16U) | \
69 __CM0PLUS_CMSIS_VERSION_SUB )
71#define __CORTEX_M (0U)
76#define __FPU_USED 0U
77
78#if defined ( __CC_ARM )
79 #if defined __TARGET_FPU_VFP
80 #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
81 #endif
82
83#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
84 #if defined __ARM_FP
85 #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
86 #endif
87
88#elif defined (__ti__)
89 #if defined __ARM_FP
90 #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
91 #endif
92
93#elif defined ( __GNUC__ )
94 #if defined (__VFP_FP__) && !defined(__SOFTFP__)
95 #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
96 #endif
97
98#elif defined ( __ICCARM__ )
99 #if defined __ARMVFP__
100 #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
101 #endif
102
103#elif defined ( __TI_ARM__ )
104 #if defined __TI_VFP_SUPPORT__
105 #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
106 #endif
107
108#elif defined ( __TASKING__ )
109 #if defined __FPU_VFP__
110 #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
111 #endif
112
113#elif defined ( __CSMC__ )
114 #if ( __CSMC__ & 0x400U)
115 #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
116 #endif
117
118#endif
119
120#include "cmsis_compiler.h" /* CMSIS compiler specific defines */
121
122
123#ifdef __cplusplus
124}
125#endif
126
127#endif /* __CORE_CM0PLUS_H_GENERIC */
128
129#ifndef __CMSIS_GENERIC
130
131#ifndef __CORE_CM0PLUS_H_DEPENDANT
132#define __CORE_CM0PLUS_H_DEPENDANT
133
134#ifdef __cplusplus
135 extern "C" {
136#endif
137
138/* check device defines and use defaults */
139#if defined __CHECK_DEVICE_DEFINES
140 #ifndef __CM0PLUS_REV
141 #define __CM0PLUS_REV 0x0000U
142 #warning "__CM0PLUS_REV not defined in device header file; using default!"
143 #endif
144
145 #ifndef __MPU_PRESENT
146 #define __MPU_PRESENT 0U
147 #warning "__MPU_PRESENT not defined in device header file; using default!"
148 #endif
149
150 #ifndef __VTOR_PRESENT
151 #define __VTOR_PRESENT 0U
152 #warning "__VTOR_PRESENT not defined in device header file; using default!"
153 #endif
154
155 #ifndef __NVIC_PRIO_BITS
156 #define __NVIC_PRIO_BITS 2U
157 #warning "__NVIC_PRIO_BITS not defined in device header file; using default!"
158 #endif
159
160 #ifndef __Vendor_SysTickConfig
161 #define __Vendor_SysTickConfig 0U
162 #warning "__Vendor_SysTickConfig not defined in device header file; using default!"
163 #endif
164#endif
165
166/* IO definitions (access restrictions to peripheral registers) */
174#ifdef __cplusplus
175 #define __I volatile
176#else
177 #define __I volatile const
178#endif
179#define __O volatile
180#define __IO volatile
182/* following defines should be used for structure members */
183#define __IM volatile const
184#define __OM volatile
185#define __IOM volatile
191/*******************************************************************************
192 * Register Abstraction
193 Core Register contain:
194 - Core Register
195 - Core NVIC Register
196 - Core SCB Register
197 - Core SysTick Register
198 - Core MPU Register
199 ******************************************************************************/
215typedef union
216{
217 struct
218 {
219 uint32_t _reserved0:28;
220 uint32_t V:1;
221 uint32_t C:1;
222 uint32_t Z:1;
223 uint32_t N:1;
224 } b;
225 uint32_t w;
226} APSR_Type;
227
228/* APSR Register Definitions */
229#define APSR_N_Pos 31U
230#define APSR_N_Msk (1UL << APSR_N_Pos)
232#define APSR_Z_Pos 30U
233#define APSR_Z_Msk (1UL << APSR_Z_Pos)
235#define APSR_C_Pos 29U
236#define APSR_C_Msk (1UL << APSR_C_Pos)
238#define APSR_V_Pos 28U
239#define APSR_V_Msk (1UL << APSR_V_Pos)
245typedef union
246{
247 struct
248 {
249 uint32_t ISR:9;
250 uint32_t _reserved0:23;
251 } b;
252 uint32_t w;
253} IPSR_Type;
254
255/* IPSR Register Definitions */
256#define IPSR_ISR_Pos 0U
257#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/)
263typedef union
264{
265 struct
266 {
267 uint32_t ISR:9;
268 uint32_t _reserved0:15;
269 uint32_t T:1;
270 uint32_t _reserved1:3;
271 uint32_t V:1;
272 uint32_t C:1;
273 uint32_t Z:1;
274 uint32_t N:1;
275 } b;
276 uint32_t w;
277} xPSR_Type;
278
279/* xPSR Register Definitions */
280#define xPSR_N_Pos 31U
281#define xPSR_N_Msk (1UL << xPSR_N_Pos)
283#define xPSR_Z_Pos 30U
284#define xPSR_Z_Msk (1UL << xPSR_Z_Pos)
286#define xPSR_C_Pos 29U
287#define xPSR_C_Msk (1UL << xPSR_C_Pos)
289#define xPSR_V_Pos 28U
290#define xPSR_V_Msk (1UL << xPSR_V_Pos)
292#define xPSR_T_Pos 24U
293#define xPSR_T_Msk (1UL << xPSR_T_Pos)
295#define xPSR_ISR_Pos 0U
296#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/)
302typedef union
303{
304 struct
305 {
306 uint32_t nPRIV:1;
307 uint32_t SPSEL:1;
308 uint32_t _reserved1:30;
309 } b;
310 uint32_t w;
312
313/* CONTROL Register Definitions */
314#define CONTROL_SPSEL_Pos 1U
315#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos)
317#define CONTROL_nPRIV_Pos 0U
318#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/)
333typedef struct
334{
335 __IOM uint32_t ISER[1U];
336 uint32_t RESERVED0[31U];
337 __IOM uint32_t ICER[1U];
338 uint32_t RESERVED1[31U];
339 __IOM uint32_t ISPR[1U];
340 uint32_t RESERVED2[31U];
341 __IOM uint32_t ICPR[1U];
342 uint32_t RESERVED3[31U];
343 uint32_t RESERVED4[64U];
344 __IOM uint32_t IP[8U];
345} NVIC_Type;
346
360typedef struct
361{
362 __IM uint32_t CPUID;
363 __IOM uint32_t ICSR;
364#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
365 __IOM uint32_t VTOR;
366#else
367 uint32_t RESERVED0;
368#endif
369 __IOM uint32_t AIRCR;
370 __IOM uint32_t SCR;
371 __IOM uint32_t CCR;
372 uint32_t RESERVED1;
373 __IOM uint32_t SHP[2U];
374 __IOM uint32_t SHCSR;
375} SCB_Type;
376
377/* SCB CPUID Register Definitions */
378#define SCB_CPUID_IMPLEMENTER_Pos 24U
379#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)
381#define SCB_CPUID_VARIANT_Pos 20U
382#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos)
384#define SCB_CPUID_ARCHITECTURE_Pos 16U
385#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)
387#define SCB_CPUID_PARTNO_Pos 4U
388#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos)
390#define SCB_CPUID_REVISION_Pos 0U
391#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/)
393/* SCB Interrupt Control State Register Definitions */
394#define SCB_ICSR_NMIPENDSET_Pos 31U
395#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos)
397#define SCB_ICSR_PENDSVSET_Pos 28U
398#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos)
400#define SCB_ICSR_PENDSVCLR_Pos 27U
401#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos)
403#define SCB_ICSR_PENDSTSET_Pos 26U
404#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos)
406#define SCB_ICSR_PENDSTCLR_Pos 25U
407#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos)
409#define SCB_ICSR_ISRPREEMPT_Pos 23U
410#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos)
412#define SCB_ICSR_ISRPENDING_Pos 22U
413#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos)
415#define SCB_ICSR_VECTPENDING_Pos 12U
416#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)
418#define SCB_ICSR_VECTACTIVE_Pos 0U
419#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/)
421#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
422/* SCB Interrupt Control State Register Definitions */
423#define SCB_VTOR_TBLOFF_Pos 8U
424#define SCB_VTOR_TBLOFF_Msk (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos)
425#endif
426
427/* SCB Application Interrupt and Reset Control Register Definitions */
428#define SCB_AIRCR_VECTKEY_Pos 16U
429#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)
431#define SCB_AIRCR_VECTKEYSTAT_Pos 16U
432#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)
434#define SCB_AIRCR_ENDIANESS_Pos 15U
435#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos)
437#define SCB_AIRCR_SYSRESETREQ_Pos 2U
438#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos)
440#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U
441#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)
443/* SCB System Control Register Definitions */
444#define SCB_SCR_SEVONPEND_Pos 4U
445#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos)
447#define SCB_SCR_SLEEPDEEP_Pos 2U
448#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos)
450#define SCB_SCR_SLEEPONEXIT_Pos 1U
451#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos)
453/* SCB Configuration Control Register Definitions */
454#define SCB_CCR_STKALIGN_Pos 9U
455#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos)
457#define SCB_CCR_UNALIGN_TRP_Pos 3U
458#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos)
460/* SCB System Handler Control and State Register Definitions */
461#define SCB_SHCSR_SVCALLPENDED_Pos 15U
462#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos)
477typedef struct
478{
479 __IOM uint32_t CTRL;
480 __IOM uint32_t LOAD;
481 __IOM uint32_t VAL;
482 __IM uint32_t CALIB;
484
485/* SysTick Control / Status Register Definitions */
486#define SysTick_CTRL_COUNTFLAG_Pos 16U
487#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos)
489#define SysTick_CTRL_CLKSOURCE_Pos 2U
490#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos)
492#define SysTick_CTRL_TICKINT_Pos 1U
493#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos)
495#define SysTick_CTRL_ENABLE_Pos 0U
496#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/)
498/* SysTick Reload Register Definitions */
499#define SysTick_LOAD_RELOAD_Pos 0U
500#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/)
502/* SysTick Current Register Definitions */
503#define SysTick_VAL_CURRENT_Pos 0U
504#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/)
506/* SysTick Calibration Register Definitions */
507#define SysTick_CALIB_NOREF_Pos 31U
508#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos)
510#define SysTick_CALIB_SKEW_Pos 30U
511#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos)
513#define SysTick_CALIB_TENMS_Pos 0U
514#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/)
518#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)
529typedef struct
530{
531 __IM uint32_t TYPE;
532 __IOM uint32_t CTRL;
533 __IOM uint32_t RNR;
534 __IOM uint32_t RBAR;
535 __IOM uint32_t RASR;
536} MPU_Type;
537
538#define MPU_TYPE_RALIASES 1U
539
540/* MPU Type Register Definitions */
541#define MPU_TYPE_IREGION_Pos 16U
542#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos)
544#define MPU_TYPE_DREGION_Pos 8U
545#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos)
547#define MPU_TYPE_SEPARATE_Pos 0U
548#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/)
550/* MPU Control Register Definitions */
551#define MPU_CTRL_PRIVDEFENA_Pos 2U
552#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos)
554#define MPU_CTRL_HFNMIENA_Pos 1U
555#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos)
557#define MPU_CTRL_ENABLE_Pos 0U
558#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/)
560/* MPU Region Number Register Definitions */
561#define MPU_RNR_REGION_Pos 0U
562#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/)
564/* MPU Region Base Address Register Definitions */
565#define MPU_RBAR_ADDR_Pos 8U
566#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos)
568#define MPU_RBAR_VALID_Pos 4U
569#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos)
571#define MPU_RBAR_REGION_Pos 0U
572#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/)
574/* MPU Region Attribute and Size Register Definitions */
575#define MPU_RASR_ATTRS_Pos 16U
576#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos)
578#define MPU_RASR_XN_Pos 28U
579#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos)
581#define MPU_RASR_AP_Pos 24U
582#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos)
584#define MPU_RASR_TEX_Pos 19U
585#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos)
587#define MPU_RASR_S_Pos 18U
588#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos)
590#define MPU_RASR_C_Pos 17U
591#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos)
593#define MPU_RASR_B_Pos 16U
594#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos)
596#define MPU_RASR_SRD_Pos 8U
597#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos)
599#define MPU_RASR_SIZE_Pos 1U
600#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos)
602#define MPU_RASR_ENABLE_Pos 0U
603#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/)
606#endif
607
608
632#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk)
633
640#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)
641
652/* Memory mapping of Core Hardware */
653#define SCS_BASE (0xE000E000UL)
654#define SysTick_BASE (SCS_BASE + 0x0010UL)
655#define NVIC_BASE (SCS_BASE + 0x0100UL)
656#define SCB_BASE (SCS_BASE + 0x0D00UL)
658#define SCB ((SCB_Type *) SCB_BASE )
659#define SysTick ((SysTick_Type *) SysTick_BASE )
660#define NVIC ((NVIC_Type *) NVIC_BASE )
662#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)
663 #define MPU_BASE (SCS_BASE + 0x0D90UL)
664 #define MPU ((MPU_Type *) MPU_BASE )
665#endif
666
671/*******************************************************************************
672 * Hardware Abstraction Layer
673 Core Function Interface contains:
674 - Core NVIC Functions
675 - Core SysTick Functions
676 - Core Register Access Functions
677 ******************************************************************************/
684/* ########################## NVIC functions #################################### */
692#ifdef CMSIS_NVIC_VIRTUAL
693 #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE
694 #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h"
695 #endif
696 #include CMSIS_NVIC_VIRTUAL_HEADER_FILE
697#else
698 #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping
699 #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping
700 #define NVIC_EnableIRQ __NVIC_EnableIRQ
701 #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ
702 #define NVIC_DisableIRQ __NVIC_DisableIRQ
703 #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ
704 #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ
705 #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ
706/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0+ */
707 #define NVIC_SetPriority __NVIC_SetPriority
708 #define NVIC_GetPriority __NVIC_GetPriority
709 #define NVIC_SystemReset __NVIC_SystemReset
710#endif /* CMSIS_NVIC_VIRTUAL */
711
712#ifdef CMSIS_VECTAB_VIRTUAL
713 #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE
714 #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h"
715 #endif
716 #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE
717#else
718 #define NVIC_SetVector __NVIC_SetVector
719 #define NVIC_GetVector __NVIC_GetVector
720#endif /* (CMSIS_VECTAB_VIRTUAL) */
721
722#define NVIC_USER_IRQ_OFFSET 16
723
724
725/* The following EXC_RETURN values are saved the LR on exception entry */
726#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */
727#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */
728#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */
729
730
731/* Interrupt Priorities are WORD accessible only under Armv6-M */
732/* The following MACROS handle generation of the register offset and byte masks */
733#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL)
734#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) )
735#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) )
736
737#define __NVIC_SetPriorityGrouping(X) (void)(X)
738#define __NVIC_GetPriorityGrouping() (0U)
739
746__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)
747{
748 if ((int32_t)(IRQn) >= 0)
749 {
750 __COMPILER_BARRIER();
751 NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
752 __COMPILER_BARRIER();
753 }
754}
755
756
765__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)
766{
767 if ((int32_t)(IRQn) >= 0)
768 {
769 return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
770 }
771 else
772 {
773 return(0U);
774 }
775}
776
777
784__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)
785{
786 if ((int32_t)(IRQn) >= 0)
787 {
788 NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
789 __DSB();
790 __ISB();
791 }
792}
793
794
803__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)
804{
805 if ((int32_t)(IRQn) >= 0)
806 {
807 return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
808 }
809 else
810 {
811 return(0U);
812 }
813}
814
815
822__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)
823{
824 if ((int32_t)(IRQn) >= 0)
825 {
826 NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
827 }
828}
829
830
837__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)
838{
839 if ((int32_t)(IRQn) >= 0)
840 {
841 NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
842 }
843}
844
845
855__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
856{
857 if ((int32_t)(IRQn) >= 0)
858 {
859 NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
860 (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
861 }
862 else
863 {
864 SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
865 (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
866 }
867}
868
869
879__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)
880{
881
882 if ((int32_t)(IRQn) >= 0)
883 {
884 return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));
885 }
886 else
887 {
888 return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));
889 }
890}
891
892
904__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)
905{
906 uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */
907 uint32_t PreemptPriorityBits;
908 uint32_t SubPriorityBits;
909
910 PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);
911 SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));
912
913 return (
914 ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |
915 ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL)))
916 );
917}
918
919
931__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority)
932{
933 uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */
934 uint32_t PreemptPriorityBits;
935 uint32_t SubPriorityBits;
936
937 PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);
938 SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));
939
940 *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL);
941 *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL);
942}
943
944
955__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)
956{
957#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
958 uint32_t *vectors = (uint32_t *)SCB->VTOR;
959 vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector;
960#else
961 uint32_t *vectors = (uint32_t *)(NVIC_USER_IRQ_OFFSET << 2); /* point to 1st user interrupt */
962 *(vectors + (int32_t)IRQn) = vector; /* use pointer arithmetic to access vector */
963#endif
964 /* ARM Application Note 321 states that the M0+ does not require the architectural barrier */
965}
966
967
976__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)
977{
978#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
979 uint32_t *vectors = (uint32_t *)SCB->VTOR;
980 return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET];
981#else
982 uint32_t *vectors = (uint32_t *)(NVIC_USER_IRQ_OFFSET << 2); /* point to 1st user interrupt */
983 return *(vectors + (int32_t)IRQn); /* use pointer arithmetic to access vector */
984#endif
985}
986
987
992__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void)
993{
994 __DSB(); /* Ensure all outstanding memory accesses included
995 buffered write are completed before reset */
996 SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
998 __DSB(); /* Ensure completion of memory access */
999
1000 for(;;) /* wait until reset */
1001 {
1002 __NOP();
1003 }
1004}
1005
1008/* ########################## MPU functions #################################### */
1009
1010#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)
1011
1012#include "mpu_armv7.h"
1013
1014#endif
1015
1016/* ########################## FPU functions #################################### */
1032__STATIC_INLINE uint32_t SCB_GetFPUType(void)
1033{
1034 return 0U; /* No FPU */
1035}
1036
1037
1042/* ################################## SysTick function ############################################ */
1050#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)
1051
1063__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
1064{
1065 if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
1066 {
1067 return (1UL); /* Reload value impossible */
1068 }
1069
1070 SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */
1071 NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
1072 SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
1075 SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
1076 return (0UL); /* Function successful */
1077}
1078
1079#endif
1080
1086#ifdef __cplusplus
1087}
1088#endif
1089
1090#endif /* __CORE_CM0PLUS_H_DEPENDANT */
1091
1092#endif /* __CMSIS_GENERIC */
CMSIS compiler generic header file.
CMSIS Core(M) Version definitions.
#define SysTick_CTRL_ENABLE_Msk
#define SysTick_LOAD_RELOAD_Msk
#define SysTick_CTRL_TICKINT_Msk
#define SysTick_CTRL_CLKSOURCE_Msk
#define SCB_AIRCR_VECTKEY_Pos
#define SCB
#define SCB_AIRCR_SYSRESETREQ_Msk
#define NVIC
#define SysTick
#define __ISB()
Instruction Synchronization Barrier.
#define __DSB()
Data Synchronization Barrier.
#define __NOP
No Operation.
__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void)
System Reset.
__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)
Set Interrupt Vector.
__STATIC_INLINE void NVIC_DecodePriority(uint32_t Priority, uint32_t PriorityGroup, uint32_t *const pPreemptPriority, uint32_t *const pSubPriority)
Decode Priority.
__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)
Get Interrupt Vector.
__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
Set Interrupt Priority.
__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)
Clear Pending Interrupt.
__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)
Get Pending Interrupt.
__STATIC_INLINE uint32_t SCB_GetFPUType(void)
get FPU type
__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)
Enable Interrupt.
__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)
Set Pending Interrupt.
__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)
Get Interrupt Enable status.
__STATIC_INLINE uint32_t NVIC_EncodePriority(uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)
Encode Priority.
__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)
Disable Interrupt.
__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)
Get Interrupt Priority.
uint32_t _reserved1
uint32_t _reserved0
uint32_t _reserved0
uint32_t _reserved0
Structure type to access the Nested Vectored Interrupt Controller (NVIC).
Structure type to access the System Control Block (SCB).
Structure type to access the System Timer (SysTick).
Union type to access the Application Program Status Register (APSR).
Union type to access the Control Registers (CONTROL).
Union type to access the Interrupt Program Status Register (IPSR).
Union type to access the Special-Purpose Program Status Registers (xPSR).