1 /**************************************************************************//**
2  * @file     system_m460.c
3  * @version  V3.000
4  * @brief    CMSIS Cortex-M4 Core Peripheral Access Layer Source File for M460
5  *
6  * @copyright SPDX-License-Identifier: Apache-2.0
7  * @copyright Copyright (C) 2021 Nuvoton Technology Corp. All rights reserved.
8  *****************************************************************************/
9 
10 #include "NuMicro.h"
11 
12 
13 /*----------------------------------------------------------------------------
14   DEFINES
15  *----------------------------------------------------------------------------*/
16 
17 /*----------------------------------------------------------------------------
18   Clock Variable definitions
19  *----------------------------------------------------------------------------*/
20 uint32_t SystemCoreClock  = __SYSTEM_CLOCK;    /*!< System Clock Frequency (Core Clock)*/
21 uint32_t CyclesPerUs      = (__HSI / 1000000UL); /* Cycles per micro second */
22 uint32_t PllClock         = __HSI;             /*!< PLL Output Clock Frequency         */
23 uint32_t gau32ClkSrcTbl[] = {__HXT, __LXT, 0UL, __LIRC, 0UL, 0UL, 0UL, __HIRC};
24 
25 /*----------------------------------------------------------------------------
26   Clock functions
27  *----------------------------------------------------------------------------*/
SystemCoreClockUpdate(void)28 void SystemCoreClockUpdate (void)            /* Get Core Clock Frequency      */
29 {
30     uint32_t u32Freq, u32ClkSrc;
31     uint32_t u32HclkDiv;
32 
33     /* Update PLL Clock */
34     PllClock = CLK_GetPLLClockFreq();
35 
36     u32ClkSrc = CLK->CLKSEL0 & CLK_CLKSEL0_HCLKSEL_Msk;
37 
38     if(u32ClkSrc == CLK_CLKSEL0_HCLKSEL_PLL)
39     {
40         /* Use PLL clock */
41         u32Freq = PllClock;
42     }
43     else
44     {
45         /* Use the clock sources directly */
46         u32Freq = gau32ClkSrcTbl[u32ClkSrc];
47     }
48 
49     u32HclkDiv = (CLK->CLKDIV0 & CLK_CLKDIV0_HCLKDIV_Msk) + 1UL;
50 
51     /* Update System Core Clock */
52     SystemCoreClock = u32Freq / u32HclkDiv;
53 
54 
55     //if(SystemCoreClock == 0)
56     //    __BKPT(0);
57 
58     CyclesPerUs = (SystemCoreClock + 500000UL) / 1000000UL;
59 }
60 
61 
62 /**
63  * @brief  Initialize the System
64  *
65  * @param  none
66  * @return none
67  */
SystemInit(void)68 void SystemInit (void)
69 {
70 
71     /* Add your system initialize code here.
72        Do not use global variables because this function is called before
73        reaching pre-main. RW section maybe overwritten afterwards.          */
74 
75     /* FPU settings ------------------------------------------------------------*/
76 #if (__FPU_PRESENT == 1U) && (__FPU_USED == 1U)
77     SCB->CPACR |= ((3UL << 10*2) |                 /* set CP10 Full Access */
78                    (3UL << 11*2)  );               /* set CP11 Full Access */
79 #endif
80 
81     /* Unlock protected registers */
82     SYS_UnlockReg();
83 
84     /* Set HCLK switch to be reset by HRESET reset sources */
85     outpw(0x40000014, inpw(0x40000014)|BIT7);
86 
87     /* Set HXT crystal as INV type */
88     CLK->PWRCTL &= ~CLK_PWRCTL_HXTSELTYP_Msk;
89 
90 #ifdef HBI_ENABLE
91     /* Default to Enable HyperRAM */
92     CLK->AHBCLK0 |= CLK_AHBCLK0_HBICKEN_Msk;
93 
94     /* Set multi-function pins for HBI */
95 #if HBI_ENABLE == 1
96 
97     SET_HBI_D0_PG11();
98     SET_HBI_D1_PG12();
99     SET_HBI_D2_PC0();
100     SET_HBI_D3_PG10();
101     SET_HBI_D4_PG9();
102     SET_HBI_D5_PG13();
103     SET_HBI_D6_PG14();
104     SET_HBI_D7_PG15();
105 
106     SET_HBI_RWDS_PC1();
107     SET_HBI_nRESET_PC2();
108     SET_HBI_nCS_PC3();
109     SET_HBI_CK_PC4();
110     SET_HBI_nCK_PC5();
111 
112     /* Slew rate control. PC0-5, PG9-15 */
113     CLK->AHBCLK0 |= CLK_AHBCLK0_GPCCKEN_Msk | CLK_AHBCLK0_GPGCKEN_Msk;
114 
115     PC->SLEWCTL = 0xaaa;
116     PG->SLEWCTL = 0xaaa80000;
117 
118 #elif HBI_ENABLE == 2
119 
120     SET_HBI_D0_PJ6();
121     SET_HBI_D1_PJ5();
122     SET_HBI_D2_PJ4();
123     SET_HBI_D3_PJ3();
124     SET_HBI_D4_PH15();
125     SET_HBI_D5_PD7();
126     SET_HBI_D6_PD6();
127     SET_HBI_D7_PD5();
128 
129     SET_HBI_RWDS_PH14();
130     SET_HBI_nRESET_PJ2();
131     SET_HBI_nCS_PJ7();
132     SET_HBI_CK_PH13();
133     SET_HBI_nCK_PH12();
134 
135     /* Slew rate control. PD5-7, PJ2-7, PH12-15 */
136     CLK->AHBCLK0 |= CLK_AHBCLK0_GPDCKEN_Msk | CLK_AHBCLK0_GPHCKEN_Msk;
137     CLK->AHBCLK1 |= CLK_AHBCLK1_GPJCKEN_Msk;
138 
139     PD->SLEWCTL = 0xa800;
140     PJ->SLEWCTL = 0xaaa0;
141     PH->SLEWCTL = 0xaa000000;
142 
143 #else
144 # error "HBI_ENABLE must be 1 or 2 to set relative MFP"
145 #endif
146 #endif
147 
148 
149 
150     /* Lock protected registers */
151     SYS_LockReg();
152 
153 }
154