/** ****************************************************************************** * @file fm33a0xxev_pmu.c * @author FM33A0XXEV Application Team * @version V1.0.0 * @date 16-April-2020 * @brief This file provides firmware functions to manage the following * functionalities of....: * */ /* Includes ------------------------------------------------------------------*/ #include "fm33a0xxev_pmu.h" /** @addtogroup fm33a0xxev_StdPeriph_Driver * @{ */ /** @defgroup PMU * @brief PMU driver modules * @{ */ /* LDO15ʹÄܱê־λ 1£ºLDO15´¦ÓÚ¹¤×÷״̬ 0£ºLDO15±»¹Ø±Õ Ïà¹Øº¯Êý */ FlagStatus PMU_CR_LDO15EN_Chk(void) { if (PMU->CR & PMU_CR_LDO15EN_Msk) { return SET; } else { return RESET; } } /* LDO15ʹÄܱêÖ¾·´ÂëУÑéλ Ïà¹Øº¯Êý */ FlagStatus PMU_CR_LDO15EN_B_Chk(void) { if (PMU->CR & PMU_CR_LDO15EN_B_Msk) { return SET; } else { return RESET; } } /* Sleep/DeepSleep»½ÐѺóµÄϵͳƵÂÊ 00£ºRCHF-8MHz 01£ºRCHF-16MHz 10£ºRCHF-24MHz 11£ºRCHF-32MHz Ïà¹Øº¯Êý */ void PMU_CR_WKFSEL_Set(uint32_t SetValue) { uint32_t tmpreg; tmpreg = PMU->CR; tmpreg &= ~(PMU_CR_WKFSEL_Msk); tmpreg |= (SetValue & PMU_CR_WKFSEL_Msk); PMU->CR = tmpreg; } uint32_t PMU_CR_WKFSEL_Get(void) { return (PMU->CR & PMU_CR_WKFSEL_Msk); } /* DeepSleep¿ØÖƼĴæÆ÷ 1£ºDeepSleepģʽʹÄÜ£¬Ï¹رջù×¼µçѹԴ 0£º³£¹æSleepģʽ ÔÚSleepÏ£¬Èç¹ûÖÃλÁËSLPDPλ¼´ÎªDeepSleepģʽ£» ¸Ãλ½öÔÚSleepÏÂÓÐЧ Ïà¹Øº¯Êý */ void PMU_CR_SLPDP_Set(uint32_t SetValue) { uint32_t tmpreg; tmpreg = PMU->CR; tmpreg &= ~(PMU_CR_SLPDP_Msk); tmpreg |= (SetValue & PMU_CR_SLPDP_Msk); PMU->CR = tmpreg; } uint32_t PMU_CR_SLPDP_Get(void) { return (PMU->CR & PMU_CR_SLPDP_Msk); } /* CoreVoltageScalingÅäÖà 0£ºµÍ¹¦ºÄģʽϲ»Ê¹ÄÜÄں˵çѹµ÷Õû 1£ºµÍ¹¦ºÄģʽϽµµÍÄں˵çѹ ¸Ãλ½öÔÚSleep/DeepSleep/RTCBKPģʽÏÂÆð×÷Óà Ïà¹Øº¯Êý */ void PMU_CR_CVS_Set(uint32_t SetValue) { uint32_t tmpreg; tmpreg = PMU->CR; tmpreg &= ~(PMU_CR_CVS_Msk); tmpreg |= (SetValue & PMU_CR_CVS_Msk); PMU->CR = tmpreg; } uint32_t PMU_CR_CVS_Get(void) { return (PMU->CR & PMU_CR_CVS_Msk); } /* µÍ¹¦ºÄģʽÅäÖüĴæÆ÷ 00£ºActive mode / LP Active mode 01£ºLPRUN mode 10£ºSleep mode / DeepSleep mode 11£ºRTCBKP mode Ïà¹Øº¯Êý */ void PMU_CR_PMOD_Set(uint32_t SetValue) { uint32_t tmpreg; tmpreg = PMU->CR; tmpreg &= ~(PMU_CR_PMOD_Msk); tmpreg |= (SetValue & PMU_CR_PMOD_Msk); PMU->CR = tmpreg; } uint32_t PMU_CR_PMOD_Get(void) { return (PMU->CR & PMU_CR_PMOD_Msk); } /* Flash Stop»½ÐÑ¿ØÖÆ 0£ºStopÐźŵȴýʱÖÓ½¨Á¢ºóͬ²½ÇåÁã 1£ºStopÐźÅÒì²½ÇåÁã Ïà¹Øº¯Êý */ void PMU_WKTR_STPCLR_Set(uint32_t SetValue) { uint32_t tmpreg; tmpreg = PMU->WKTR; tmpreg &= ~(PMU_WKTR_STPCLR_Msk); tmpreg |= (SetValue & PMU_WKTR_STPCLR_Msk); PMU->WKTR = tmpreg; } uint32_t PMU_WKTR_STPCLR_Get(void) { return (PMU->WKTR & PMU_WKTR_STPCLR_Msk); } /* ¿É±à³Ì¶îÍ⻽ÐÑÑÓ³Ù ÔÚDeepSleepģʽÏ£¬RCHFʱÖÓµ½À´ºó£¬¸ù¾Ý´Ë¼Ä´æÆ÷ÅäÖõȴý¶îÍâÑÓ³Ùʱ¼äºó£¬ÔÙ¶ÁÈ¡FlashУÑé×Ö 00£º0us 01£º2us 10£º4us 11£º8us Ïà¹Øº¯Êý */ void PMU_WKTR_T1A_Set(uint32_t SetValue) { uint32_t tmpreg; tmpreg = PMU->WKTR; tmpreg &= ~(PMU_WKTR_T1A_Msk); tmpreg |= (SetValue & PMU_WKTR_T1A_Msk); PMU->WKTR = tmpreg; } uint32_t PMU_WKTR_T1A_Get(void) { return (PMU->WKTR & PMU_WKTR_T1A_Msk); } /* ADCÖжϻ½ÐѱêÖ¾£¬Öжϳ·ÏúʱӲ¼þ×Ô¶¯ÇåÁã Ïà¹Øº¯Êý */ FlagStatus PMU_WKFR_ADCWKF_Chk(void) { if (PMU->WKFR & PMU_WKFR_ADCWKF_Msk) { return SET; } else { return RESET; } } /* RTCÖжϻ½ÐѱêÖ¾£¬Öжϳ·ÏúʱӲ¼þ×Ô¶¯ÇåÁã Ïà¹Øº¯Êý */ FlagStatus PMU_WKFR_RTCWKF_Chk(void) { if (PMU->WKFR & PMU_WKFR_RTCWKF_Msk) { return SET; } else { return RESET; } } /* SVDÖжϻ½ÐѱêÖ¾£¬Öжϳ·ÏúʱӲ¼þ×Ô¶¯ÇåÁã Ïà¹Øº¯Êý */ FlagStatus PMU_WKFR_SVDWKF_Chk(void) { if (PMU->WKFR & PMU_WKFR_SVDWKF_Msk) { return SET; } else { return RESET; } } /* 32768Hz¾§ÌåÍ£ÕñÖжϻ½ÐѱêÖ¾£¬Öжϳ·ÏúʱӲ¼þ×Ô¶¯ÇåÁã Ïà¹Øº¯Êý */ FlagStatus PMU_WKFR_LFDETWKF_Chk(void) { if (PMU->WKFR & PMU_WKFR_LFDETWKF_Msk) { return SET; } else { return RESET; } } /* IOÖжϻ½ÐѱêÖ¾£¬Öжϳ·ÏúʱӲ¼þ×Ô¶¯ÇåÁã Ïà¹Øº¯Êý */ FlagStatus PMU_WKFR_IOWKF_Chk(void) { if (PMU->WKFR & PMU_WKFR_IOWKF_Msk) { return SET; } else { return RESET; } } /* LPUART1Öжϻ½ÐѱêÖ¾£¬Öжϳ·ÏúʱӲ¼þ×Ô¶¯ÇåÁã Ïà¹Øº¯Êý */ FlagStatus PMU_WKFR_LPU1WKF_Chk(void) { if (PMU->WKFR & PMU_WKFR_LPU1WKF_Msk) { return SET; } else { return RESET; } } /* LPUART0Öжϻ½ÐѱêÖ¾£¬Öжϳ·ÏúʱӲ¼þ×Ô¶¯ÇåÁã Ïà¹Øº¯Êý */ FlagStatus PMU_WKFR_LPU0WKF_Chk(void) { if (PMU->WKFR & PMU_WKFR_LPU0WKF_Msk) { return SET; } else { return RESET; } } /* ±È½ÏÆ÷out-of-window»½ÐѱêÖ¾£¬Öжϳ·ÏúʱӲ¼þ×Ô¶¯ÇåÁã Ïà¹Øº¯Êý */ FlagStatus PMU_WKFR_COMP_OOWF_Chk(void) { if (PMU->WKFR & PMU_WKFR_COMP_OOWF_Msk) { return SET; } else { return RESET; } } /* ±È½ÏÆ÷window»½ÐѱêÖ¾£¬Öжϳ·ÏúʱӲ¼þ×Ô¶¯ÇåÁã Ïà¹Øº¯Êý */ FlagStatus PMU_WKFR_COMP_WINF_Chk(void) { if (PMU->WKFR & PMU_WKFR_COMP_WINF_Msk) { return SET; } else { return RESET; } } /* ±È½ÏÆ÷2Öжϻ½ÐѱêÖ¾£¬Öжϳ·ÏúʱӲ¼þ×Ô¶¯ÇåÁã Ïà¹Øº¯Êý */ FlagStatus PMU_WKFR_COMP2WKF_Chk(void) { if (PMU->WKFR & PMU_WKFR_COMP2WKF_Msk) { return SET; } else { return RESET; } } /* ±È½ÏÆ÷1Öжϻ½ÐѱêÖ¾£¬Öжϳ·ÏúʱӲ¼þ×Ô¶¯ÇåÁã Ïà¹Øº¯Êý */ FlagStatus PMU_WKFR_COMP1WKF_Chk(void) { if (PMU->WKFR & PMU_WKFR_COMP1WKF_Msk) { return SET; } else { return RESET; } } /* _32Öжϻ½ÐѱêÖ¾£¬Öжϳ·ÏúʱӲ¼þ×Ô¶¯ÇåÁã Ïà¹Øº¯Êý */ FlagStatus PMU_WKFR_LPTWKF_Chk(void) { if (PMU->WKFR & PMU_WKFR_LPTWKF_Msk) { return SET; } else { return RESET; } } /* BSTIM32Öжϻ½ÐѱêÖ¾£¬Öжϳ·ÏúʱӲ¼þ×Ô¶¯ÇåÁã Ïà¹Øº¯Êý */ FlagStatus PMU_WKFR_BSTWKF_Chk(void) { if (PMU->WKFR & PMU_WKFR_BSTWKF_Msk) { return SET; } else { return RESET; } } /* CPU Debugger»½ÐѱêÖ¾£¬Èí¼þд1ÇåÁã Ïà¹Øº¯Êý */ void PMU_WKFR_DBGWKF_Clr(void) { PMU->WKFR = PMU_WKFR_DBGWKF_Msk; } FlagStatus PMU_WKFR_DBGWKF_Chk(void) { if (PMU->WKFR & PMU_WKFR_DBGWKF_Msk) { return SET; } else { return RESET; } } /* SLEEP´íÎóÖжÏʹÄÜ (Sleep mode Error Interrupt Enable) 1£ºÊ¹ÄÜSLEEP´íÎóÖÐ¶Ï 0£º½ûÖ¹SLEEP´íÎóÖÐ¶Ï Ïà¹Øº¯Êý */ void PMU_IER_SLPEIE_Setable(FunState NewState) { if (NewState == ENABLE) { PMU->IER |= (PMU_IER_SLPEIE_Msk); } else { PMU->IER &= ~(PMU_IER_SLPEIE_Msk); } } FunState PMU_IER_SLPEIE_Getable(void) { if (PMU->IER & (PMU_IER_SLPEIE_Msk)) { return ENABLE; } else { return DISABLE; } } /* RTCBKP´íÎóÖжÏʹÄÜ(RTCBKP mode Error Interrupt Enable) 1£ºÊ¹ÄÜRTCBKP´íÎóÖÐ¶Ï 0£º½ûÖ¹RTCBKP´íÎóÖÐ¶Ï Ïà¹Øº¯Êý */ void PMU_IER_RTCEIE_Setable(FunState NewState) { if (NewState == ENABLE) { PMU->IER |= (PMU_IER_RTCEIE_Msk); } else { PMU->IER &= ~(PMU_IER_RTCEIE_Msk); } } FunState PMU_IER_RTCEIE_Getable(void) { if (PMU->IER & (PMU_IER_RTCEIE_Msk)) { return ENABLE; } else { return DISABLE; } } /* SLEEP´íÎóÖжϱêÖ¾£¬Ó²¼þÖÃ룬Èí¼þд1ÇåÁã (Sleep Error Interrupt Flag, write 1 to clear) 1£ºÔÚPMOD=2¡¯h2ºó£¬CPUÖ´ÐÐWFI/WFEÖ¸ÁîǰÖÃλÁËSLEEPDEEP¼Ä´æÆ÷ʱÖÃλ 0£ºÔÚPMOD=2¡¯h2ºó£¬CPUÕýÈ·½øÈëSLEEP Ïà¹Øº¯Êý */ void PMU_ISR_SLPEIF_Clr(void) { PMU->ISR = PMU_ISR_SLPEIF_Msk; } FlagStatus PMU_ISR_SLPEIF_Chk(void) { if (PMU->ISR & PMU_ISR_SLPEIF_Msk) { return SET; } else { return RESET; } } /* RTCBKP´íÎóÖжϱêÖ¾£¬Ó²¼þÖÃ룬Èí¼þд1ÇåÁã(RTC Error Interrupt Flag, write 1 to clear) 1£ºÔÚPMOD=2¡¯h3ºó£¬Î´¸ÄдCPUÄÚ²¿¼Ä´æÆ÷SLEEPDEEP=1£¬È»ºóÖ´ÐÐWFI/WFEÖ¸Á»òÕßϵͳʱÖÓÀ´×ÔUSB PHY£¬ÊÔͼ½øÈëRTCBKPģʽ 0£ºÔÚPMOD=2¡¯h3ºó£¬CPU×ÔÉíÕýÈ·½øÈëDEEP SLEEP Ïà¹Øº¯Êý */ void PMU_ISR_RTCEIF_Clr(void) { PMU->ISR = PMU_ISR_RTCEIF_Msk; } FlagStatus PMU_ISR_RTCEIF_Chk(void) { if (PMU->ISR & PMU_ISR_RTCEIF_Msk) { return SET; } else { return RESET; } } void PMU_Deinit(void) { //PMU->CR = 0x00020000; //PMU->WKTR = 0x00000001; //PMU->WKFR = 0x00000000; //PMU->IER = ; //PMU->ISR = ; } /******************************** Çå³ýNWKUPx Pin»½ÐѱêÖ¾º¯Êý ¹¦ÄÜ:Çå³ýNWKUPx Pin»½ÐѱêÖ¾£¬½öSleep/DeepSleepģʽÏÂÓÐЧ¡£ ÊäÈ룺ÉèÖÃNWKUPx Pin»½ÐѱêÖ¾µÄÉèÖÃÖµ£¬Ð´1. ********************************/ void PMU_WKFR_WKPxF_Clr(uint32_t NWKPinDef) { PMU->WKFR = NWKPinDef; } /******************************** ¶ÁÈ¡NWKUPx Pin»½ÐѱêÖ¾º¯Êý ¹¦ÄÜ:¶ÁÈ¡NWKUPx Pin»½ÐѱêÖ¾¡£ Êä³ö£ºNWKUPx Pin»½ÐѱêÖ¾µÄÖµ ********************************/ FlagStatus PMU_WKFR_WKPxF_Chk(uint32_t NWKPinDef) { if (PMU->WKFR & NWKPinDef) { return SET; } else { return RESET; } } /******************************** µÍ¹¦ºÄģʽµÄ³õʼ»¯º¯Êý ¹¦ÄÜ:µÍ¹¦ºÄģʽϸ÷ÖÖÉèÖã¬SLEEPģʽ£¬RAM±£³ÖÉèÖã¬Äں˵çѹ£¬¾§Õñµç·µÈ¡£ ÊäÈ룺µÍ¹¦ºÄ¹¦ÄÜ¿ªÆôǰµÄÉèÖÃ. ********************************/ void PMU_SleepCfg_Init(PMU_SleepCfg_InitTypeDef* SleepCfg_InitStruct) { PMU_CR_SLPDP_Set(SleepCfg_InitStruct->SLPDP); /*!CVS); /*!<Äں˵çѹ½µµÍʹÄÜ¿ØÖÆ */ if(SleepCfg_InitStruct->SLPDP == PMU_CR_SLPDP_DEEPSLEEP) { PMU_WKTR_T1A_Set(SleepCfg_InitStruct->TIA); } SCB->SCR = SleepCfg_InitStruct->SCR; /*!PMOD); /*!<µÍ¹¦ºÄģʽÅäÖà */ } /******END OF FILE****/