blob: 414f5494229920ce4a74a4603ddf497e6678fbd8 [file] [log] [blame]
/************************************************************************/
/* (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();
}