YAHAL
Yet Another Hardware Abstraction Library
Loading...
Searching...
No Matches
core_cm0.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_CM0_H_GENERIC
32#define __CORE_CM0_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 __CM0_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN)
67#define __CM0_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB)
68#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16U) | \
69 __CM0_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_CM0_H_GENERIC */
128
129#ifndef __CMSIS_GENERIC
130
131#ifndef __CORE_CM0_H_DEPENDANT
132#define __CORE_CM0_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 __CM0_REV
141 #define __CM0_REV 0x0000U
142 #warning "__CM0_REV not defined in device header file; using default!"
143 #endif
144
145 #ifndef __NVIC_PRIO_BITS
146 #define __NVIC_PRIO_BITS 2U
147 #warning "__NVIC_PRIO_BITS not defined in device header file; using default!"
148 #endif
149
150 #ifndef __Vendor_SysTickConfig
151 #define __Vendor_SysTickConfig 0U
152 #warning "__Vendor_SysTickConfig not defined in device header file; using default!"
153 #endif
154#endif
155
156/* IO definitions (access restrictions to peripheral registers) */
164#ifdef __cplusplus
165 #define __I volatile
166#else
167 #define __I volatile const
168#endif
169#define __O volatile
170#define __IO volatile
172/* following defines should be used for structure members */
173#define __IM volatile const
174#define __OM volatile
175#define __IOM volatile
181/*******************************************************************************
182 * Register Abstraction
183 Core Register contain:
184 - Core Register
185 - Core NVIC Register
186 - Core SCB Register
187 - Core SysTick Register
188 ******************************************************************************/
204typedef union
205{
206 struct
207 {
208 uint32_t _reserved0:28;
209 uint32_t V:1;
210 uint32_t C:1;
211 uint32_t Z:1;
212 uint32_t N:1;
213 } b;
214 uint32_t w;
215} APSR_Type;
216
217/* APSR Register Definitions */
218#define APSR_N_Pos 31U
219#define APSR_N_Msk (1UL << APSR_N_Pos)
221#define APSR_Z_Pos 30U
222#define APSR_Z_Msk (1UL << APSR_Z_Pos)
224#define APSR_C_Pos 29U
225#define APSR_C_Msk (1UL << APSR_C_Pos)
227#define APSR_V_Pos 28U
228#define APSR_V_Msk (1UL << APSR_V_Pos)
234typedef union
235{
236 struct
237 {
238 uint32_t ISR:9;
239 uint32_t _reserved0:23;
240 } b;
241 uint32_t w;
242} IPSR_Type;
243
244/* IPSR Register Definitions */
245#define IPSR_ISR_Pos 0U
246#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/)
252typedef union
253{
254 struct
255 {
256 uint32_t ISR:9;
257 uint32_t _reserved0:15;
258 uint32_t T:1;
259 uint32_t _reserved1:3;
260 uint32_t V:1;
261 uint32_t C:1;
262 uint32_t Z:1;
263 uint32_t N:1;
264 } b;
265 uint32_t w;
266} xPSR_Type;
267
268/* xPSR Register Definitions */
269#define xPSR_N_Pos 31U
270#define xPSR_N_Msk (1UL << xPSR_N_Pos)
272#define xPSR_Z_Pos 30U
273#define xPSR_Z_Msk (1UL << xPSR_Z_Pos)
275#define xPSR_C_Pos 29U
276#define xPSR_C_Msk (1UL << xPSR_C_Pos)
278#define xPSR_V_Pos 28U
279#define xPSR_V_Msk (1UL << xPSR_V_Pos)
281#define xPSR_T_Pos 24U
282#define xPSR_T_Msk (1UL << xPSR_T_Pos)
284#define xPSR_ISR_Pos 0U
285#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/)
291typedef union
292{
293 struct
294 {
295 uint32_t _reserved0:1;
296 uint32_t SPSEL:1;
297 uint32_t _reserved1:30;
298 } b;
299 uint32_t w;
301
302/* CONTROL Register Definitions */
303#define CONTROL_SPSEL_Pos 1U
304#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos)
319typedef struct
320{
321 __IOM uint32_t ISER[1U];
322 uint32_t RESERVED0[31U];
323 __IOM uint32_t ICER[1U];
324 uint32_t RESERVED1[31U];
325 __IOM uint32_t ISPR[1U];
326 uint32_t RESERVED2[31U];
327 __IOM uint32_t ICPR[1U];
328 uint32_t RESERVED3[31U];
329 uint32_t RESERVED4[64U];
330 __IOM uint32_t IP[8U];
331} NVIC_Type;
332
346typedef struct
347{
348 __IM uint32_t CPUID;
349 __IOM uint32_t ICSR;
350 uint32_t RESERVED0;
351 __IOM uint32_t AIRCR;
352 __IOM uint32_t SCR;
353 __IOM uint32_t CCR;
354 uint32_t RESERVED1;
355 __IOM uint32_t SHP[2U];
356 __IOM uint32_t SHCSR;
357} SCB_Type;
358
359/* SCB CPUID Register Definitions */
360#define SCB_CPUID_IMPLEMENTER_Pos 24U
361#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)
363#define SCB_CPUID_VARIANT_Pos 20U
364#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos)
366#define SCB_CPUID_ARCHITECTURE_Pos 16U
367#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)
369#define SCB_CPUID_PARTNO_Pos 4U
370#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos)
372#define SCB_CPUID_REVISION_Pos 0U
373#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/)
375/* SCB Interrupt Control State Register Definitions */
376#define SCB_ICSR_NMIPENDSET_Pos 31U
377#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos)
379#define SCB_ICSR_PENDSVSET_Pos 28U
380#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos)
382#define SCB_ICSR_PENDSVCLR_Pos 27U
383#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos)
385#define SCB_ICSR_PENDSTSET_Pos 26U
386#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos)
388#define SCB_ICSR_PENDSTCLR_Pos 25U
389#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos)
391#define SCB_ICSR_ISRPREEMPT_Pos 23U
392#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos)
394#define SCB_ICSR_ISRPENDING_Pos 22U
395#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos)
397#define SCB_ICSR_VECTPENDING_Pos 12U
398#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)
400#define SCB_ICSR_VECTACTIVE_Pos 0U
401#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/)
403/* SCB Application Interrupt and Reset Control Register Definitions */
404#define SCB_AIRCR_VECTKEY_Pos 16U
405#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)
407#define SCB_AIRCR_VECTKEYSTAT_Pos 16U
408#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)
410#define SCB_AIRCR_ENDIANESS_Pos 15U
411#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos)
413#define SCB_AIRCR_SYSRESETREQ_Pos 2U
414#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos)
416#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U
417#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)
419/* SCB System Control Register Definitions */
420#define SCB_SCR_SEVONPEND_Pos 4U
421#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos)
423#define SCB_SCR_SLEEPDEEP_Pos 2U
424#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos)
426#define SCB_SCR_SLEEPONEXIT_Pos 1U
427#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos)
429/* SCB Configuration Control Register Definitions */
430#define SCB_CCR_STKALIGN_Pos 9U
431#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos)
433#define SCB_CCR_UNALIGN_TRP_Pos 3U
434#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos)
436/* SCB System Handler Control and State Register Definitions */
437#define SCB_SHCSR_SVCALLPENDED_Pos 15U
438#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos)
453typedef struct
454{
455 __IOM uint32_t CTRL;
456 __IOM uint32_t LOAD;
457 __IOM uint32_t VAL;
458 __IM uint32_t CALIB;
460
461/* SysTick Control / Status Register Definitions */
462#define SysTick_CTRL_COUNTFLAG_Pos 16U
463#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos)
465#define SysTick_CTRL_CLKSOURCE_Pos 2U
466#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos)
468#define SysTick_CTRL_TICKINT_Pos 1U
469#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos)
471#define SysTick_CTRL_ENABLE_Pos 0U
472#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/)
474/* SysTick Reload Register Definitions */
475#define SysTick_LOAD_RELOAD_Pos 0U
476#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/)
478/* SysTick Current Register Definitions */
479#define SysTick_VAL_CURRENT_Pos 0U
480#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/)
482/* SysTick Calibration Register Definitions */
483#define SysTick_CALIB_NOREF_Pos 31U
484#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos)
486#define SysTick_CALIB_SKEW_Pos 30U
487#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos)
489#define SysTick_CALIB_TENMS_Pos 0U
490#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/)
518#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk)
519
526#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)
527
538/* Memory mapping of Core Hardware */
539#define SCS_BASE (0xE000E000UL)
540#define SysTick_BASE (SCS_BASE + 0x0010UL)
541#define NVIC_BASE (SCS_BASE + 0x0100UL)
542#define SCB_BASE (SCS_BASE + 0x0D00UL)
544#define SCB ((SCB_Type *) SCB_BASE )
545#define SysTick ((SysTick_Type *) SysTick_BASE )
546#define NVIC ((NVIC_Type *) NVIC_BASE )
553/*******************************************************************************
554 * Hardware Abstraction Layer
555 Core Function Interface contains:
556 - Core NVIC Functions
557 - Core SysTick Functions
558 - Core Register Access Functions
559 ******************************************************************************/
566/* ########################## NVIC functions #################################### */
574#ifdef CMSIS_NVIC_VIRTUAL
575 #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE
576 #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h"
577 #endif
578 #include CMSIS_NVIC_VIRTUAL_HEADER_FILE
579#else
580 #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping
581 #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping
582 #define NVIC_EnableIRQ __NVIC_EnableIRQ
583 #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ
584 #define NVIC_DisableIRQ __NVIC_DisableIRQ
585 #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ
586 #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ
587 #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ
588/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0 */
589 #define NVIC_SetPriority __NVIC_SetPriority
590 #define NVIC_GetPriority __NVIC_GetPriority
591 #define NVIC_SystemReset __NVIC_SystemReset
592#endif /* CMSIS_NVIC_VIRTUAL */
593
594#ifdef CMSIS_VECTAB_VIRTUAL
595 #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE
596 #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h"
597 #endif
598 #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE
599#else
600 #define NVIC_SetVector __NVIC_SetVector
601 #define NVIC_GetVector __NVIC_GetVector
602#endif /* (CMSIS_VECTAB_VIRTUAL) */
603
604#define NVIC_USER_IRQ_OFFSET 16
605
606
607/* The following EXC_RETURN values are saved the LR on exception entry */
608#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */
609#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */
610#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */
611
612
613/* Interrupt Priorities are WORD accessible only under Armv6-M */
614/* The following MACROS handle generation of the register offset and byte masks */
615#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL)
616#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) )
617#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) )
618
619#define __NVIC_SetPriorityGrouping(X) (void)(X)
620#define __NVIC_GetPriorityGrouping() (0U)
621
628__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)
629{
630 if ((int32_t)(IRQn) >= 0)
631 {
632 __COMPILER_BARRIER();
633 NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
634 __COMPILER_BARRIER();
635 }
636}
637
638
647__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)
648{
649 if ((int32_t)(IRQn) >= 0)
650 {
651 return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
652 }
653 else
654 {
655 return(0U);
656 }
657}
658
659
666__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)
667{
668 if ((int32_t)(IRQn) >= 0)
669 {
670 NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
671 __DSB();
672 __ISB();
673 }
674}
675
676
685__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)
686{
687 if ((int32_t)(IRQn) >= 0)
688 {
689 return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
690 }
691 else
692 {
693 return(0U);
694 }
695}
696
697
704__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)
705{
706 if ((int32_t)(IRQn) >= 0)
707 {
708 NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
709 }
710}
711
712
719__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)
720{
721 if ((int32_t)(IRQn) >= 0)
722 {
723 NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
724 }
725}
726
727
737__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
738{
739 if ((int32_t)(IRQn) >= 0)
740 {
741 NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
742 (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
743 }
744 else
745 {
746 SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
747 (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
748 }
749}
750
751
761__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)
762{
763
764 if ((int32_t)(IRQn) >= 0)
765 {
766 return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));
767 }
768 else
769 {
770 return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));
771 }
772}
773
774
786__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)
787{
788 uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */
789 uint32_t PreemptPriorityBits;
790 uint32_t SubPriorityBits;
791
792 PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);
793 SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));
794
795 return (
796 ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |
797 ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL)))
798 );
799}
800
801
813__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority)
814{
815 uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */
816 uint32_t PreemptPriorityBits;
817 uint32_t SubPriorityBits;
818
819 PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);
820 SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));
821
822 *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL);
823 *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL);
824}
825
826
827
837__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)
838{
839 uint32_t *vectors = (uint32_t *)(NVIC_USER_IRQ_OFFSET << 2); /* point to 1st user interrupt */
840 *(vectors + (int32_t)IRQn) = vector; /* use pointer arithmetic to access vector */
841 /* ARM Application Note 321 states that the M0 does not require the architectural barrier */
842}
843
844
853__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)
854{
855 uint32_t *vectors = (uint32_t *)(NVIC_USER_IRQ_OFFSET << 2); /* point to 1st user interrupt */
856 return *(vectors + (int32_t)IRQn); /* use pointer arithmetic to access vector */
857}
858
859
864__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void)
865{
866 __DSB(); /* Ensure all outstanding memory accesses included
867 buffered write are completed before reset */
868 SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
870 __DSB(); /* Ensure completion of memory access */
871
872 for(;;) /* wait until reset */
873 {
874 __NOP();
875 }
876}
877
881/* ########################## FPU functions #################################### */
897__STATIC_INLINE uint32_t SCB_GetFPUType(void)
898{
899 return 0U; /* No FPU */
900}
901
902
907/* ################################## SysTick function ############################################ */
915#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)
916
928__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
929{
930 if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
931 {
932 return (1UL); /* Reload value impossible */
933 }
934
935 SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */
936 NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
937 SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
940 SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
941 return (0UL); /* Function successful */
942}
943
944#endif
945
951#ifdef __cplusplus
952}
953#endif
954
955#endif /* __CORE_CM0_H_DEPENDANT */
956
957#endif /* __CMSIS_GENERIC */
CMSIS compiler generic header file.
CMSIS Core(M) Version definitions.
#define SysTick_CTRL_ENABLE_Msk
Definition core_cm0.h:472
#define SysTick_LOAD_RELOAD_Msk
Definition core_cm0.h:476
#define SysTick_CTRL_TICKINT_Msk
Definition core_cm0.h:469
#define SysTick_CTRL_CLKSOURCE_Msk
Definition core_cm0.h:466
#define SCB_AIRCR_VECTKEY_Pos
Definition core_cm0.h:404
#define SCB
Definition core_cm0.h:544
#define SCB_AIRCR_SYSRESETREQ_Msk
Definition core_cm0.h:414
#define NVIC
Definition core_cm0.h:546
#define SysTick
Definition core_cm0.h:545
#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 _reserved0
Definition core_cm0.h:208
uint32_t N
Definition core_cm0.h:212
uint32_t Z
Definition core_cm0.h:211
uint32_t _reserved0
Definition core_cm0.h:295
uint32_t _reserved0
Definition core_cm0.h:239
uint32_t Z
Definition core_cm0.h:262
uint32_t _reserved0
Definition core_cm0.h:257
uint32_t T
Definition core_cm0.h:258
uint32_t V
Definition core_cm0.h:209
uint32_t N
Definition core_cm0.h:263
uint32_t C
Definition core_cm0.h:210
uint32_t ISR
Definition core_cm0.h:238
uint32_t _reserved1
Definition core_cm0.h:297
uint32_t _reserved1
Definition core_cm0.h:259
uint32_t C
Definition core_cm0.h:261
uint32_t V
Definition core_cm0.h:260
uint32_t ISR
Definition core_cm0.h:256
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).