| /* |
| * Copyright (c) 2016, Freescale Semiconductor, Inc. |
| * Copyright 2016-2017 NXP |
| * All rights reserved. |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| */ |
| #ifndef _FSL_MSMC_H_ |
| #define _FSL_MSMC_H_ |
| |
| #include "fsl_common.h" |
| |
| /*! @addtogroup msmc */ |
| /*! @{*/ |
| |
| /*! @file */ |
| |
| /******************************************************************************* |
| * Definitions |
| ******************************************************************************/ |
| |
| /*! @name Driver version */ |
| /*@{*/ |
| /*! @brief MSMC driver version 2.1.0. */ |
| #define FSL_MSMC_DRIVER_VERSION (MAKE_VERSION(2, 1, 0)) |
| /*@}*/ |
| |
| /*! |
| * @brief Power Modes Protection |
| */ |
| typedef enum _smc_power_mode_protection |
| { |
| kSMC_AllowPowerModeVlls = SMC_PMPROT_AVLLS_MASK, /*!< Allow Very-Low-Leakage Stop Mode. */ |
| kSMC_AllowPowerModeLls = SMC_PMPROT_ALLS_MASK, /*!< Allow Low-Leakage Stop Mode. */ |
| kSMC_AllowPowerModeVlp = SMC_PMPROT_AVLP_MASK, /*!< Allow Very-Low-Power Mode. */ |
| kSMC_AllowPowerModeHsrun = SMC_PMPROT_AHSRUN_MASK, /*!< Allow High Speed Run mode. */ |
| kSMC_AllowPowerModeAll = SMC_PMPROT_AVLLS_MASK | SMC_PMPROT_ALLS_MASK | SMC_PMPROT_AVLP_MASK | |
| SMC_PMPROT_AHSRUN_MASK /*!< Allow all power mode. */ |
| } smc_power_mode_protection_t; |
| |
| /*! |
| * @brief Power Modes in PMSTAT |
| */ |
| typedef enum _smc_power_state |
| { |
| kSMC_PowerStateRun = 1U, /*!< 0000_0001 - Current power mode is RUN */ |
| kSMC_PowerStateStop = 1U << 1U, /*!< 0000_0010 - Current power mode is any STOP mode */ |
| kSMC_PowerStateVlpr = 1U << 2U, /*!< 0000_0100 - Current power mode is VLPR */ |
| kSMC_PowerStateHsrun = 1U << 7U /*!< 1000_0000 - Current power mode is HSRUN */ |
| } smc_power_state_t; |
| |
| /*! |
| * @brief Power Stop Entry Status in PMSTAT |
| */ |
| typedef enum _smc_power_stop_entry_status |
| { |
| kSMC_PowerStopEntryAlt0 = 1U, /*!< Indicates a Stop mode entry since this field was last cleared. */ |
| kSMC_PowerStopEntryAlt1 = 1U << 1, /*!< Indicates the system bus masters acknowledged the Stop mode entry. */ |
| kSMC_PowerStopEntryAlt2 = 1U << 2, /*!< Indicates the system clock peripherals acknowledged the Stop mode entry. */ |
| kSMC_PowerStopEntryAlt3 = 1U << 3, /*!< Indicates the bus clock peripherals acknowledged the Stop mode entry. */ |
| kSMC_PowerStopEntryAlt4 = 1U << 4, /*!< Indicates the slow clock peripherals acknowledged the Stop mode entry. */ |
| kSMC_PowerStopEntryAlt5 = 1U << 5, /*!< Indicates Stop mode entry completed. */ |
| } smc_power_stop_entry_status_t; |
| |
| /*! |
| * @brief Run mode definition |
| */ |
| typedef enum _smc_run_mode |
| { |
| kSMC_RunNormal = 0U, /*!< normal RUN mode. */ |
| kSMC_RunVlpr = 2U, /*!< Very-Low-Power RUN mode. */ |
| kSMC_Hsrun = 3U /*!< High Speed Run mode (HSRUN). */ |
| } smc_run_mode_t; |
| |
| /*! |
| * @brief Stop mode definition |
| */ |
| typedef enum _smc_stop_mode |
| { |
| kSMC_StopNormal = 0U, /*!< Normal STOP mode. */ |
| kSMC_StopVlps = 2U, /*!< Very-Low-Power STOP mode. */ |
| kSMC_StopLls = 3U, /*!< Low-Leakage Stop mode. */ |
| #if (defined(FSL_FEATURE_SMC_HAS_SUB_STOP_MODE) && FSL_FEATURE_SMC_HAS_SUB_STOP_MODE) |
| #if (defined(FSL_FEATURE_SMC_HAS_STOP_SUBMODE2) && FSL_FEATURE_SMC_HAS_STOP_SUBMODE2) |
| kSMC_StopVlls2 = 4U, /*!< Very-Low-Leakage Stop mode, VLPS2/3. */ |
| #endif /* FSL_FEATURE_SMC_HAS_STOP_SUBMODE2 */ |
| #if (defined(FSL_FEATURE_SMC_HAS_STOP_SUBMODE0) && FSL_FEATURE_SMC_HAS_STOP_SUBMODE0) |
| kSMC_StopVlls0 = 6U, /*!< Very-Low-Leakage Stop mode, VLPS0/1. */ |
| #endif /* FSL_FEATURE_SMC_HAS_STOP_SUBMODE0 */ |
| #else |
| kSMC_StopVlls = 4U, /*!< Very-Low-Leakage Stop mode. */ |
| #endif /* FSL_FEATURE_SMC_HAS_SUB_STOP_MODE */ |
| } smc_stop_mode_t; |
| |
| /*! |
| * @brief Partial STOP option |
| */ |
| typedef enum _smc_partial_stop_mode |
| { |
| kSMC_PartialStop = 0U, /*!< STOP - Normal Stop mode*/ |
| kSMC_PartialStop1 = 1U, /*!< Partial Stop with both system and bus clocks disabled*/ |
| kSMC_PartialStop2 = 2U, /*!< Partial Stop with system clock disabled and bus clock enabled*/ |
| kSMC_PartialStop3 = 3U, /*!< Partial Stop with system clock enabled and bus clock disabled*/ |
| } smc_partial_stop_option_t; |
| |
| /*! |
| * @brief SMC configuration status |
| */ |
| enum _smc_status |
| { |
| kStatus_SMC_StopAbort = MAKE_STATUS(kStatusGroup_POWER, 0), /*!< Entering Stop mode is abort*/ |
| }; |
| |
| /*! |
| * @brief System Reset Source Name definitions |
| */ |
| typedef enum _smc_reset_source |
| { |
| kSMC_SourceWakeup = SMC_SRS_WAKEUP_MASK, /*!< Very low-leakage wakeup reset */ |
| kSMC_SourcePor = SMC_SRS_POR_MASK, /*!< Power on reset */ |
| kSMC_SourceLvd = SMC_SRS_LVD_MASK, /*!< Low-voltage detect reset */ |
| kSMC_SourceHvd = SMC_SRS_HVD_MASK, /*!< High-voltage detect reset */ |
| kSMC_SourceWarm = SMC_SRS_WARM_MASK, /*!< Warm reset. Warm Reset flag will assert if any of the system reset |
| sources in this register assert (SRS[31:8]) */ |
| kSMC_SourceFatal = SMC_SRS_FATAL_MASK, /*!< Fatal reset */ |
| kSMC_SourceCore = |
| SMC_SRS_CORE_MASK, /*!< Software reset that only reset the core, NOT a sticky system reset source. */ |
| kSMC_SourcePin = SMC_SRS_PIN_MASK, /*!< RESET_B pin reset. */ |
| kSMC_SourceMdm = SMC_SRS_MDM_MASK, /*!< MDM reset. */ |
| kSMC_SourceRstAck = SMC_SRS_RSTACK_MASK, /*!< Reset Controller timeout reset. */ |
| kSMC_SourceStopAck = SMC_SRS_STOPACK_MASK, /*!< Stop timeout reset */ |
| kSMC_SourceScg = SMC_SRS_SCG_MASK, /*!< SCG loss of lock or loss of clock */ |
| kSMC_SourceWdog = SMC_SRS_WDOG_MASK, /*!< Watchdog reset */ |
| kSMC_SourceSoftware = SMC_SRS_SW_MASK, /*!< Software reset */ |
| kSMC_SourceLockup = SMC_SRS_LOCKUP_MASK, /*!< Lockup reset. Core lockup or exception. */ |
| kSMC_SourceJtag = SMC_SRS_JTAG_MASK, /*!< JTAG system reset */ |
| #if (defined(FSL_FEATURE_SMC_HAS_SRS_SECVIO) && FSL_FEATURE_SMC_HAS_SRS_SECVIO) |
| kSMC_SourceSecVio = SMC_SRS_SECVIO_MASK, /*!< Security violation reset */ |
| #endif /* FSL_FEATURE_SMC_HAS_SRS_SECVIO */ |
| #if (defined(FSL_FEATURE_SMC_HAS_SRS_TAMPER) && FSL_FEATURE_SMC_HAS_SRS_TAMPER) |
| kSMC_SourceTamper = SMC_SRS_TAMPER_MASK, /*!< Tamper reset */ |
| #endif /* FSL_FEATURE_SMC_HAS_SRS_TAMPER */ |
| #if (defined(FSL_FEATURE_SMC_HAS_SRS_CORE0) && FSL_FEATURE_SMC_HAS_SRS_CORE0) |
| kSMC_SourceCore0 = SMC_SRS_CORE0_MASK, /*!< Core0 System Reset. */ |
| #endif /* FSL_FEATURE_SMC_HAS_SRS_CORE0 */ |
| #if (defined(FSL_FEATURE_SMC_HAS_SRS_CORE1) && FSL_FEATURE_SMC_HAS_SRS_CORE1) |
| kSMC_SourceCore1 = SMC_SRS_CORE1_MASK, /*!< Core1 System Reset. */ |
| #endif /* FSL_FEATURE_SMC_HAS_SRS_CORE1 */ |
| /* Source All. */ |
| kSMC_SourceAll = SMC_SRS_WAKEUP_MASK | SMC_SRS_POR_MASK | SMC_SRS_LVD_MASK | SMC_SRS_HVD_MASK | SMC_SRS_WARM_MASK | |
| SMC_SRS_FATAL_MASK | SMC_SRS_CORE_MASK | SMC_SRS_PIN_MASK | SMC_SRS_MDM_MASK | |
| SMC_SRS_RSTACK_MASK | SMC_SRS_STOPACK_MASK | SMC_SRS_SCG_MASK | SMC_SRS_WDOG_MASK | |
| SMC_SRS_SW_MASK | SMC_SRS_LOCKUP_MASK | SMC_SRS_JTAG_MASK |
| #if (defined(FSL_FEATURE_SMC_HAS_SRS_SECVIO) && FSL_FEATURE_SMC_HAS_SRS_SECVIO) |
| | |
| SMC_SRS_SECVIO_MASK |
| #endif /* FSL_FEATURE_SMC_HAS_SRS_SECVIO */ |
| #if (defined(FSL_FEATURE_SMC_HAS_SRS_TAMPER) && FSL_FEATURE_SMC_HAS_SRS_TAMPER) |
| | |
| SMC_SRS_TAMPER_MASK |
| #endif /* FSL_FEATURE_SMC_HAS_SRS_TAMPER */ |
| #if (defined(FSL_FEATURE_SMC_HAS_SRS_CORE0) && FSL_FEATURE_SMC_HAS_SRS_CORE0) |
| | |
| SMC_SRS_CORE0_MASK |
| #endif /* FSL_FEATURE_SMC_HAS_SRS_CORE0 */ |
| #if (defined(FSL_FEATURE_SMC_HAS_SRS_CORE1) && FSL_FEATURE_SMC_HAS_SRS_CORE1) |
| | |
| SMC_SRS_CORE1_MASK |
| #endif /* FSL_FEATURE_SMC_HAS_SRS_CORE1 */ |
| , |
| } smc_reset_source_t; |
| |
| /*! |
| * @brief System reset interrupt enable bit definitions. |
| */ |
| typedef enum _smc_interrupt_enable |
| { |
| kSMC_IntNone = 0U, /*!< No interrupt enabled. */ |
| kSMC_IntPin = SMC_SRIE_PIN_MASK, /*!< Pin reset interrupt. */ |
| kSMC_IntMdm = SMC_SRIE_MDM_MASK, /*!< MDM reset interrupt. */ |
| kSMC_IntStopAck = SMC_SRIE_STOPACK_MASK, /*!< Stop timeout reset interrupt. */ |
| kSMC_IntWdog = SMC_SRIE_WDOG_MASK, /*!< Watchdog interrupt. */ |
| kSMC_IntSoftware = SMC_SRIE_SW_MASK, /*!< Software reset interrupts. */ |
| kSMC_IntLockup = SMC_SRIE_LOCKUP_MASK, /*!< Lock up interrupt. */ |
| #if (defined(FSL_FEATURE_SMC_HAS_CSRE_CORE0) && FSL_FEATURE_SMC_HAS_CSRE_CORE0) |
| kSMC_IntCore0 = SMC_SRIE_CORE0_MASK, /*! Core 0 interrupts. */ |
| #endif /* FSL_FEATURE_SMC_HAS_CSRE_CORE0 */ |
| #if (defined(FSL_FEATURE_SMC_HAS_CSRE_CORE1) && FSL_FEATURE_SMC_HAS_CSRE_CORE1) |
| kSMC_IntCore1 = SMC_SRIE_CORE1_MASK, /*! Core 1 interrupts. */ |
| #endif /* FSL_FEATURE_SMC_HAS_CSRE_CORE1 */ |
| kSMC_IntAll = SMC_SRIE_PIN_MASK | /*!< All system reset interrupts. */ |
| SMC_SRIE_MDM_MASK | |
| SMC_SRIE_STOPACK_MASK | SMC_SRIE_WDOG_MASK | SMC_SRIE_SW_MASK | SMC_SRIE_LOCKUP_MASK |
| #if (defined(FSL_FEATURE_SMC_HAS_CSRE_CORE0) && FSL_FEATURE_SMC_HAS_CSRE_CORE0) |
| | |
| SMC_SRIE_CORE0_MASK |
| #endif /* FSL_FEATURE_SMC_HAS_CSRE_CORE0 */ |
| #if (defined(FSL_FEATURE_SMC_HAS_CSRE_CORE1) && FSL_FEATURE_SMC_HAS_CSRE_CORE1) |
| | |
| SMC_SRIE_CORE1_MASK |
| #endif /* FSL_FEATURE_SMC_HAS_CSRE_CORE1 */ |
| } smc_interrupt_enable_t; |
| |
| /*! |
| * @brief Reset pin filter configuration |
| */ |
| typedef struct _smc_reset_pin_filter_config |
| { |
| uint8_t slowClockFilterCount; /*!< Reset pin bus clock filter width from 1 to 32 slow clock cycles. */ |
| bool enableFilter; /*!< Reset pin filter enable/disable. */ |
| #if (defined(FSL_FEATURE_SMC_HAS_RPC_LPOFEN) && FSL_FEATURE_SMC_HAS_RPC_LPOFEN) |
| bool enableLpoFilter; /*!< LPO clock reset pin filter enabled in all modes. */ |
| #endif /* FSL_FEATURE_SMC_HAS_RPC_LPOFEN */ |
| } smc_reset_pin_filter_config_t; |
| |
| /******************************************************************************* |
| * API |
| ******************************************************************************/ |
| #if defined(__cplusplus) |
| extern "C" { |
| #endif /* __cplusplus*/ |
| |
| /*! @name System mode controller APIs*/ |
| /*@{*/ |
| |
| /*! |
| * @brief Configures all power mode protection settings. |
| * |
| * This function configures the power mode protection settings for |
| * supported power modes in the specified chip family. The available power modes |
| * are defined in the smc_power_mode_protection_t. This should be done at an early |
| * system level initialization stage. See the reference manual for details. |
| * This register can only write once after the power reset. |
| * |
| * The allowed modes are passed as bit map, for example, to allow LLS and VLLS, |
| * use SMC_SetPowerModeProtection(kSMC_AllowPowerModeLls | kSMC_AllowPowerModeVlls). |
| * To allow all modes, use SMC_SetPowerModeProtection(kSMC_AllowPowerModeAll). |
| * |
| * @param allowedModes Bitmap of the allowed power modes. |
| */ |
| static inline void SMC_SetPowerModeProtection(SMC_Type *base, uint8_t allowedModes) |
| { |
| base->PMPROT = allowedModes; |
| } |
| |
| /*! |
| * @brief Gets the current power mode status. |
| * |
| * This function returns the current power mode stat. Once application |
| * switches the power mode, it should always check the stat to check whether it |
| * runs into the specified mode or not. An application should check |
| * this mode before switching to a different mode. The system requires that |
| * only certain modes can switch to other specific modes. See the |
| * reference manual for details and the smc_power_state_t for information about |
| * the power stat. |
| * |
| * @param base SMC peripheral base address. |
| * @return Current power mode status. |
| */ |
| static inline smc_power_state_t SMC_GetPowerModeState(SMC_Type *base) |
| { |
| return (smc_power_state_t)((base->PMSTAT & SMC_PMSTAT_PMSTAT_MASK) >> SMC_PMSTAT_PMSTAT_SHIFT); |
| } |
| |
| #if (defined(FSL_FEATURE_SMC_HAS_PMSTAT_STOPSTAT) && FSL_FEATURE_SMC_HAS_PMSTAT_STOPSTAT) |
| /*! |
| * @brief Gets the result of the previous stop mode entry. |
| * |
| * This function returns the result of the previous stop mode entry. |
| * |
| * @param base SMC peripheral base address. |
| * @return Current power stop entry status. |
| */ |
| static inline smc_power_stop_entry_status_t SMC_GetStopEntryStatus(SMC_Type *base) |
| { |
| return (smc_power_stop_entry_status_t)((base->PMSTAT & SMC_PMSTAT_STOPSTAT_MASK) >> SMC_PMSTAT_STOPSTAT_SHIFT); |
| } |
| |
| /*! |
| * @brief Clears all the result of the previous stop mode entry. |
| * |
| * This function clears all the result of the previous stop mode entry. |
| * |
| * @param base SMC peripheral base address. |
| * @return Current power stop entry status. |
| */ |
| static inline void SMC_ClearStopEntryStatus(SMC_Type *base) |
| { |
| /* Only write 0x01 to clear this field, all other writes are ignored. */ |
| base->PMSTAT = (base->PMSTAT & ~SMC_PMSTAT_STOPSTAT_MASK) | SMC_PMSTAT_STOPSTAT(0x01); |
| } |
| |
| #endif /* FSL_FEATURE_SMC_HAS_PMSTAT_STOPSTAT */ |
| |
| /*! |
| * @brief Prepare to enter stop modes |
| * |
| * This function should be called before entering STOP/VLPS/LLS/VLLS modes. |
| */ |
| static inline void SMC_PreEnterStopModes(void) |
| { |
| __disable_irq(); |
| __ISB(); |
| } |
| |
| /*! |
| * @brief Recovering after wake up from stop modes |
| * |
| * This function should be called after wake up from STOP/VLPS/LLS/VLLS modes. |
| * It is used together with @ref SMC_PreEnterStopModes. |
| */ |
| static inline void SMC_PostExitStopModes(void) |
| { |
| __enable_irq(); |
| __ISB(); |
| } |
| |
| /*! |
| * @brief Prepare to enter wait modes |
| * |
| * This function should be called before entering WAIT/VLPW modes.. |
| */ |
| static inline void SMC_PreEnterWaitModes(void) |
| { |
| __disable_irq(); |
| __ISB(); |
| } |
| |
| /*! |
| * @brief Recovering after wake up from stop modes |
| * |
| * This function should be called after wake up from WAIT/VLPW modes. |
| * It is used together with @ref SMC_PreEnterWaitModes. |
| */ |
| static inline void SMC_PostExitWaitModes(void) |
| { |
| __enable_irq(); |
| __ISB(); |
| } |
| |
| /*! |
| * @brief Configure the system to RUN power mode. |
| * |
| * @param base SMC peripheral base address. |
| * @return SMC configuration error code. |
| */ |
| status_t SMC_SetPowerModeRun(SMC_Type *base); |
| |
| /*! |
| * @brief Configure the system to HSRUN power mode. |
| * |
| * @param base SMC peripheral base address. |
| * @return SMC configuration error code. |
| */ |
| status_t SMC_SetPowerModeHsrun(SMC_Type *base); |
| |
| /*! |
| * @brief Configure the system to WAIT power mode. |
| * |
| * @param base SMC peripheral base address. |
| * @return SMC configuration error code. |
| */ |
| status_t SMC_SetPowerModeWait(SMC_Type *base); |
| |
| /*! |
| * @brief Configure the system to Stop power mode. |
| * |
| * @param base SMC peripheral base address. |
| * @param option Partial Stop mode option. |
| * @return SMC configuration error code. |
| */ |
| status_t SMC_SetPowerModeStop(SMC_Type *base, smc_partial_stop_option_t option); |
| |
| /*! |
| * @brief Configure the system to VLPR power mode. |
| * |
| * @param base SMC peripheral base address. |
| * @return SMC configuration error code. |
| */ |
| status_t SMC_SetPowerModeVlpr(SMC_Type *base); |
| |
| /*! |
| * @brief Configure the system to VLPW power mode. |
| * |
| * @param base SMC peripheral base address. |
| * @return SMC configuration error code. |
| */ |
| status_t SMC_SetPowerModeVlpw(SMC_Type *base); |
| |
| /*! |
| * @brief Configure the system to VLPS power mode. |
| * |
| * @param base SMC peripheral base address. |
| * @return SMC configuration error code. |
| */ |
| status_t SMC_SetPowerModeVlps(SMC_Type *base); |
| /*! |
| * @brief Configure the system to LLS power mode. |
| * |
| * @param base SMC peripheral base address. |
| * @return SMC configuration error code. |
| */ |
| status_t SMC_SetPowerModeLls(SMC_Type *base); |
| |
| #if (defined(FSL_FEATURE_SMC_HAS_SUB_STOP_MODE) && FSL_FEATURE_SMC_HAS_SUB_STOP_MODE) |
| #if (defined(FSL_FEATURE_SMC_HAS_STOP_SUBMODE0) && FSL_FEATURE_SMC_HAS_STOP_SUBMODE0) |
| /*! |
| * @brief Configure the system to VLLS0 power mode. |
| * |
| * @param base SMC peripheral base address. |
| * @return SMC configuration error code. |
| */ |
| status_t SMC_SetPowerModeVlls0(SMC_Type *base); |
| #endif /* FSL_FEATURE_SMC_HAS_STOP_SUBMODE0 */ |
| #if (defined(FSL_FEATURE_SMC_HAS_STOP_SUBMODE2) && FSL_FEATURE_SMC_HAS_STOP_SUBMODE2) |
| /*! |
| * @brief Configure the system to VLLS2 power mode. |
| * |
| * @param base SMC peripheral base address. |
| * @return SMC configuration error code. |
| */ |
| status_t SMC_SetPowerModeVlls2(SMC_Type *base); |
| #endif /* FSL_FEATURE_SMC_HAS_STOP_SUBMODE2 */ |
| #else |
| /*! |
| * @brief Configure the system to VLLS power mode. |
| * |
| * @param base SMC peripheral base address. |
| * @return SMC configuration error code. |
| */ |
| status_t SMC_SetPowerModeVlls(SMC_Type *base); |
| #endif /* FSL_FEATURE_SMC_HAS_SUB_STOP_MODE */ |
| |
| /*! |
| * @brief Gets the reset source status which caused a previous reset. |
| * |
| * This function gets the current reset source status. Use source masks |
| * defined in the smc_reset_source_t to get the desired source status. |
| * |
| * Example: |
| @code |
| uint32_t resetStatus; |
| |
| // To get all reset source statuses. |
| resetStatus = SMC_GetPreviousResetSources(SMC0) & kSMC_SourceAll; |
| |
| // To test whether the MCU is reset using Watchdog. |
| resetStatus = SMC_GetPreviousResetSources(SMC0) & kSMC_SourceWdog; |
| |
| // To test multiple reset sources. |
| resetStatus = SMC_GetPreviousResetSources(SMC0) & (kSMC_SourceWdog | kSMC_SourcePin); |
| @endcode |
| * |
| * @param base SMC peripheral base address. |
| * @return All reset source status bit map. |
| */ |
| static inline uint32_t SMC_GetPreviousResetSources(SMC_Type *base) |
| { |
| return base->SRS; |
| } |
| |
| /*! |
| * @brief Gets the sticky reset source status. |
| * |
| * This function gets the current reset source status that has not been cleared |
| * by software for some specific source. |
| * |
| * Example: |
| @code |
| uint32_t resetStatus; |
| |
| // To get all reset source statuses. |
| resetStatus = SMC_GetStickyResetSources(SMC0) & kSMC_SourceAll; |
| |
| // To test whether the MCU is reset using Watchdog. |
| resetStatus = SMC_GetStickyResetSources(SMC0) & kSMC_SourceWdog; |
| |
| // To test multiple reset sources. |
| resetStatus = SMC_GetStickyResetSources(SMC0) & (kSMC_SourceWdog | kSMC_SourcePin); |
| @endcode |
| * |
| * @param base SMC peripheral base address. |
| * @return All reset source status bit map. |
| */ |
| static inline uint32_t SMC_GetStickyResetSources(SMC_Type *base) |
| { |
| return base->SSRS; |
| } |
| |
| /*! |
| * @brief Clears the sticky reset source status. |
| * |
| * This function clears the sticky system reset flags indicated by source masks. |
| * |
| * Example: |
| @code |
| // Clears multiple reset sources. |
| SMC_ClearStickyResetSources(SMC0, (kSMC_SourceWdog | kSMC_SourcePin)); |
| @endcode |
| * |
| * @param base SMC peripheral base address. |
| * @param sourceMasks reset source status bit map |
| */ |
| static inline void SMC_ClearStickyResetSources(SMC_Type *base, uint32_t sourceMasks) |
| { |
| base->SSRS = sourceMasks; |
| } |
| |
| /*! |
| * @brief Configures the reset pin filter. |
| * |
| * This function sets the reset pin filter including the enablement/disablement and filter width. |
| * |
| * @param base SMC peripheral base address. |
| * @param config Pointer to the configuration structure. |
| */ |
| void SMC_ConfigureResetPinFilter(SMC_Type *base, const smc_reset_pin_filter_config_t *config); |
| |
| /*! |
| * @brief Sets the system reset interrupt configuration. |
| * |
| * For a graceful shut down, the MSMC supports delaying the assertion of the system |
| * reset for a period of time when the reset interrupt is generated. This function |
| * can be used to enable the interrupt. |
| * The interrupts are passed in as bit mask. See smc_interrupt_enable_t for details. |
| * For example, to delay a reset after the WDOG timeout or PIN reset occurs, configure as follows: |
| * SMC_SetSystemResetInterruptConfig(SMC0, (kSMC_IntWdog | kSMC_IntPin)); |
| * |
| * @param base SMC peripheral base address. |
| * @param intMask Bit mask of the system reset interrupts to enable. See |
| * smc_interrupt_enable_t for details. |
| */ |
| static inline void SMC_SetSystemResetInterruptConfig(SMC_Type *base, uint32_t intMask) |
| { |
| base->SRIE = intMask; |
| } |
| |
| /*! |
| * @brief Gets the source status of the system reset interrupt. |
| * |
| * This function gets the source status of the reset interrupt. Use source masks |
| * defined in the smc_interrupt_enable_t to get the desired source status. |
| * |
| * Example: |
| @code |
| uint32_t interruptStatus; |
| |
| // To get all reset interrupt source statuses. |
| interruptStatus = SMC_GetResetInterruptSourcesStatus(SMC0) & kSMC_IntAll; |
| |
| // To test whether the reset interrupt of Watchdog is pending. |
| interruptStatus = SMC_GetResetInterruptSourcesStatus(SMC0) & kSMC_IntWdog; |
| |
| // To test multiple reset interrupt sources. |
| interruptStatus = SMC_GetResetInterruptSourcesStatus(SMC0) & (kSMC_IntWdog | kSMC_IntPin); |
| @endcode |
| * |
| * @param base SMC peripheral base address. |
| * @return All reset interrupt source status bit map. |
| */ |
| static inline uint32_t SMC_GetResetInterruptSourcesStatus(SMC_Type *base) |
| { |
| return base->SRIF; |
| } |
| |
| /*! |
| * @brief Clears the source status of the system reset interrupt. |
| * |
| * This function clears the source status of the reset interrupt. Use source masks |
| * defined in the smc_interrupt_enable_t to get the desired source status. |
| * |
| * Example: |
| @code |
| uint32_t interruptStatus; |
| |
| // To clear all reset interrupt source statuses. |
| MMC_ClearResetInterruptSourcesStatus(SMC0, kSMC_IntAll); |
| |
| // To clear the reset interrupt of Watchdog. |
| SMC_ClearResetInterruptSourcesStatus(SMC0, kSMC_IntWdog); |
| |
| // To clear multiple reset interrupt sources status. |
| SMC_ClearResetInterruptSourcesStatus(SMC0, (kSMC_IntWdog | kSMC_IntPin)); |
| @endcode |
| * |
| * @param base SMC peripheral base address. |
| * @param All reset interrupt source status bit map to clear. |
| */ |
| static inline void SMC_ClearResetInterruptSourcesStatus(SMC_Type *base, uint32_t intMask) |
| { |
| base->SRIF = intMask; |
| } |
| |
| #if (defined(FSL_FEATURE_SMC_HAS_CSRE) && FSL_FEATURE_SMC_HAS_CSRE) |
| /*! |
| * @brief Sets the core software reset feature configuration. |
| * |
| * The MSMC supports delaying the assertion of the system reset for a period of time while a core |
| * software reset is generated. This allows software to recover without reseting the entire system. |
| * This function can be used to enable/disable the core software reset feature. |
| * The interrupts are passed in as bit mask. See smc_interrupt_enable_t for details. |
| * For example, to delay a system after the WDOG timeout or PIN core software reset occurs, configure as follows: |
| * SMC_SetCoreSoftwareResetConfig(SMC0, (kSMC_IntWdog | kSMC_IntPin)); |
| * |
| * @param base SMC peripheral base address. |
| * @param intMask Bit mask of the core software reset to enable. See |
| * smc_interrupt_enable_t for details. |
| */ |
| static inline void SMC_SetCoreSoftwareResetConfig(SMC_Type *base, uint32_t intMask) |
| { |
| base->CSRE = intMask; |
| } |
| #endif /* FSL_FEATURE_SMC_HAS_CSRE */ |
| |
| /*! |
| * @brief Gets the boot option configuration. |
| * |
| * This function gets the boot option configuration of MSMC. |
| * |
| * @param base SMC peripheral base address. |
| * @return The boot option configuration. 1 means boot option enabled. 0 means not. |
| */ |
| static inline uint32_t SMC_GetBootOptionConfig(SMC_Type *base) |
| { |
| return base->MR; |
| } |
| |
| #if (defined(FSL_FEATURE_SMC_HAS_FM) && FSL_FEATURE_SMC_HAS_FM) |
| /*! |
| * @brief Sets the force boot option configuration. |
| * |
| * This function sets the focus boot option configuration of MSMC. It can force the corresponding |
| * boot option config to assert on next system reset. |
| * |
| * @param base SMC peripheral base address. |
| * @param val The boot option configuration for next system reset. 1 - boot option enabled. 0 - not. |
| */ |
| static inline void SMC_SetForceBootOptionConfig(SMC_Type *base, uint32_t val) |
| { |
| base->FM = val; |
| } |
| |
| #if (defined(FSL_FEATURE_SMC_HAS_SRAMLPR) && FSL_FEATURE_SMC_HAS_SRAMLPR) |
| /*! |
| * @brief Enables the conresponding SRAM array in low power retention mode. |
| * |
| * This function enables the conresponding SRAM array in low power retention mode. By default, the SRAM low pwer is |
| * disabled, and only in RUN mode. |
| * |
| * @param base SMC peripheral base address. |
| * @param arrayIdx Index of responding SRAM array. |
| * @param enable Enable the SRAM array in low power retention mode. |
| */ |
| static inline void SMC_SRAMEnableLowPowerMode(SMC_Type *base, uint32_t arrayIdx, bool enable) |
| { |
| if (enable) |
| { |
| base->SRAMLPR |= (1U << arrayIdx); /* Set to be placed in RUN modes. */ |
| } |
| else |
| { |
| base->SRAMLPR &= ~(1U << arrayIdx); /* Clear to be placed in low power retention mode. */ |
| } |
| } |
| #endif /* FSL_FEATURE_SMC_HAS_SRAMLPR */ |
| |
| #if (defined(FSL_FEATURE_SMC_HAS_SRAMDSR) && FSL_FEATURE_SMC_HAS_SRAMDSR) |
| /*! |
| * @brief Enables the conresponding SRAM array in STOP mode. |
| * |
| * This function enables the conresponding SRAM array in STOP modes. By default, the SRAM is retained in STOP modes. |
| * When disabled, the corresponding SRAM array is powered off in STOP modes. |
| * |
| * @param base SMC peripheral base address. |
| * @param arrayIdx Index of responding SRAM array. |
| * @param enable Enable the SRAM array in STOP modes. |
| */ |
| static inline void SMC_SRAMEnableDeepSleepMode(SMC_Type *base, uint32_t arrayIdx, bool enable) |
| { |
| if (enable) |
| { |
| base->SRAMDSR &= ~(1U << arrayIdx); /* Clear to be retained in STOP modes. */ |
| } |
| else |
| { |
| base->SRAMDSR |= (1U << arrayIdx); /* Set to be powered off in STOP modes. */ |
| } |
| } |
| #endif /* FSL_FEATURE_SMC_HAS_SRAMDSR */ |
| |
| #endif /* FSL_FEATURE_SMC_HAS_FM */ |
| |
| /*@}*/ |
| |
| #if defined(__cplusplus) |
| } |
| #endif /* __cplusplus*/ |
| |
| /*! @}*/ |
| |
| #endif /* _FSL_MSMC_H_ */ |