| /************************************************************************/ | |
| /* (C) Fujitsu Semiconductor Europe GmbH (FSEU) */ | |
| /* */ | |
| /* The following software deliverable is intended for and must only be */ | |
| /* used for reference and in an evaluation laboratory environment. */ | |
| /* It is provided on an as-is basis without charge and is subject to */ | |
| /* alterations. */ | |
| /* It is the user's obligation to fully test the software in its */ | |
| /* environment and to ensure proper functionality, qualification and */ | |
| /* compliance with component specifications. */ | |
| /* */ | |
| /* In the event the software deliverable includes the use of open */ | |
| /* source components, the provisions of the governing open source */ | |
| /* license agreement shall apply with respect to such software */ | |
| /* deliverable. */ | |
| /* FSEU does not warrant that the deliverables do not infringe any */ | |
| /* third party intellectual property right (IPR). In the event that */ | |
| /* the deliverables infringe a third party IPR it is the sole */ | |
| /* responsibility of the customer to obtain necessary licenses to */ | |
| /* continue the usage of the deliverable. */ | |
| /* */ | |
| /* To the maximum extent permitted by applicable law FSEU disclaims all */ | |
| /* warranties, whether express or implied, in particular, but not */ | |
| /* limited to, warranties of merchantability and fitness for a */ | |
| /* particular purpose for which the deliverable is not designated. */ | |
| /* */ | |
| /* To the maximum extent permitted by applicable law, FSEU's liability */ | |
| /* is restricted to intentional misconduct and gross negligence. */ | |
| /* FSEU is not liable for consequential damages. */ | |
| /* */ | |
| /* (V1.5) */ | |
| /************************************************************************/ | |
| #include <stdint.h> | |
| #include "mb9bf506n.h" | |
| /*--------------------- Clock Configuration ----------------------------------*/ | |
| // | |
| // <e0> Clock Configuration | |
| // <h> System Clock Configuration | |
| // <o1.1> SCM_CTL.MOSCE: Main clock oscillation enable | |
| // <o2.0..3> CSW_TMR.MOWT: Main clock stabilization wait time | |
| // <i> Default: ~ 500 ns | |
| // < 0=> ~ 500 ns | |
| // < 1=> ~ 8 us | |
| // < 2=> ~ 16 us | |
| // < 3=> ~ 32 us | |
| // < 4=> ~ 64 us | |
| // < 5=> ~ 128 us | |
| // < 6=> ~ 256 us | |
| // < 7=> ~ 512 us | |
| // < 8=> ~ 1.0 ms | |
| // < 9=> ~ 2.0 ms | |
| // <10=> ~ 4.0 ms | |
| // <11=> ~ 8.0 ms | |
| // <12=> ~ 33.0 ms | |
| // <13=> ~ 131 ms | |
| // <14=> ~ 524 ms | |
| // <15=> ~ 2.0 s | |
| // <o1.3> SCM_CTL.SOSCE: Sub clock oscillation enable | |
| // <o2.4..6> CSW_TMR.SOWT: SOWT: Sub clock stabilization wait time | |
| // <i> Default: ~ 31.19 ms | |
| // <0=> ~ 31.19 ms | |
| // <1=> ~ 62.44 ms | |
| // <2=> ~ 0.125 s | |
| // <3=> ~ 0.25 s | |
| // <4=> ~ 0.50 s | |
| // <5=> ~ 1.00 s | |
| // <6=> ~ 2.00 s | |
| // <7=> ~ 4.00 s | |
| // <e1.4> SCM_CTL.PLLE: PLL oscillation enable | |
| // <i> fPLLO Max = 120MHz, CLKPLL Min = 60MHz | |
| // <i> CLKPLL = (CLKMO / PLLK) * PLLN | |
| // <o4.4..7> PLL_CTL1.PLLK: PLL input clock frequency division | |
| // <1-16><#-1> | |
| // <o5.0..4> PLL_CTL1.PLLN: PLL feedback frequency division | |
| // <1-32><#-1> | |
| // <o4.0..3> PLL_CTL1.PLLM: PLL VCO clock frequency division | |
| // <1-16><#-1> | |
| // <o3.0..2> PSW_TMR.POWT: PLL clock stabilization wait time | |
| // <i> Default: ~ 128 us | |
| // <0=> ~ 128 us | |
| // <1=> ~ 256 us | |
| // <2=> ~ 512 us | |
| // <3=> ~ 1.02 ms | |
| // <4=> ~ 2.05 ms | |
| // <5=> ~ 4.10 ms | |
| // <6=> ~ 8.20 ms | |
| // <7=> ~ 16.40 ms | |
| // </e> | |
| // <o1.5..7> SCM_CTL.RCS: Master clock switch control | |
| // <i> Default: Master Clock = CLKHC | |
| // <0=> Master Clock = CLKHC | |
| // <1=> Master Clock = CLKMO | |
| // <2=> Master Clock = CLKPLL | |
| // <4=> Master Clock = CLKLC | |
| // <5=> Master Clock = CLKSO | |
| // </h> | |
| // | |
| // <h> Base Clock Prescaler | |
| // <o6.0..2> BSC_PSR.BSR: Base clock frequency division | |
| // <i> Default: HCLK = Master Clock | |
| // <i> HCLK Max = 80MHz | |
| // <0=> HCLK = Master Clock | |
| // <1=> HCLK = Master Clock / 2 | |
| // <2=> HCLK = Master Clock / 3 | |
| // <3=> HCLK = Master Clock / 4 | |
| // <4=> HCLK = Master Clock / 6 | |
| // <5=> HCLK = Master Clock / 8 | |
| // <6=> HCLK = Master Clock / 16 | |
| // </h> | |
| // | |
| // <h> APB0 Prescaler | |
| // <o7.0..1> APBC0_PSR.APBC0: APB0 bus clock frequency division | |
| // <i> PCLK0 Max = 40MHz | |
| // <i> Default: PCLK0 = HCLK | |
| // <0=> PCLK0 = HCLK | |
| // <1=> PCLK0 = HCLK / 2 | |
| // <2=> PCLK0 = HCLK / 4 | |
| // <3=> PCLK0 = HCLK / 8 | |
| // </h> | |
| // | |
| // <h> APB1 Prescaler | |
| // <o8.0..1> APBC1_PSR.APBC1: APB1 bus clock frequency | |
| // <i> PCLK1 Max = 40MHz | |
| // <i> Default: PCLK1 = HCLK | |
| // <0=> PCLK1 = HCLK | |
| // <1=> PCLK1 = HCLK / 2 | |
| // <2=> PCLK1 = HCLK / 4 | |
| // <3=> PCLK1 = HCLK / 8 | |
| // <o8.7> APBC1_PSR.APBC1EN: APB1 clock enable | |
| // </h> | |
| // | |
| // <h> APB2 Prescaler | |
| // <o9.0..1> APBC2_PSR.APBC2: APB2 bus clock frequency | |
| // <i> PCLK2 Max = 40MHz | |
| // <i> Default: PCLK2 = HCLK | |
| // <0=> PCLK2 = HCLK | |
| // <1=> PCLK2 = HCLK / 2 | |
| // <2=> PCLK2 = HCLK / 4 | |
| // <3=> PCLK2 = HCLK / 8 | |
| // <o9.7> APBC2_PSR.APBC2EN: APB2 clock enable | |
| // </h> | |
| // | |
| // <h> SW Watchdog Clock Prescaler | |
| // <o10.0..1>SWC_PSR.SWDS: Software watchdog clock frequency division | |
| // <i> Default: SWDGOGCLK = PCLK0 | |
| // <0=> SWDGOGCLK = PCLK0 | |
| // <1=> SWDGOGCLK = PCLK0 / 2 | |
| // <2=> SWDGOGCLK = PCLK0 / 4 | |
| // <3=> SWDGOGCLK = PCLK0 / 8 | |
| // </h> | |
| // | |
| // <h> Trace Clock Prescaler | |
| // <o11.0> TTC_PSR.TTC: Trace clock frequency division | |
| // <i> Default: TPIUCLK = HCLK | |
| // <0=> TPIUCLK = HCLK | |
| // <1=> TPIUCLK = HCLK / 2 | |
| // </h> | |
| // | |
| // </e> | |
| #define CLOCK_SETUP 1 | |
| #define SCM_CTL_Val 0x00000052 | |
| #define CSW_TMR_Val 0x0000005C | |
| #define PSW_TMR_Val 0x00000000 | |
| #define PLL_CTL1_Val 0x00000000 | |
| #define PLL_CTL2_Val 0x00000013 | |
| #define BSC_PSR_Val 0x00000000 | |
| #define APBC0_PSR_Val 0x00000001 | |
| #define APBC1_PSR_Val 0x00000082 | |
| #define APBC2_PSR_Val 0x00000081 | |
| #define SWC_PSR_Val 0x00000003 | |
| #define TTC_PSR_Val 0x00000000 | |
| /*--------------------- WatchDog Configuration -------------------------------*/ | |
| // | |
| // <o0.0> HW Watchdog disable | |
| #define HWWD_DISABLE 0x00000001 | |
| /* | |
| //-------- <<< end of configuration section >>> ------------------------------ | |
| */ | |
| /*---------------------------------------------------------------------------- | |
| Check the register settings | |
| *----------------------------------------------------------------------------*/ | |
| #define CHECK_RANGE(val, min, max) ((val < min) || (val > max)) | |
| #define CHECK_RSVD(val, mask) (val & mask) | |
| /* Clock Configuration -------------------------------------------------------*/ | |
| #if (CHECK_RSVD((SCM_CTL_Val), ~0x000000FA)) | |
| #error "SCM_CTL: Invalid values of reserved bits!" | |
| #endif | |
| #if ((SCM_CTL_Val & 0xE0) == 0x40) && ((SCM_CTL_Val & 0x10) != 0x10) | |
| #error "SCM_CTL: CLKPLL is selected but PLL is not enabled!" | |
| #endif | |
| #if (CHECK_RSVD((CSW_TMR_Val), ~0x0000007F)) | |
| #error "CSW_TMR: Invalid values of reserved bits!" | |
| #endif | |
| #if ((SCM_CTL_Val & 0x10)) /* if PLL is used */ | |
| #if (CHECK_RSVD((PSW_TMR_val), ~0x00000007)) | |
| #error "PSW_TMR: Invalid values of reserved bits!" | |
| #endif | |
| #if (CHECK_RSVD((PLL_CTL1_Val), ~0x000000FF)) | |
| #error "PLL_CTL1: Invalid values of reserved bits!" | |
| #endif | |
| #if (CHECK_RSVD((PLL_CTL2_Val), ~0x0000001F)) | |
| #error "PLL_CTL2: Invalid values of reserved bits!" | |
| #endif | |
| #endif | |
| #if (CHECK_RSVD((BSC_PSR_Val), ~0x00000007)) | |
| #error "BSC_PSR: Invalid values of reserved bits!" | |
| #endif | |
| #if (CHECK_RSVD((APBC0_PSR_Val), ~0x00000003)) | |
| #error "APBC0_PSR: Invalid values of reserved bits!" | |
| #endif | |
| #if (CHECK_RSVD((APBC1_PSR_Val), ~0x00000083)) | |
| #error "APBC1_PSR: Invalid values of reserved bits!" | |
| #endif | |
| #if (CHECK_RSVD((APBC2_PSR_Val), ~0x00000083)) | |
| #error "APBC2_PSR: Invalid values of reserved bits!" | |
| #endif | |
| #if (CHECK_RSVD((SWC_PSR_Val), ~0x00000003)) | |
| #error "SWC_PSR: Invalid values of reserved bits!" | |
| #endif | |
| #if (CHECK_RSVD((TTC_PSR_Val), ~0x00000001)) | |
| #error "TTC_PSR: Invalid values of reserved bits!" | |
| #endif | |
| /*---------------------------------------------------------------------------- | |
| DEFINES | |
| *----------------------------------------------------------------------------*/ | |
| /*---------------------------------------------------------------------------- | |
| Define clocks | |
| *----------------------------------------------------------------------------*/ | |
| #define __CLKMO ( 4000000UL) /* External 4MHz Crystal */ | |
| #define __CLKSO ( 32768UL) /* External 32KHz Crystal */ | |
| #define __CLKHC ( 4000000UL) /* Internal 4MHz RC Oscillator */ | |
| #define __CLKLC ( 100000UL) /* Internal 100KHz RC Oscillator */ | |
| /* CLKPLL = (CLKMO / PLLK) * PLLN */ | |
| #define __PLLK (((PLL_CTL1_Val >> 4) & 0x0F) + 1) | |
| #define __PLLN (((PLL_CTL2_Val ) & 0x1F) + 1) | |
| #define __PLLCLK ((__CLKMO * __PLLN) / __PLLK) | |
| /* Determine core clock frequency according to settings */ | |
| #if (((SCM_CTL_Val >> 5) & 0x07) == 0) | |
| #define __MASTERCLK (__CLKHC) | |
| #elif (((SCM_CTL_Val >> 5) & 0x07) == 1) | |
| #define __MASTERCLK (__CLKMO) | |
| #elif (((SCM_CTL_Val >> 5) & 0x07) == 2) | |
| #define __MASTERCLK (__PLLCLK) | |
| #elif (((SCM_CTL_Val >> 5) & 0x07) == 4) | |
| #define __MASTERCLK (__CLKLC) | |
| #elif (((SCM_CTL_Val >> 5) & 0x07) == 5) | |
| #define __MASTERCLK (__CLKSO) | |
| #else | |
| #define __MASTERCLK (0UL) | |
| #endif | |
| #if ((BSC_PSR_Val & 0x07) == 0) | |
| #define __HCLK (__MASTERCLK / 1) | |
| #elif ((BSC_PSR_Val & 0x07) == 1) | |
| #define __HCLK (__MASTERCLK / 2) | |
| #elif ((BSC_PSR_Val & 0x07) == 2) | |
| #define __HCLK (__MASTERCLK / 3) | |
| #elif ((BSC_PSR_Val & 0x07) == 3) | |
| #define __HCLK (__MASTERCLK / 4) | |
| #elif ((BSC_PSR_Val & 0x07) == 4) | |
| #define __HCLK (__MASTERCLK / 6) | |
| #elif ((BSC_PSR_Val & 0x07) == 5) | |
| #define __HCLK (__MASTERCLK / 8) | |
| #elif ((BSC_PSR_Val & 0x07) == 6) | |
| #define __HCLK (__MASTERCLK /16) | |
| #else | |
| #define __HCLK (0UL) | |
| #endif | |
| /*---------------------------------------------------------------------------- | |
| Clock Variable definitions | |
| *----------------------------------------------------------------------------*/ | |
| uint32_t SystemCoreClock = __HCLK; /*!< System Clock Frequency (Core Clock)*/ | |
| /** | |
| * Retrieve the system core clock | |
| * | |
| * @param none | |
| * @return none | |
| * | |
| * @brief retrieve system core clock from register settings. | |
| */ | |
| void SystemCoreClockUpdate (void) { | |
| uint32_t masterClk; | |
| uint32_t u32RegisterRead; | |
| switch ((FM3_CRG->SCM_CTL >> 5) & 0x07) { | |
| case 0: /* internal High-speed Cr osc. */ | |
| masterClk = __CLKHC; | |
| break; | |
| case 1: /* external main osc. */ | |
| masterClk = __CLKMO; | |
| break; | |
| case 2: /* PLL clock */ | |
| u32RegisterRead = (__CLKMO * (((FM3_CRG->PLL_CTL2) & 0x1F) + 1)); | |
| masterClk = (u32RegisterRead / (((FM3_CRG->PLL_CTL1 >> 4) & 0x0F) + 1)); | |
| break; | |
| case 4: /* internal Low-speed CR osc. */ | |
| masterClk = __CLKLC; | |
| break; | |
| case 5: /* external Sub osc. */ | |
| masterClk = __CLKSO; | |
| break; | |
| default: | |
| masterClk = 0Ul; | |
| break; | |
| } | |
| switch (FM3_CRG->BSC_PSR & 0x07) { | |
| case 0: | |
| SystemCoreClock = masterClk; | |
| break; | |
| case 1: | |
| SystemCoreClock = masterClk / 2; | |
| break; | |
| case 2: | |
| SystemCoreClock = masterClk / 3; | |
| break; | |
| case 3: | |
| SystemCoreClock = masterClk / 4; | |
| break; | |
| case 4: | |
| SystemCoreClock = masterClk / 6; | |
| break; | |
| case 5: | |
| SystemCoreClock = masterClk /8; | |
| break; | |
| case 6: | |
| SystemCoreClock = masterClk /16; | |
| break; | |
| default: | |
| SystemCoreClock = 0Ul; | |
| break; | |
| } | |
| } | |
| /* | |
| * Set CR Trimming Data | |
| * | |
| * @param none | |
| * @return none | |
| * | |
| * @brief Update CR trimming with Flash | |
| * trimming data. | |
| */ | |
| static void CrtrimSet(void) | |
| { | |
| /* CR Trimming Data */ | |
| if( 0x000003FF != (FM3_FLASH_IF->CRTRMM & 0x000003FF) ) | |
| { | |
| /* UnLock (MCR_FTRM) */ | |
| FM3_CRTRIM->MCR_RLR = 0x1ACCE554; | |
| /* Set MCR_FTRM */ | |
| FM3_CRTRIM->MCR_FTRM = FM3_FLASH_IF->CRTRMM; | |
| /* Lock (MCR_FTRM) */ | |
| FM3_CRTRIM->MCR_RLR = 0x00000000; | |
| } | |
| } | |
| /** | |
| * Initialize the system | |
| * | |
| * @param none | |
| * @return none | |
| * | |
| * @brief Setup the microcontroller system. | |
| * Initialize the System. | |
| */ | |
| void SystemInit (void) { | |
| uint32_t u32RegisterRead; | |
| #if (HWWD_DISABLE) /* HW Watchdog Disable */ | |
| FM3_HWWDT->WDG_LCK = 0x1ACCE551; /* HW Watchdog Unlock */ | |
| FM3_HWWDT->WDG_LCK = 0xE5331AAE; | |
| FM3_HWWDT->WDG_CTL = 0; /* HW Watchdog stop */ | |
| #endif | |
| #if (CLOCK_SETUP) /* Clock Setup */ | |
| FM3_CRG->BSC_PSR = BSC_PSR_Val; /* set System Clock presacaler */ | |
| FM3_CRG->APBC0_PSR = APBC0_PSR_Val; /* set APB0 presacaler */ | |
| FM3_CRG->APBC1_PSR = APBC1_PSR_Val; /* set APB1 presacaler */ | |
| FM3_CRG->APBC2_PSR = APBC2_PSR_Val; /* set APB2 presacaler */ | |
| FM3_CRG->SWC_PSR = SWC_PSR_Val | (1UL << 7); /* set SW Watchdog presacaler */ | |
| FM3_CRG->TTC_PSR = TTC_PSR_Val; /* set Trace Clock presacaler */ | |
| FM3_CRG->CSW_TMR = CSW_TMR_Val; /* set oscillation stabilization wait time */ | |
| if (SCM_CTL_Val & (1UL << 1)) { /* Main clock oscillator enabled ? */ | |
| FM3_CRG->SCM_CTL |= (1UL << 1); /* enable main oscillator */ | |
| while (!(FM3_CRG->SCM_STR & (1UL << 1))); /* wait for Main clock oscillation stable */ | |
| } | |
| if (SCM_CTL_Val & (1UL << 3)) { /* Sub clock oscillator enabled ? */ | |
| FM3_CRG->SCM_CTL |= (1UL << 3); /* enable sub oscillator */ | |
| while (!(FM3_CRG->SCM_STR & (1UL << 3))); /* wait for Sub clock oscillation stable */ | |
| } | |
| FM3_CRG->PSW_TMR = PSW_TMR_Val; /* set PLL stabilization wait time */ | |
| FM3_CRG->PLL_CTL1 = PLL_CTL1_Val; /* set PLLM and PLLK */ | |
| FM3_CRG->PLL_CTL2 = PLL_CTL2_Val; /* set PLLN */ | |
| if (SCM_CTL_Val & (1UL << 4)) { /* PLL enabled ? */ | |
| FM3_CRG->SCM_CTL |= (1UL << 4); /* enable PLL */ | |
| while (!(FM3_CRG->SCM_STR & (1UL << 4))); /* wait for PLL stable */ | |
| } | |
| FM3_CRG->SCM_CTL |= (SCM_CTL_Val & 0xE0); /* Set Master Clock switch */ | |
| do | |
| { | |
| u32RegisterRead = (FM3_CRG->SCM_CTL & 0xE0); | |
| }while ((FM3_CRG->SCM_STR & 0xE0) != u32RegisterRead); | |
| #endif | |
| CrtrimSet(); | |
| } | |