123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- /************************************************************************/
- /* (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 "board.h"
- /** \file system_mb9bf61x.c
- **
- ** FM3 system initialization functions
- ** All adjustments can be done in belonging header file.
- **
- ** History:
- ** 2011-07-07 V1.0 MWi original version
- ******************************************************************************/
- /**
- ******************************************************************************
- ** System Clock Frequency (Core Clock) Variable according CMSIS
- ******************************************************************************/
- uint32_t SystemCoreClock = __HCLK;
- /**
- ******************************************************************************
- ** \brief Update the System Core Clock with current core Clock retrieved from
- ** cpu registers.
- ** \param none
- ** \return none
- ******************************************************************************/
- void SystemCoreClockUpdate (void) {
- uint32_t masterClk;
- uint32_t u32RegisterRead; // Workaround variable for MISRA C rule conformance
- 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 */
- // Workaround for preventing MISRA C:1998 Rule 46 (MISRA C:2004 Rule 12.2)
- // violation:
- // "Unordered accesses to a volatile location"
- 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;
- }
- }
- /**
- ******************************************************************************
- ** \brief Setup the microcontroller system. Initialize the System and update
- ** the SystemCoreClock variable.
- **
- ** \param none
- ** \return none
- ******************************************************************************/
- void SystemInit (void) {
- static uint32_t u32IoRegisterRead; // Workaround variable for MISRA C rule conformance
- #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 */
- {
- volatile unsigned int i;
- for(i=0;i<200000;i++);
- }
- // Workaround for preventing MISRA C:1998 Rule 46 (MISRA C:2004 Rule 12.2)
- // violations:
- // "Unordered reads and writes to or from same location" and
- // "Unordered accesses to a volatile location"
- do
- {
- u32IoRegisterRead = (FM3_CRG->SCM_CTL & 0xE0);
- }while ((FM3_CRG->SCM_STR & 0xE0) != u32IoRegisterRead);
- #endif // (CLOCK_SETUP)
- #if (CR_TRIM_SETUP)
- /* 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;
- }
- #endif // (CR_TRIM_SETUP)
- }
|