1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/cpu/kinetis/include/mcg.h
Karl Fessel 05f114d0af doc: fix unbalaced grouping
- most were trivial
    - missing group close or open
    - extra space
    - no doxygen comment
- name commad might open an implicit group
    this hould also be implicit cosed but does not happen somtimes
- crazy: internal declared groups have to be closed internal
2022-09-14 15:05:25 +02:00

176 lines
7.2 KiB
C

/*
* Copyright (C) 2015 PHYTEC Messtechnik GmbH
* Copyright (C) 2017 Eistec AB
*
* This file is subject to the terms and conditions of the GNU Lesser General
* Public License v2.1. See the file LICENSE in the top level directory for more
* details.
*/
/* please doxygen by hiding dangling references */
#if defined(MODULE_PERIPH_MCG) || defined(MODULE_PERIPH_MCG_LITE) || defined(DOXYGEN)
/**
* @defgroup cpu_kinetis_mcg Kinetis MCG
* @ingroup cpu_kinetis
* @brief Implementation of the Kinetis Multipurpose Clock Generator
* (MCG) driver
*
* Please add mcg.h in cpu_conf.h
* and MCG configuration to periph_conf.h
*
* The configuration consists of the clock_config struct
* (@ref clock_config_t) and two macros @ref CLOCK_CORECLOCK,
* @ref CLOCK_BUSCLOCK. The two macros are used by other periph
* driver configurations to tell the driver what value the module
* clock is running at.
*
* ### State transition map
*
* \dot
* digraph states {
* layout=dot
* nodesep=0.5
* {rank=same Reset [shape=none] FEI FEE}
* {rank=same FBI FBE}
* {rank=same BLPI BLPE}
* Reset -> FEI
* FEI -> FEE [dir="both"]
* FEI -> FBE [dir="both"]
* FEI -> FBI [dir="both"]
* FEE -> FBI [dir="both"]
* FEE -> FBE [dir="both"]
* FBI -> FBE [dir="both"]
* FBI -> BLPI [dir="both"]
* FBE -> BLPE [dir="both"]
* PBE
* PEE
* FBE -> PBE [dir="both"]
* BLPE -> PBE [dir="both"]
* PBE -> PEE [dir="both"]
* }
* \enddot
*
* The driver will automatically move step by step through the map
* if the requested mode is not a direct neighbor of the current mode.
*
* ### MCG Configuration Examples (for periph_conf.h) ###
*
* #### Example for PEE Mode with an 8 MHz crystal connected to XTAL0/EXTAL0
*
* The resulting PLL output frequency will be 60 MHz, the core will
* be running at the full PLL output frequency.
*
* static const clock_config_t clock_config = {
* // safe clock dividers for this CPU
* .clkdiv1 = SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV2(0) |
* SIM_CLKDIV1_OUTDIV3(1) | SIM_CLKDIV1_OUTDIV4(2),
* // Select default clocking mode
* .default_mode = KINETIS_MCG_MODE_PEE,
* // The crystal connected to OSC0 is 8 MHz
* .erc_range = KINETIS_MCG_ERC_RANGE_HIGH,
* .fcrdiv = 0, // Fast IRC divide by 1 => 4 MHz
* .oscsel = 0, // Use OSC0 for external clock
* .clc = 0, // Use external load caps on board
* .fll_frdiv = 0b011, // Divide by 256
* .fll_factor_fei = KINETIS_MCG_FLL_FACTOR_1920, // FLL freq = 60 MHz ?
* .fll_factor_fee = KINETIS_MCG_FLL_FACTOR_1920, // FLL freq = 60 MHz
* .pll_prdiv = 0b00011, // Divide by 4 => PLL input freq = 2 MHz
* .pll_vdiv = 0b00110, // Multiply by 30 => PLL output freq = 60 MHz
* .enable_oscillator = true, // Enable oscillator, EXTAL0 is connected to a crystal
* .select_fast_irc = true, // Use fast IRC when in FBI mode
* .enable_mcgirclk = false, // We don't need the internal reference clock while running in PEE mode
* };
* #define CLOCK_CORECLOCK (60000000ul)
* #define CLOCK_BUSCLOCK (CLOCK_CORECLOCK / 1)
*
* #### Example for FEE Mode, 32.768 kHz crystal connected to RTC
*
* The resulting FLL output frequency will be circa 72 MHz, the core
* will be running at the full FLL output frequency.
*
* static const clock_config_t clock_config = {
* // safe clock dividers for this CPU
* .clkdiv1 = SIM_CLKDIV1_OUTDIV1(0) | SIM_CLKDIV1_OUTDIV2(1) |
* SIM_CLKDIV1_OUTDIV2(1) | SIM_CLKDIV1_OUTDIV3(2),
* .default_mode = KINETIS_MCG_MODE_FEE,
* // The board has a 16 MHz crystal, though it is not used in this configuration
* .erc_range = KINETIS_MCG_ERC_RANGE_VERY_HIGH,
* .fcrdiv = 0, // Fast IRC divide by 1 => 4 MHz
* .oscsel = 1, // Use RTC for external clock
* .clc = 0b0001, // 16 pF capacitors yield ca 10 pF load capacitance
* .fll_frdiv = 0b000, // Divide by 1 => FLL input 32768 Hz
* .fll_factor_fei = KINETIS_MCG_FLL_FACTOR_1920, // FLL freq = 60 MHz ?
* .fll_factor_fee = KINETIS_MCG_FLL_FACTOR_2197, // FLL freq = 71.991296 MHz
* .pll_prdiv = 0b00111, // Divide by 8
* .pll_vdiv = 0b01100, // Multiply by 36 => PLL freq = 72 MHz
* .enable_oscillator = false, // OSC0 disabled
* .select_fast_irc = true, // Use fast IRC for internal reference clock
* .enable_mcgirclk = false, // We don't need the internal reference clock while running in FEE mode
* };
* #define CLOCK_CORECLOCK (71991296ul)
* #define CLOCK_BUSCLOCK (CLOCK_CORECLOCK / 2)
*
* @{
*
* @file
* @brief Interface definition for the Kinetis MCG driver.
*
* @author Johann Fischer <j.fischer@phytec.de>
* @author Joakim Nohlgård <joakim.nohlgard@eistec.se>
*/
#endif /* MODULE_PERIPH_MCG */
#ifndef MCG_H
#define MCG_H
#include "periph_conf.h"
#ifdef __cplusplus
extern "C"
{
#endif
#if DOXYGEN
/**
* @brief Core clock frequency, used by the ARM core and certain hardware modules in Kinetis CPUs
*
* The clock is derived from the MCG output clock divided by an integer divisor,
* which is controlled by the @ref clock_config_t::clkdiv1 settings
*/
#define CLOCK_CORECLOCK (MCGOUTCLK)
/**
* @brief Bus clock frequency, used by several hardware modules in Kinetis CPUs
*
* The clock is derived from the MCG output clock divided by an integer divisor,
* which is controlled by the @ref clock_config_t::clkdiv1 settings
*/
#define CLOCK_BUSCLOCK (CLOCK_CORECLOCK / x)
#endif
/**
* @brief Switch the MCG to the specified clocking mode
*
* Depending on the current clocking mode, this function may step through
* several other clocking modes in order to be able to reach the target mode.
*
* @param[in] mode Target mode
*
* @return 0 on success
* @return <0 on error
*/
int kinetis_mcg_set_mode(kinetis_mcg_mode_t mode);
/**
* @brief Initialize the MCG
*
* The configuration is found in the clock_config struct defined in periph_conf.h
*/
void kinetis_mcg_init(void);
#ifdef __cplusplus
}
#endif
#endif /* MCG_H */
/** @} */