generated from hulk/gd32e23x_template
	Initial commit
This commit is contained in:
		
							
								
								
									
										266
									
								
								sdk/CMSIS/inc/cmsis_compiler.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										266
									
								
								sdk/CMSIS/inc/cmsis_compiler.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,266 @@ | ||||
| /**************************************************************************//** | ||||
|  * @file     cmsis_compiler.h | ||||
|  * @brief    CMSIS compiler generic header file | ||||
|  * @version  V5.0.4 | ||||
|  * @date     10. January 2018 | ||||
|  ******************************************************************************/ | ||||
| /* | ||||
|  * Copyright (c) 2009-2018 Arm Limited. All rights reserved. | ||||
|  * | ||||
|  * SPDX-License-Identifier: Apache-2.0 | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the License); you may | ||||
|  * not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an AS IS BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| #ifndef __CMSIS_COMPILER_H | ||||
| #define __CMSIS_COMPILER_H | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| /* | ||||
|  * Arm Compiler 4/5 | ||||
|  */ | ||||
| #if   defined ( __CC_ARM ) | ||||
|   #include "cmsis_armcc.h" | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Arm Compiler 6 (armclang) | ||||
|  */ | ||||
| #elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) | ||||
|   #include "cmsis_armclang.h" | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * GNU Compiler | ||||
|  */ | ||||
| #elif defined ( __GNUC__ ) | ||||
|   #include "cmsis_gcc.h" | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * IAR Compiler | ||||
|  */ | ||||
| #elif defined ( __ICCARM__ ) | ||||
|   #include <cmsis_iccarm.h> | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * TI Arm Compiler | ||||
|  */ | ||||
| #elif defined ( __TI_ARM__ ) | ||||
|   #include <cmsis_ccs.h> | ||||
|  | ||||
|   #ifndef   __ASM | ||||
|     #define __ASM                                  __asm | ||||
|   #endif | ||||
|   #ifndef   __INLINE | ||||
|     #define __INLINE                               inline | ||||
|   #endif | ||||
|   #ifndef   __STATIC_INLINE | ||||
|     #define __STATIC_INLINE                        static inline | ||||
|   #endif | ||||
|   #ifndef   __STATIC_FORCEINLINE | ||||
|     #define __STATIC_FORCEINLINE                   __STATIC_INLINE | ||||
|   #endif | ||||
|   #ifndef   __NO_RETURN | ||||
|     #define __NO_RETURN                            __attribute__((noreturn)) | ||||
|   #endif | ||||
|   #ifndef   __USED | ||||
|     #define __USED                                 __attribute__((used)) | ||||
|   #endif | ||||
|   #ifndef   __WEAK | ||||
|     #define __WEAK                                 __attribute__((weak)) | ||||
|   #endif | ||||
|   #ifndef   __PACKED | ||||
|     #define __PACKED                               __attribute__((packed)) | ||||
|   #endif | ||||
|   #ifndef   __PACKED_STRUCT | ||||
|     #define __PACKED_STRUCT                        struct __attribute__((packed)) | ||||
|   #endif | ||||
|   #ifndef   __PACKED_UNION | ||||
|     #define __PACKED_UNION                         union __attribute__((packed)) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32        /* deprecated */ | ||||
|     struct __attribute__((packed)) T_UINT32 { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32(x)                  (((struct T_UINT32 *)(x))->v) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT16_WRITE | ||||
|     __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; | ||||
|     #define __UNALIGNED_UINT16_WRITE(addr, val)    (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT16_READ | ||||
|     __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; | ||||
|     #define __UNALIGNED_UINT16_READ(addr)          (((const struct T_UINT16_READ *)(const void *)(addr))->v) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32_WRITE | ||||
|     __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32_WRITE(addr, val)    (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32_READ | ||||
|     __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32_READ(addr)          (((const struct T_UINT32_READ *)(const void *)(addr))->v) | ||||
|   #endif | ||||
|   #ifndef   __ALIGNED | ||||
|     #define __ALIGNED(x)                           __attribute__((aligned(x))) | ||||
|   #endif | ||||
|   #ifndef   __RESTRICT | ||||
|     #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. | ||||
|     #define __RESTRICT | ||||
|   #endif | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * TASKING Compiler | ||||
|  */ | ||||
| #elif defined ( __TASKING__ ) | ||||
|   /* | ||||
|    * The CMSIS functions have been implemented as intrinsics in the compiler. | ||||
|    * Please use "carm -?i" to get an up to date list of all intrinsics, | ||||
|    * Including the CMSIS ones. | ||||
|    */ | ||||
|  | ||||
|   #ifndef   __ASM | ||||
|     #define __ASM                                  __asm | ||||
|   #endif | ||||
|   #ifndef   __INLINE | ||||
|     #define __INLINE                               inline | ||||
|   #endif | ||||
|   #ifndef   __STATIC_INLINE | ||||
|     #define __STATIC_INLINE                        static inline | ||||
|   #endif | ||||
|   #ifndef   __STATIC_FORCEINLINE | ||||
|     #define __STATIC_FORCEINLINE                   __STATIC_INLINE | ||||
|   #endif | ||||
|   #ifndef   __NO_RETURN | ||||
|     #define __NO_RETURN                            __attribute__((noreturn)) | ||||
|   #endif | ||||
|   #ifndef   __USED | ||||
|     #define __USED                                 __attribute__((used)) | ||||
|   #endif | ||||
|   #ifndef   __WEAK | ||||
|     #define __WEAK                                 __attribute__((weak)) | ||||
|   #endif | ||||
|   #ifndef   __PACKED | ||||
|     #define __PACKED                               __packed__ | ||||
|   #endif | ||||
|   #ifndef   __PACKED_STRUCT | ||||
|     #define __PACKED_STRUCT                        struct __packed__ | ||||
|   #endif | ||||
|   #ifndef   __PACKED_UNION | ||||
|     #define __PACKED_UNION                         union __packed__ | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32        /* deprecated */ | ||||
|     struct __packed__ T_UINT32 { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32(x)                  (((struct T_UINT32 *)(x))->v) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT16_WRITE | ||||
|     __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; | ||||
|     #define __UNALIGNED_UINT16_WRITE(addr, val)    (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT16_READ | ||||
|     __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; | ||||
|     #define __UNALIGNED_UINT16_READ(addr)          (((const struct T_UINT16_READ *)(const void *)(addr))->v) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32_WRITE | ||||
|     __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32_WRITE(addr, val)    (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32_READ | ||||
|     __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32_READ(addr)          (((const struct T_UINT32_READ *)(const void *)(addr))->v) | ||||
|   #endif | ||||
|   #ifndef   __ALIGNED | ||||
|     #define __ALIGNED(x)              __align(x) | ||||
|   #endif | ||||
|   #ifndef   __RESTRICT | ||||
|     #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. | ||||
|     #define __RESTRICT | ||||
|   #endif | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * COSMIC Compiler | ||||
|  */ | ||||
| #elif defined ( __CSMC__ ) | ||||
|    #include <cmsis_csm.h> | ||||
|  | ||||
|  #ifndef   __ASM | ||||
|     #define __ASM                                  _asm | ||||
|   #endif | ||||
|   #ifndef   __INLINE | ||||
|     #define __INLINE                               inline | ||||
|   #endif | ||||
|   #ifndef   __STATIC_INLINE | ||||
|     #define __STATIC_INLINE                        static inline | ||||
|   #endif | ||||
|   #ifndef   __STATIC_FORCEINLINE | ||||
|     #define __STATIC_FORCEINLINE                   __STATIC_INLINE | ||||
|   #endif | ||||
|   #ifndef   __NO_RETURN | ||||
|     // NO RETURN is automatically detected hence no warning here | ||||
|     #define __NO_RETURN | ||||
|   #endif | ||||
|   #ifndef   __USED | ||||
|     #warning No compiler specific solution for __USED. __USED is ignored. | ||||
|     #define __USED | ||||
|   #endif | ||||
|   #ifndef   __WEAK | ||||
|     #define __WEAK                                 __weak | ||||
|   #endif | ||||
|   #ifndef   __PACKED | ||||
|     #define __PACKED                               @packed | ||||
|   #endif | ||||
|   #ifndef   __PACKED_STRUCT | ||||
|     #define __PACKED_STRUCT                        @packed struct | ||||
|   #endif | ||||
|   #ifndef   __PACKED_UNION | ||||
|     #define __PACKED_UNION                         @packed union | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32        /* deprecated */ | ||||
|     @packed struct T_UINT32 { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32(x)                  (((struct T_UINT32 *)(x))->v) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT16_WRITE | ||||
|     __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; | ||||
|     #define __UNALIGNED_UINT16_WRITE(addr, val)    (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT16_READ | ||||
|     __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; | ||||
|     #define __UNALIGNED_UINT16_READ(addr)          (((const struct T_UINT16_READ *)(const void *)(addr))->v) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32_WRITE | ||||
|     __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32_WRITE(addr, val)    (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) | ||||
|   #endif | ||||
|   #ifndef   __UNALIGNED_UINT32_READ | ||||
|     __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; | ||||
|     #define __UNALIGNED_UINT32_READ(addr)          (((const struct T_UINT32_READ *)(const void *)(addr))->v) | ||||
|   #endif | ||||
|   #ifndef   __ALIGNED | ||||
|     #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. | ||||
|     #define __ALIGNED(x) | ||||
|   #endif | ||||
|   #ifndef   __RESTRICT | ||||
|     #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. | ||||
|     #define __RESTRICT | ||||
|   #endif | ||||
|  | ||||
|  | ||||
| #else | ||||
|   #error Unknown compiler. | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #endif /* __CMSIS_COMPILER_H */ | ||||
|  | ||||
							
								
								
									
										2088
									
								
								sdk/CMSIS/inc/cmsis_gcc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2088
									
								
								sdk/CMSIS/inc/cmsis_gcc.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										39
									
								
								sdk/CMSIS/inc/cmsis_version.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								sdk/CMSIS/inc/cmsis_version.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| /**************************************************************************//** | ||||
|  * @file     cmsis_version.h | ||||
|  * @brief    CMSIS Core(M) Version definitions | ||||
|  * @version  V5.0.2 | ||||
|  * @date     19. April 2017 | ||||
|  ******************************************************************************/ | ||||
| /* | ||||
|  * Copyright (c) 2009-2017 ARM Limited. All rights reserved. | ||||
|  * | ||||
|  * SPDX-License-Identifier: Apache-2.0 | ||||
|  * | ||||
|  * Licensed under the Apache License, Version 2.0 (the License); you may | ||||
|  * not use this file except in compliance with the License. | ||||
|  * You may obtain a copy of the License at | ||||
|  * | ||||
|  * www.apache.org/licenses/LICENSE-2.0 | ||||
|  * | ||||
|  * Unless required by applicable law or agreed to in writing, software | ||||
|  * distributed under the License is distributed on an AS IS BASIS, WITHOUT | ||||
|  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|  * See the License for the specific language governing permissions and | ||||
|  * limitations under the License. | ||||
|  */ | ||||
|  | ||||
| #if   defined ( __ICCARM__ ) | ||||
|   #pragma system_include         /* treat file as system include file for MISRA check */ | ||||
| #elif defined (__clang__) | ||||
|   #pragma clang system_header   /* treat file as system include file */ | ||||
| #endif | ||||
|  | ||||
| #ifndef __CMSIS_VERSION_H | ||||
| #define __CMSIS_VERSION_H | ||||
|  | ||||
| /*  CMSIS Version definitions */ | ||||
| #define __CM_CMSIS_VERSION_MAIN  ( 5U)                                      /*!< [31:16] CMSIS Core(M) main version */ | ||||
| #define __CM_CMSIS_VERSION_SUB   ( 1U)                                      /*!< [15:0]  CMSIS Core(M) sub version */ | ||||
| #define __CM_CMSIS_VERSION       ((__CM_CMSIS_VERSION_MAIN << 16U) | \ | ||||
|                                    __CM_CMSIS_VERSION_SUB           )       /*!< CMSIS Core(M) version number */ | ||||
| #endif | ||||
							
								
								
									
										1899
									
								
								sdk/CMSIS/inc/core_cm23.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1899
									
								
								sdk/CMSIS/inc/core_cm23.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										213
									
								
								sdk/CMSIS/inc/gd32e23x.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										213
									
								
								sdk/CMSIS/inc/gd32e23x.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,213 @@ | ||||
| /*! | ||||
|     \file    gd32e23x.h | ||||
|     \brief   general definitions for GD32E23x | ||||
|  | ||||
|     \version 2023-09-04, V2.0.1, firmware for GD32E23x | ||||
| */ | ||||
|  | ||||
| /* Copyright (c) 2012 ARM LIMITED | ||||
|    Copyright (c) 2023, GigaDevice Semiconductor Inc. | ||||
|  | ||||
|    All rights reserved. | ||||
|    Redistribution and use in source and binary forms, with or without | ||||
|    modification, are permitted provided that the following conditions are met: | ||||
|    - Redistributions of source code must retain the above copyright | ||||
|      notice, this list of conditions and the following disclaimer. | ||||
|    - Redistributions in binary form must reproduce the above copyright | ||||
|      notice, this list of conditions and the following disclaimer in the | ||||
|      documentation and/or other materials provided with the distribution. | ||||
|    - Neither the name of ARM nor the names of its contributors may be used | ||||
|      to endorse or promote products derived from this software without | ||||
|      specific prior written permission. | ||||
|    * | ||||
|    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
|    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|    ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE | ||||
|    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
|    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
|    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
|    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
|    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
|    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
|    POSSIBILITY OF SUCH DAMAGE. | ||||
|    ---------------------------------------------------------------------------*/ | ||||
|  | ||||
| /* This file refers the CMSIS standard, some adjustments are made according to GigaDevice chips */ | ||||
|  | ||||
| #ifndef GD32E23X_H | ||||
| #define GD32E23X_H | ||||
|  | ||||
| #ifdef __cplusplus | ||||
|  extern "C" { | ||||
| #endif | ||||
|  | ||||
| /* define GD32E23x */ | ||||
| #if !defined (GD32E23x) | ||||
|  #define GD32E23x | ||||
| #endif /* define GD32E23x */ | ||||
| #if !defined (GD32E23x) | ||||
|  #error "Please select the target GD32E23x device used in your application (in gd32e23x.h file)" | ||||
| #endif /* undefine GD32E23x tip */ | ||||
|  | ||||
| /* define value of high speed crystal oscillator (HXTAL) in Hz */ | ||||
| #if !defined  (HXTAL_VALUE) | ||||
| #define HXTAL_VALUE    ((uint32_t)8000000) | ||||
| #endif /* high speed crystal oscillator value */ | ||||
|  | ||||
| /* define startup timeout value of high speed crystal oscillator (HXTAL) */ | ||||
| #if !defined  (HXTAL_STARTUP_TIMEOUT) | ||||
| #define HXTAL_STARTUP_TIMEOUT   ((uint16_t)0x0FFFF) | ||||
| #endif /* high speed crystal oscillator startup timeout */ | ||||
|  | ||||
| /* define value of internal 8MHz RC oscillator (IRC8M) in Hz */ | ||||
| #if !defined  (IRC8M_VALUE) | ||||
| #define IRC8M_VALUE  ((uint32_t)8000000) | ||||
| #endif /* internal 8MHz RC oscillator value */ | ||||
|  | ||||
| /* define startup timeout value of internal 8MHz RC oscillator (IRC8M) */ | ||||
| #if !defined  (IRC8M_STARTUP_TIMEOUT) | ||||
| #define IRC8M_STARTUP_TIMEOUT   ((uint16_t)0x0500) | ||||
| #endif /* internal 8MHz RC oscillator startup timeout */ | ||||
|  | ||||
| /* define value of internal RC oscillator for ADC in Hz */ | ||||
| #if !defined  (IRC28M_VALUE) | ||||
| #define IRC28M_VALUE ((uint32_t)28000000) | ||||
| #endif /* IRC28M_VALUE */ | ||||
|  | ||||
| #if !defined  (IRC48M_VALUE) | ||||
| #define IRC48M_VALUE ((uint32_t)48000000) | ||||
| #endif /* IRC48M_VALUE */ | ||||
|  | ||||
| /* define value of internal 40KHz RC oscillator(IRC40K) in Hz */ | ||||
| #if !defined  (IRC40K_VALUE) | ||||
| #define IRC40K_VALUE  ((uint32_t)40000) | ||||
| #endif /* internal 40KHz RC oscillator value */ | ||||
|  | ||||
| /* define value of low speed crystal oscillator (LXTAL)in Hz */ | ||||
| #if !defined  (LXTAL_VALUE) | ||||
| #define LXTAL_VALUE  ((uint32_t)32768) | ||||
| #endif /* low speed crystal oscillator value */ | ||||
|  | ||||
| /* GD32E23x firmware library version number V1.0 */ | ||||
| #define __GD32E23x_STDPERIPH_VERSION_MAIN   (0x01) /*!< [31:24] main version     */ | ||||
| #define __GD32E23x_STDPERIPH_VERSION_SUB1   (0x00) /*!< [23:16] sub1 version     */ | ||||
| #define __GD32E23x_STDPERIPH_VERSION_SUB2   (0x00) /*!< [15:8]  sub2 version     */ | ||||
| #define __GD32E23x_STDPERIPH_VERSION_RC     (0x00) /*!< [7:0]  release candidate */ | ||||
| #define __GD32E23x_STDPERIPH_VERSION        ((__GD32E23x_STDPERIPH_VERSION_MAIN << 24)\ | ||||
|                                             |(__GD32E23x_STDPERIPH_VERSION_SUB1 << 16)\ | ||||
|                                             |(__GD32E23x_STDPERIPH_VERSION_SUB2 << 8)\ | ||||
|                                             |(__GD32E23x_STDPERIPH_VERSION_RC)) | ||||
|  | ||||
| /* configuration of the Cortex-M23 processor and core peripherals                                        */ | ||||
| #define __CM23_REV                0x0100U   /*!< Core revision r1p0                                      */ | ||||
| #define __SAUREGION_PRESENT       0U        /*!< SAU regions are not present                             */ | ||||
| #define __MPU_PRESENT             0U        /*!< MPU is present                                          */ | ||||
| #define __VTOR_PRESENT            1U        /*!< VTOR is present                                         */ | ||||
| #define __NVIC_PRIO_BITS          2U        /*!< Number of Bits used for Priority Levels                 */ | ||||
| #define __Vendor_SysTickConfig    0U        /*!< Set to 1 if different SysTick Config is used            */ | ||||
|  | ||||
| /* define interrupt number */ | ||||
| typedef enum IRQn | ||||
| { | ||||
|     /* Cortex-M23 processor exceptions numbers */ | ||||
|     NonMaskableInt_IRQn          = -14,    /*!< non maskable interrupt                                   */ | ||||
|     HardFault_IRQn               = -13,    /*!< hardfault interrupt                                      */ | ||||
|  | ||||
|     SVCall_IRQn                  = -5,     /*!< sv call interrupt                                        */ | ||||
|  | ||||
|     PendSV_IRQn                  = -2,     /*!< pend sv interrupt                                        */ | ||||
|     SysTick_IRQn                 = -1,     /*!< system tick interrupt                                    */ | ||||
|     /* interruput numbers */ | ||||
|     WWDGT_IRQn                   = 0,      /*!< window watchdog timer interrupt                          */ | ||||
|     LVD_IRQn                     = 1,      /*!< LVD through EXTI line detect interrupt                   */ | ||||
|     RTC_IRQn                     = 2,      /*!< RTC through EXTI line interrupt                          */ | ||||
|     FMC_IRQn                     = 3,      /*!< FMC interrupt                                            */ | ||||
|     RCU_IRQn                     = 4,      /*!< RCU interrupt                                            */ | ||||
|     EXTI0_1_IRQn                 = 5,      /*!< EXTI line 0 and 1 interrupts                             */ | ||||
|     EXTI2_3_IRQn                 = 6,      /*!< EXTI line 2 and 3 interrupts                             */ | ||||
|     EXTI4_15_IRQn                = 7,      /*!< EXTI line 4 to 15 interrupts                             */ | ||||
|     DMA_Channel0_IRQn            = 9,      /*!< DMA channel 0 interrupt                                  */ | ||||
|     DMA_Channel1_2_IRQn          = 10,     /*!< DMA channel 1 and channel 2 interrupts                   */ | ||||
|     DMA_Channel3_4_IRQn          = 11,     /*!< DMA channel 3 and channel 4 interrupts                   */ | ||||
|     ADC_CMP_IRQn                 = 12,     /*!< ADC, CMP interrupts                            */ | ||||
|     TIMER0_BRK_UP_TRG_COM_IRQn   = 13,     /*!< TIMER0 break, update, trigger and commutation interrupts */ | ||||
|     TIMER0_Channel_IRQn          = 14,     /*!< TIMER0 channel capture compare interrupts                */ | ||||
|     TIMER2_IRQn                  = 16,     /*!< TIMER2 interrupt                                         */ | ||||
|     TIMER5_IRQn                  = 17,     /*!< TIMER5 interrupt                                         */ | ||||
|     TIMER13_IRQn                 = 19,     /*!< TIMER13 interrupt                                        */ | ||||
|     TIMER14_IRQn                 = 20,     /*!< TIMER14 interrupt                                        */ | ||||
|     TIMER15_IRQn                 = 21,     /*!< TIMER15 interrupt                                        */ | ||||
|     TIMER16_IRQn                 = 22,     /*!< TIMER16 interrupt                                        */ | ||||
|     I2C0_EV_IRQn                 = 23,     /*!< I2C0 event interrupt                                     */ | ||||
|     I2C1_EV_IRQn                 = 24,     /*!< I2C1 event interrupt                                     */ | ||||
|     SPI0_IRQn                    = 25,     /*!< SPI0 interrupt                                           */ | ||||
|     SPI1_IRQn                    = 26,     /*!< SPI1 interrupt                                           */ | ||||
|     USART0_IRQn                  = 27,     /*!< USART0 interrupt                                         */ | ||||
|     USART1_IRQn                  = 28,     /*!< USART1 interrupt                                         */ | ||||
|     I2C0_ER_IRQn                 = 32,     /*!< I2C0 error interrupt                                     */ | ||||
|     I2C1_ER_IRQn                 = 34,     /*!< I2C1 error interrupt                                     */ | ||||
| } IRQn_Type; | ||||
|  | ||||
| /* includes */ | ||||
| #include "core_cm23.h" | ||||
| #include "system_gd32e23x.h" | ||||
| #include <stdint.h> | ||||
|  | ||||
| /* enum definitions */ | ||||
| typedef enum {DISABLE = 0, ENABLE = !DISABLE} EventStatus, ControlStatus; | ||||
| typedef enum {RESET = 0, SET = !RESET} FlagStatus; | ||||
| typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrStatus; | ||||
|  | ||||
| /* bit operations */ | ||||
| #define REG32(addr)                  (*(volatile uint32_t *)(uint32_t)(addr)) | ||||
| #define REG16(addr)                  (*(volatile uint16_t *)(uint32_t)(addr)) | ||||
| #define REG8(addr)                   (*(volatile uint8_t *)(uint32_t)(addr)) | ||||
| #define BIT(x)                       ((uint32_t)((uint32_t)0x01U<<(x))) | ||||
| #define BITS(start, end)             ((0xFFFFFFFFUL << (start)) & (0xFFFFFFFFUL >> (31U - (uint32_t)(end)))) | ||||
| #define GET_BITS(regval, start, end) (((regval) & BITS((start),(end))) >> (start)) | ||||
|  | ||||
| /* main flash and SRAM memory map */ | ||||
| #define FLASH_BASE            ((uint32_t)0x08000000U)       /*!< main FLASH base address          */ | ||||
| #define SRAM_BASE             ((uint32_t)0x20000000U)       /*!< SRAM base address                */ | ||||
| /* SRAM and peripheral base bit-band region */ | ||||
| #define SRAM_BB_BASE          ((uint32_t)0x22000000U)       /*!< SRAM bit-band base address       */ | ||||
| #define PERIPH_BB_BASE        ((uint32_t)0x42000000U)       /*!< peripheral bit-band base address */ | ||||
| /* peripheral memory map */ | ||||
| #define APB1_BUS_BASE         ((uint32_t)0x40000000U)       /*!< apb1 base address                */ | ||||
| #define APB2_BUS_BASE         ((uint32_t)0x40010000U)       /*!< apb2 base address                */ | ||||
| #define AHB1_BUS_BASE         ((uint32_t)0x40020000U)       /*!< ahb1 base address                */ | ||||
| #define AHB2_BUS_BASE         ((uint32_t)0x48000000U)       /*!< ahb2 base address                */ | ||||
| /* advanced peripheral bus 1 memory map */ | ||||
| #define TIMER_BASE            (APB1_BUS_BASE + 0x00000000U) /*!< TIMER base address               */ | ||||
| #define RTC_BASE              (APB1_BUS_BASE + 0x00002800U) /*!< RTC base address                 */ | ||||
| #define WWDGT_BASE            (APB1_BUS_BASE + 0x00002C00U) /*!< WWDGT base address               */ | ||||
| #define FWDGT_BASE            (APB1_BUS_BASE + 0x00003000U) /*!< FWDGT base address               */ | ||||
| #define SPI_BASE              (APB1_BUS_BASE + 0x00003800U) /*!< SPI base address                 */ | ||||
| #define USART_BASE            (APB1_BUS_BASE + 0x00004400U) /*!< USART base address               */ | ||||
| #define I2C_BASE              (APB1_BUS_BASE + 0x00005400U) /*!< I2C base address                 */ | ||||
| #define PMU_BASE              (APB1_BUS_BASE + 0x00007000U) /*!< PMU base address                 */ | ||||
| /* advanced peripheral bus 2 memory map */ | ||||
| #define SYSCFG_BASE           (APB2_BUS_BASE + 0x00000000U) /*!< SYSCFG base address              */ | ||||
| #define CMP_BASE              (APB2_BUS_BASE + 0x0000001CU) /*!< CMP base address                 */ | ||||
| #define EXTI_BASE             (APB2_BUS_BASE + 0x00000400U) /*!< EXTI base address                */ | ||||
| #define ADC_BASE              (APB2_BUS_BASE + 0x00002400U) /*!< ADC base address                 */ | ||||
| /* advanced high performance bus 1 memory map */ | ||||
| #define DMA_BASE              (AHB1_BUS_BASE + 0x00000000U) /*!< DMA base address                 */ | ||||
| #define DMA_CHANNEL_BASE      (DMA_BASE + 0x00000008U)      /*!< DMA channel base address         */ | ||||
| #define RCU_BASE              (AHB1_BUS_BASE + 0x00001000U) /*!< RCU base address                 */ | ||||
| #define FMC_BASE              (AHB1_BUS_BASE + 0x00002000U) /*!< FMC base address                 */ | ||||
| #define CRC_BASE              (AHB1_BUS_BASE + 0x00003000U) /*!< CRC base address                 */ | ||||
| /* advanced high performance bus 2 memory map */ | ||||
| #define GPIO_BASE             (AHB2_BUS_BASE + 0x00000000U) /*!< GPIO base address                */ | ||||
| /* option byte and debug memory map */ | ||||
| #define OB_BASE               ((uint32_t)0x1FFFF800U)       /*!< OB base address                  */ | ||||
| #define DBG_BASE              ((uint32_t)0x40015800U)       /*!< DBG base address                 */ | ||||
|  | ||||
| #include "gd32e23x_libopt.h" | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* GD32E23X_H */ | ||||
							
								
								
									
										59
									
								
								sdk/CMSIS/inc/system_gd32e23x.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								sdk/CMSIS/inc/system_gd32e23x.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| /*! | ||||
|     \file  system_gd32e23x.h | ||||
|     \brief CMSIS Cortex-M23 Device Peripheral Access Layer Header File for | ||||
|            GD32E23x Device Series | ||||
| */ | ||||
|  | ||||
| /* Copyright (c) 2012 ARM LIMITED | ||||
|    Copyright (c) 2023, GigaDevice Semiconductor Inc. | ||||
|  | ||||
|    All rights reserved. | ||||
|    Redistribution and use in source and binary forms, with or without | ||||
|    modification, are permitted provided that the following conditions are met: | ||||
|    - Redistributions of source code must retain the above copyright | ||||
|      notice, this list of conditions and the following disclaimer. | ||||
|    - Redistributions in binary form must reproduce the above copyright | ||||
|      notice, this list of conditions and the following disclaimer in the | ||||
|      documentation and/or other materials provided with the distribution. | ||||
|    - Neither the name of ARM nor the names of its contributors may be used | ||||
|      to endorse or promote products derived from this software without | ||||
|      specific prior written permission. | ||||
|    * | ||||
|    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
|    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|    ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE | ||||
|    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
|    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
|    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
|    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
|    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
|    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
|    POSSIBILITY OF SUCH DAMAGE. | ||||
|    ---------------------------------------------------------------------------*/ | ||||
|  | ||||
| /* This file refers the CMSIS standard, some adjustments are made according to GigaDevice chips */ | ||||
|  | ||||
| #ifndef SYSTEM_GD32E23X_H | ||||
| #define SYSTEM_GD32E23X_H | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| /* system clock frequency (core clock) */ | ||||
| extern uint32_t SystemCoreClock; | ||||
|  | ||||
| /* function declarations */ | ||||
| /* initialize the system and update the SystemCoreClock variable */ | ||||
| extern void SystemInit (void); | ||||
| /* update the SystemCoreClock with current core clock retrieved from cpu registers */ | ||||
| extern void SystemCoreClockUpdate (void); | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* SYSTEM_GD32E23X_H */ | ||||
							
								
								
									
										162
									
								
								sdk/CMSIS/src/syscalls.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										162
									
								
								sdk/CMSIS/src/syscalls.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,162 @@ | ||||
| /* Support files for GNU libc.  Files in the system namespace go here. | ||||
|    Files in the C namespace (ie those that do not start with an | ||||
|    underscore) go in .c.  */ | ||||
|  | ||||
| #include <_ansi.h> | ||||
| #include <sys/types.h> | ||||
| #include <sys/stat.h> | ||||
| #include <sys/fcntl.h> | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <time.h> | ||||
| #include <sys/time.h> | ||||
| #include <sys/times.h> | ||||
| #include <errno.h> | ||||
| #include <reent.h> | ||||
| #include <unistd.h> | ||||
| #include <sys/wait.h> | ||||
|  | ||||
| #undef errno | ||||
| extern int errno; | ||||
|  | ||||
| extern int __io_putchar(int ch) __attribute__((weak)); | ||||
| extern int __io_getchar(void) __attribute__((weak)); | ||||
|  | ||||
| caddr_t _sbrk(int incr) | ||||
| { | ||||
|   extern char _end[]; | ||||
|   extern char _heap_end[]; | ||||
|   static char *curbrk = _end; | ||||
|  | ||||
|   if ((curbrk + incr < _end) || (curbrk + incr > _heap_end)) | ||||
|     return NULL - 1; | ||||
|  | ||||
|   curbrk += incr; | ||||
|   return curbrk - incr; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * _gettimeofday primitive (Stub function) | ||||
|  * */ | ||||
| int _gettimeofday (struct timeval * tp, struct timezone * tzp) | ||||
| { | ||||
|   /* Return fixed data for the timezone.  */ | ||||
|   if (tzp) | ||||
|     { | ||||
|       tzp->tz_minuteswest = 0; | ||||
|       tzp->tz_dsttime = 0; | ||||
|     } | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
| void initialise_monitor_handles() | ||||
| { | ||||
| } | ||||
|  | ||||
| int _getpid(void) | ||||
| { | ||||
| 	return 1; | ||||
| } | ||||
|  | ||||
| int _kill(int pid, int sig) | ||||
| { | ||||
| 	errno = EINVAL; | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
| void _exit (int status) | ||||
| { | ||||
| 	_kill(status, -1); | ||||
| 	while (1) {} | ||||
| } | ||||
|  | ||||
| int _write(int file, char *ptr, int len) | ||||
| { | ||||
| 	int DataIdx; | ||||
|  | ||||
| 		for (DataIdx = 0; DataIdx < len; DataIdx++) | ||||
| 		{ | ||||
| 		   __io_putchar( *ptr++ ); | ||||
| 		} | ||||
| 	return len; | ||||
| } | ||||
|  | ||||
| int _close(int file) | ||||
| { | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
| int _fstat(int file, struct stat *st) | ||||
| { | ||||
| 	st->st_mode = S_IFCHR; | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| int _isatty(int file) | ||||
| { | ||||
| 	return 1; | ||||
| } | ||||
|  | ||||
| int _lseek(int file, int ptr, int dir) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| int _read(int file, char *ptr, int len) | ||||
| { | ||||
| 	int DataIdx; | ||||
|  | ||||
| 	for (DataIdx = 0; DataIdx < len; DataIdx++) | ||||
| 	{ | ||||
| 	  *ptr++ = __io_getchar(); | ||||
| 	} | ||||
|  | ||||
|    return len; | ||||
| } | ||||
|  | ||||
| int _open(char *path, int flags, ...) | ||||
| { | ||||
| 	/* Pretend like we always fail */ | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
| int _wait(int *status) | ||||
| { | ||||
| 	errno = ECHILD; | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
| int _unlink(char *name) | ||||
| { | ||||
| 	errno = ENOENT; | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
| int _times(struct tms *buf) | ||||
| { | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
| int _stat(char *file, struct stat *st) | ||||
| { | ||||
| 	st->st_mode = S_IFCHR; | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| int _link(char *old, char *new) | ||||
| { | ||||
| 	errno = EMLINK; | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
| int _fork(void) | ||||
| { | ||||
| 	errno = EAGAIN; | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
| int _execve(char *name, char **argv, char **env) | ||||
| { | ||||
| 	errno = ENOMEM; | ||||
| 	return -1; | ||||
| } | ||||
							
								
								
									
										385
									
								
								sdk/CMSIS/src/system_gd32e23x.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										385
									
								
								sdk/CMSIS/src/system_gd32e23x.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,385 @@ | ||||
| /*! | ||||
|     \file  system_gd32e23x.c | ||||
|     \brief CMSIS Cortex-M23 Device Peripheral Access Layer Source File for | ||||
|            GD32E23x Device Series | ||||
| */ | ||||
|  | ||||
| /* Copyright (c) 2012 ARM LIMITED | ||||
|    Copyright (c) 2023, GigaDevice Semiconductor Inc. | ||||
|  | ||||
|    All rights reserved. | ||||
|    Redistribution and use in source and binary forms, with or without | ||||
|    modification, are permitted provided that the following conditions are met: | ||||
|    - Redistributions of source code must retain the above copyright | ||||
|      notice, this list of conditions and the following disclaimer. | ||||
|    - Redistributions in binary form must reproduce the above copyright | ||||
|      notice, this list of conditions and the following disclaimer in the | ||||
|      documentation and/or other materials provided with the distribution. | ||||
|    - Neither the name of ARM nor the names of its contributors may be used | ||||
|      to endorse or promote products derived from this software without | ||||
|      specific prior written permission. | ||||
|    * | ||||
|    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
|    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|    ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE | ||||
|    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||||
|    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||||
|    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||||
|    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||||
|    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||||
|    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||||
|    POSSIBILITY OF SUCH DAMAGE. | ||||
|    ---------------------------------------------------------------------------*/ | ||||
|  | ||||
| /* This file refers the CMSIS standard, some adjustments are made according to GigaDevice chips */ | ||||
|  | ||||
| #include "gd32e23x.h" | ||||
|  | ||||
| /* system frequency define */ | ||||
| #define __IRC8M           (IRC8M_VALUE)            /* internal 8 MHz RC oscillator frequency */ | ||||
| #define __HXTAL           (HXTAL_VALUE)            /* high speed crystal oscillator frequency */ | ||||
| #define __SYS_OSC_CLK     (__IRC8M)                /* main oscillator frequency */ | ||||
|  | ||||
| #define VECT_TAB_OFFSET  (uint32_t)0x00            /* vector table base offset */ | ||||
|  | ||||
| /* select a system clock by uncommenting the following line */ | ||||
| //#define __SYSTEM_CLOCK_8M_HXTAL              (__HXTAL) | ||||
| //#define __SYSTEM_CLOCK_8M_IRC8M              (__IRC8M) | ||||
| // #define __SYSTEM_CLOCK_72M_PLL_HXTAL         (uint32_t)(72000000) | ||||
| #define __SYSTEM_CLOCK_72M_PLL_IRC8M_DIV2    (uint32_t)(72000000) | ||||
|  | ||||
| #define RCU_MODIFY(__delay)     do{                                     \ | ||||
|                                     volatile uint32_t i;                \ | ||||
|                                     if(0 != __delay){                   \ | ||||
|                                         RCU_CFG0 |= RCU_AHB_CKSYS_DIV2; \ | ||||
|                                         for(i=0; i<__delay; i++){       \ | ||||
|                                         }                               \ | ||||
|                                         RCU_CFG0 |= RCU_AHB_CKSYS_DIV4; \ | ||||
|                                         for(i=0; i<__delay; i++){       \ | ||||
|                                         }                               \ | ||||
|                                     }                                   \ | ||||
|                                 }while(0) | ||||
|  | ||||
| #define SEL_IRC8M       0x00 | ||||
| #define SEL_HXTAL       0x01 | ||||
| #define SEL_PLL         0x02 | ||||
|  | ||||
| /* set the system clock frequency and declare the system clock configuration function */ | ||||
| #ifdef __SYSTEM_CLOCK_8M_HXTAL | ||||
| uint32_t SystemCoreClock = __SYSTEM_CLOCK_8M_HXTAL; | ||||
| static void system_clock_8m_hxtal(void); | ||||
|  | ||||
| #elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) | ||||
| uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_HXTAL; | ||||
| static void system_clock_72m_hxtal(void); | ||||
|  | ||||
| #elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M_DIV2) | ||||
| uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_IRC8M_DIV2; | ||||
| static void system_clock_72m_irc8m(void); | ||||
|  | ||||
| #else | ||||
| uint32_t SystemCoreClock = __SYSTEM_CLOCK_8M_IRC8M; | ||||
| static void system_clock_8m_irc8m(void); | ||||
| #endif /* __SYSTEM_CLOCK_8M_HXTAL */ | ||||
|  | ||||
| /* configure the system clock */ | ||||
| static void system_clock_config(void); | ||||
|  | ||||
| /*! | ||||
|     \brief      setup the microcontroller system, initialize the system | ||||
|     \param[in]  none | ||||
|     \param[out] none | ||||
|     \retval     none | ||||
| */ | ||||
| void SystemInit (void) | ||||
| { | ||||
|     /* enable IRC8M */ | ||||
|     RCU_CTL0 |= RCU_CTL0_IRC8MEN; | ||||
|     while(0U == (RCU_CTL0 & RCU_CTL0_IRC8MSTB)){ | ||||
|     } | ||||
|  | ||||
|     RCU_MODIFY(0x80); | ||||
|     RCU_CFG0 &= ~RCU_CFG0_SCS; | ||||
|     RCU_CTL0 &= ~(RCU_CTL0_HXTALEN | RCU_CTL0_CKMEN | RCU_CTL0_PLLEN | RCU_CTL0_HXTALBPS); | ||||
|     /* reset RCU */ | ||||
|     RCU_CFG0 &= ~(RCU_CFG0_SCS | RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC |\ | ||||
|                   RCU_CFG0_ADCPSC | RCU_CFG0_CKOUTSEL | RCU_CFG0_CKOUTDIV | RCU_CFG0_PLLDV); | ||||
|     RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PLLMF | RCU_CFG0_PLLMF4 | RCU_CFG0_PLLDV); | ||||
|     RCU_CFG1 &= ~(RCU_CFG1_PREDV); | ||||
|     RCU_CFG2 &= ~(RCU_CFG2_USART0SEL | RCU_CFG2_ADCSEL); | ||||
|     RCU_CFG2 &= ~RCU_CFG2_IRC28MDIV; | ||||
|     RCU_CFG2 &= ~RCU_CFG2_ADCPSC2; | ||||
|     RCU_CTL1 &= ~RCU_CTL1_IRC28MEN; | ||||
|     RCU_INT = 0x00000000U; | ||||
|  | ||||
|     /* configure system clock */ | ||||
|     system_clock_config(); | ||||
|      | ||||
| #ifdef VECT_TAB_SRAM | ||||
|     nvic_vector_table_set(NVIC_VECTTAB_RAM,VECT_TAB_OFFSET); | ||||
| #else | ||||
|     nvic_vector_table_set(NVIC_VECTTAB_FLASH,VECT_TAB_OFFSET); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| /*! | ||||
|     \brief      configure the system clock | ||||
|     \param[in]  none | ||||
|     \param[out] none | ||||
|     \retval     none | ||||
| */ | ||||
| static void system_clock_config(void) | ||||
| { | ||||
| #ifdef __SYSTEM_CLOCK_8M_HXTAL | ||||
|     system_clock_8m_hxtal(); | ||||
| #elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) | ||||
|     system_clock_72m_hxtal(); | ||||
| #elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M_DIV2) | ||||
|     system_clock_72m_irc8m(); | ||||
| #elif defined (__SYSTEM_CLOCK_72M_PLL_IRC48M_DIV2) | ||||
|     system_clock_72m_irc48m(); | ||||
| #else | ||||
|     system_clock_8m_irc8m(); | ||||
| #endif /* __SYSTEM_CLOCK_8M_HXTAL */ | ||||
| } | ||||
|  | ||||
| #ifdef __SYSTEM_CLOCK_8M_HXTAL | ||||
| /*! | ||||
|     \brief      configure the system clock to 8M by HXTAL | ||||
|     \param[in]  none | ||||
|     \param[out] none | ||||
|     \retval     none | ||||
| */ | ||||
| static void system_clock_8m_hxtal(void) | ||||
| { | ||||
|     uint32_t timeout = 0U; | ||||
|     uint32_t stab_flag = 0U; | ||||
|  | ||||
|     /* enable HXTAL */ | ||||
|     RCU_CTL0 |= RCU_CTL0_HXTALEN; | ||||
|      | ||||
|     /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ | ||||
|     do{ | ||||
|         timeout++; | ||||
|         stab_flag = (RCU_CTL0 & RCU_CTL0_HXTALSTB); | ||||
|     } | ||||
|     while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout));     | ||||
|     /* if fail */ | ||||
|     if(0U == (RCU_CTL0 & RCU_CTL0_HXTALSTB)){ | ||||
|         while(1){ | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     /* HXTAL is stable */ | ||||
|     /* AHB = SYSCLK */ | ||||
|     RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; | ||||
|     /* APB2 = AHB */ | ||||
|     RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; | ||||
|     /* APB1 = AHB */ | ||||
|     RCU_CFG0 |= RCU_APB1_CKAHB_DIV1; | ||||
|      | ||||
|     /* select HXTAL as system clock */ | ||||
|     RCU_CFG0 &= ~RCU_CFG0_SCS; | ||||
|     RCU_CFG0 |= RCU_CKSYSSRC_HXTAL; | ||||
|      | ||||
|     /* wait until HXTAL is selected as system clock */ | ||||
|     while(RCU_SCSS_HXTAL != (RCU_CFG0 & RCU_CFG0_SCSS)){ | ||||
|     } | ||||
| } | ||||
|  | ||||
| #elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) | ||||
| /*! | ||||
|     \brief      configure the system clock to 72M by PLL which selects HXTAL as its clock source | ||||
|     \param[in]  none | ||||
|     \param[out] none | ||||
|     \retval     none | ||||
| */ | ||||
| static void system_clock_72m_hxtal(void) | ||||
| { | ||||
|     uint32_t timeout = 0U; | ||||
|     uint32_t stab_flag = 0U; | ||||
|  | ||||
|     /* enable HXTAL */ | ||||
|     RCU_CTL0 |= RCU_CTL0_HXTALEN; | ||||
|  | ||||
|     /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ | ||||
|     do{ | ||||
|         timeout++; | ||||
|         stab_flag = (RCU_CTL0 & RCU_CTL0_HXTALSTB); | ||||
|     } | ||||
|     while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); | ||||
|     /* if fail */ | ||||
|     if(0U == (RCU_CTL0 & RCU_CTL0_HXTALSTB)){ | ||||
|         while(1){ | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     FMC_WS = (FMC_WS & (~FMC_WS_WSCNT)) | WS_WSCNT_2; | ||||
|      | ||||
|     /* HXTAL is stable */ | ||||
|     /* AHB = SYSCLK */ | ||||
|     RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; | ||||
|     /* APB2 = AHB */ | ||||
|     RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; | ||||
|     /* APB1 = AHB */ | ||||
|     RCU_CFG0 |= RCU_APB1_CKAHB_DIV1; | ||||
|  | ||||
|     /* PLL = HXTAL * 9 = 72 MHz */ | ||||
|     RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PLLMF | RCU_CFG0_PLLDV); | ||||
|     RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL9); | ||||
|  | ||||
|     /* enable PLL */ | ||||
|     RCU_CTL0 |= RCU_CTL0_PLLEN; | ||||
|  | ||||
|     /* wait until PLL is stable */ | ||||
|     while(0U == (RCU_CTL0 & RCU_CTL0_PLLSTB)){ | ||||
|     } | ||||
|  | ||||
|     /* select PLL as system clock */ | ||||
|     RCU_CFG0 &= ~RCU_CFG0_SCS; | ||||
|     RCU_CFG0 |= RCU_CKSYSSRC_PLL; | ||||
|  | ||||
|     /* wait until PLL is selected as system clock */ | ||||
|     while(RCU_SCSS_PLL != (RCU_CFG0 & RCU_CFG0_SCSS)){ | ||||
|     } | ||||
| } | ||||
|  | ||||
| #elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M_DIV2) | ||||
| /*! | ||||
|     \brief      configure the system clock to 72M by PLL which selects IRC8M/2 as its clock source | ||||
|     \param[in]  none | ||||
|     \param[out] none | ||||
|     \retval     none | ||||
| */ | ||||
| static void system_clock_72m_irc8m(void) | ||||
| { | ||||
|     uint32_t timeout = 0U; | ||||
|     uint32_t stab_flag = 0U; | ||||
|      | ||||
|     /* enable IRC8M */ | ||||
|     RCU_CTL0 |= RCU_CTL0_IRC8MEN; | ||||
|  | ||||
|     /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ | ||||
|     do{ | ||||
|         timeout++; | ||||
|         stab_flag = (RCU_CTL0 & RCU_CTL0_IRC8MSTB); | ||||
|     } | ||||
|     while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); | ||||
|  | ||||
|     /* if fail */ | ||||
|     if(0U == (RCU_CTL0 & RCU_CTL0_IRC8MSTB)){ | ||||
|         while(1){ | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     FMC_WS = (FMC_WS & (~FMC_WS_WSCNT)) | WS_WSCNT_2; | ||||
|      | ||||
|     /* AHB = SYSCLK */ | ||||
|     RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; | ||||
|     /* APB2 = AHB */ | ||||
|     RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; | ||||
|     /* APB1 = AHB */ | ||||
|     RCU_CFG0 |= RCU_APB1_CKAHB_DIV1; | ||||
|     /* PLL = (IRC8M/2) * 18 = 72 MHz */ | ||||
|     RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PLLMF); | ||||
|     RCU_CFG0 |= (RCU_PLLSRC_IRC8M_DIV2 | RCU_PLL_MUL18); | ||||
|      | ||||
|     /* enable PLL */ | ||||
|     RCU_CTL0 |= RCU_CTL0_PLLEN; | ||||
|  | ||||
|     /* wait until PLL is stable */ | ||||
|     while(0U == (RCU_CTL0 & RCU_CTL0_PLLSTB)){ | ||||
|     } | ||||
|  | ||||
|     /* select PLL as system clock */ | ||||
|     RCU_CFG0 &= ~RCU_CFG0_SCS; | ||||
|     RCU_CFG0 |= RCU_CKSYSSRC_PLL; | ||||
|  | ||||
|     /* wait until PLL is selected as system clock */ | ||||
|     while(RCU_SCSS_PLL != (RCU_CFG0 & RCU_CFG0_SCSS)){ | ||||
|     } | ||||
| } | ||||
|  | ||||
| #else | ||||
| /*! | ||||
|     \brief      configure the system clock to 8M by IRC8M | ||||
|     \param[in]  none | ||||
|     \param[out] none | ||||
|     \retval     none | ||||
| */ | ||||
| static void system_clock_8m_irc8m(void) | ||||
| { | ||||
|     /* AHB = SYSCLK */ | ||||
|     RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; | ||||
|     /* APB2 = AHB */ | ||||
|     RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; | ||||
|     /* APB1 = AHB */ | ||||
|     RCU_CFG0 |= RCU_APB1_CKAHB_DIV1; | ||||
|      | ||||
|     /* select IRC8M as system clock */ | ||||
|     RCU_CFG0 &= ~RCU_CFG0_SCS; | ||||
|     RCU_CFG0 |= RCU_CKSYSSRC_IRC8M; | ||||
|      | ||||
|     /* wait until IRC8M is selected as system clock */ | ||||
|     while(RCU_SCSS_IRC8M != (RCU_CFG0 & RCU_CFG0_SCSS)){ | ||||
|     } | ||||
| } | ||||
| #endif /* __SYSTEM_CLOCK_8M_HXTAL */ | ||||
|  | ||||
| /*! | ||||
|     \brief      update the SystemCoreClock with current core clock retrieved from cpu registers | ||||
|     \param[in]  none | ||||
|     \param[out] none | ||||
|     \retval     none | ||||
| */ | ||||
| void SystemCoreClockUpdate (void) | ||||
| { | ||||
|     uint32_t sws = 0U; | ||||
|     uint32_t pllmf = 0U, pllmf4 = 0U, pllsel = 0U, prediv = 0U, idx = 0U, clk_exp = 0U; | ||||
|     /* exponent of AHB clock divider */ | ||||
|     const uint8_t ahb_exp[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; | ||||
|  | ||||
|     sws = GET_BITS(RCU_CFG0, 2, 3); | ||||
|     switch(sws){ | ||||
|     /* IRC8M is selected as CK_SYS */ | ||||
|     case SEL_IRC8M: | ||||
|         SystemCoreClock = IRC8M_VALUE; | ||||
|         break; | ||||
|     /* HXTAL is selected as CK_SYS */ | ||||
|     case SEL_HXTAL: | ||||
|         SystemCoreClock = HXTAL_VALUE; | ||||
|         break; | ||||
|     /* PLL is selected as CK_SYS */ | ||||
|     case SEL_PLL: | ||||
|         /* get the value of PLLMF[3:0] */ | ||||
|         pllmf = GET_BITS(RCU_CFG0, 18, 21); | ||||
|         pllmf4 = GET_BITS(RCU_CFG0, 27, 27); | ||||
|         /* high 16 bits */ | ||||
|         if(1U == pllmf4){ | ||||
|             pllmf += 17U; | ||||
|         }else if(15U == pllmf){ | ||||
|             pllmf = 16U; | ||||
|         }else{ | ||||
|             pllmf += 2U; | ||||
|         } | ||||
|          | ||||
|         /* PLL clock source selection, HXTAL or IRC8M/2 */ | ||||
|         pllsel = GET_BITS(RCU_CFG0, 16, 16); | ||||
|         if(0U != pllsel){ | ||||
|             prediv = (GET_BITS(RCU_CFG1, 0, 3) + 1U); | ||||
|             SystemCoreClock = (HXTAL_VALUE / prediv) * pllmf; | ||||
|         }else{ | ||||
|             SystemCoreClock = (IRC8M_VALUE >> 1) * pllmf; | ||||
|         } | ||||
|         break; | ||||
|     /* IRC8M is selected as CK_SYS */ | ||||
|     default: | ||||
|         SystemCoreClock = IRC8M_VALUE; | ||||
|         break; | ||||
|     } | ||||
|     /* calculate AHB clock frequency */ | ||||
|     idx = GET_BITS(RCU_CFG0, 4, 7); | ||||
|     clk_exp = ahb_exp[idx]; | ||||
|     SystemCoreClock >>= clk_exp; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user