123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- /***********************************************************************************************************************
- * DISCLAIMER
- * This software is supplied by Renesas Electronics Corporation and is only intended for use with Renesas products. No
- * other uses are authorized. This software is owned by Renesas Electronics Corporation and is protected under all
- * applicable laws, including copyright laws.
- * THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
- * THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. TO THE MAXIMUM
- * EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES
- * SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR ANY REASON RELATED TO THIS
- * SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- * Renesas reserves the right, without notice, to make changes to this software and to discontinue the availability of
- * this software. By using this software, you agree to the additional terms and conditions found by accessing the
- * following link:
- * http://www.renesas.com/disclaimer
- *
- * Copyright (C) 2016 Renesas Electronics Corporation. All rights reserved.
- ***********************************************************************************************************************/
- /***********************************************************************************************************************
- * File Name : mcu_clocks.c
- * Description : Contains clock specific routines
- ***********************************************************************************************************************/
- /**********************************************************************************************************************
- * History : DD.MM.YYYY Version Description
- * : 01.10.2016 1.00 First Release
- * : 27.07.2018 1.01 Modified the comment of get_iclk_freq_hz.
- ***********************************************************************************************************************/
- /***********************************************************************************************************************
- Includes <System Includes> , "Project Includes"
- ***********************************************************************************************************************/
- #include "platform.h"
- /***********************************************************************************************************************
- Macro definitions
- ***********************************************************************************************************************/
- #define CKSEL_LOCO 0X0 // SCKCR3.CKSEL register setting for LOCO
- #define CKSEL_HOCO 0X1 // SCKCR3.CKSEL register setting for HOCO
- #define CKSEL_MAIN_OSC 0X2 // SCKCR3.CKSEL register setting for MAIN OSC
- #define CKSEL_SUBCLOCK 0X3 // SCKCR3.CKSEL register setting for SUB-CLOCK OSC
- #define CKSEL_PLL 0X4 // SCKCR3.CKSEL register setting for PLL
- /***********************************************************************************************************************
- Typedef definitions
- ***********************************************************************************************************************/
- /***********************************************************************************************************************
- Exported global variables (to be accessed by other files)
- ***********************************************************************************************************************/
- /***********************************************************************************************************************
- Private global variables and functions
- ***********************************************************************************************************************/
- /***********************************************************************************************************************
- * Function Name: get_iclk_freq_hz
- * Description : Return the current ICLK frequency in Hz. Called by R_BSP_GetIClkFreqHz().
- *
- * The system clock source can be changed at any time via SYSTEM.SCKCR3.BIT.CKSEL, so in order to
- * determine the ICLK frequency we need to first find the current system clock source and then,
- * in some cases where the clock source can be configured for multiple frequencies, calculate the
- * frequency at which it is currently running.
- *
- * Arguments : None
- *
- * Return Value : uint32_t - the iclk frequency in Hz
- *
- ***********************************************************************************************************************/
- uint32_t get_iclk_freq_hz(void)
- {
- #define NORMALIZE_X10 10 // used to avoid floating point arithmetic
- uint32_t sysClockSrcFreq;
- uint32_t pll_multiplier;
- uint32_t pll_source_freq;
- uint32_t hoco_frequency[3] = {16000000, 18000000, 20000000}; // 16/18/20 MHz
- uint8_t cksel = (uint8_t)SYSTEM.SCKCR3.BIT.CKSEL; // Read the system clock select value
- switch (cksel)
- {
- case CKSEL_LOCO:
- sysClockSrcFreq = BSP_LOCO_HZ;
- break;
- case CKSEL_HOCO:
- sysClockSrcFreq = hoco_frequency[SYSTEM.HOCOCR2.BIT.HCFRQ];
- break;
- case CKSEL_MAIN_OSC:
- sysClockSrcFreq = BSP_CFG_XTAL_HZ;
- break;
- case CKSEL_SUBCLOCK:
- sysClockSrcFreq = BSP_SUB_CLOCK_HZ;
- break;
- case CKSEL_PLL:
- /* The RX65N have two possible sources for the PLL */
- /* (The cast to uint32_t is for GNURX's -Wconversion or -Wsign-conversion and other two casts are the same) */
- pll_multiplier = ((((uint32_t)(SYSTEM.PLLCR.BIT.STC + 1)) * NORMALIZE_X10) / 2);
- pll_source_freq = BSP_CFG_XTAL_HZ; // Default to the MAIN OSC as the PLL source
- if (SYSTEM.PLLCR.BIT.PLLSRCSEL == 0x1) // If 1 then the HOCO is the PLL source
- {
- pll_source_freq = hoco_frequency[SYSTEM.HOCOCR2.BIT.HCFRQ];
- }
- sysClockSrcFreq = ((pll_source_freq / (((uint32_t)(SYSTEM.PLLCR.BIT.PLIDIV + 1)) * NORMALIZE_X10)) * pll_multiplier);
- break;
- default:
- sysClockSrcFreq = BSP_CFG_XTAL_HZ; // Should never arrive here. Use the Main OSC freq as a default...
- }
- /* Finally, divide the system clock source frequency by the currently set ICLK divider to get the ICLK frequency */
- return (sysClockSrcFreq / (uint32_t)(1 << SYSTEM.SCKCR.BIT.ICK));
- }
|