lib_pmu.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. /**
  2. ******************************************************************************
  3. * @file lib_pmu.h
  4. * @author Application Team
  5. * @version V1.1.0
  6. * @date 2019-10-28
  7. * @brief PMU library.
  8. ******************************************************************************
  9. * @attention
  10. *
  11. ******************************************************************************
  12. */
  13. #ifndef __LIB_PMU_H
  14. #define __LIB_PMU_H
  15. #ifdef __cplusplus
  16. extern "C" {
  17. #endif
  18. #include "target.h"
  19. /**
  20. * Deep-sleep low-power configuration
  21. */
  22. typedef struct
  23. {
  24. uint32_t COMP1Power; /* Comparator 1 power control */
  25. uint32_t COMP2Power; /* Comparator 2 power control */
  26. uint32_t TADCPower; /* Tiny ADC power control */
  27. uint32_t BGPPower; /* BGP power control */
  28. uint32_t AVCCPower; /* AVCC power control */
  29. // uint32_t LCDPower; /* LCD controller power control */
  30. uint32_t VDCINDetector; /* VDCIN detector control */
  31. uint32_t VDDDetector; /* VDD detector control */
  32. uint32_t AHBPeriphralDisable; /* AHB Periphral clock disable selection */
  33. uint32_t APBPeriphralDisable; /* APB Periphral clock disable selection */
  34. } PMU_LowPWRTypeDef;
  35. /************** Bits definition for ANA_REG8 register ******************/
  36. #define ANA_REG8_VDDPVDSEL_0 (0x0UL << ANA_REG8_VDDPVDSEL_Pos)
  37. #define ANA_REG8_VDDPVDSEL_1 (0x1UL << ANA_REG8_VDDPVDSEL_Pos)
  38. #define ANA_REG8_VDDPVDSEL_2 (0x2UL << ANA_REG8_VDDPVDSEL_Pos)
  39. #define ANA_REG8_VDDPVDSEL_3 (0x3UL << ANA_REG8_VDDPVDSEL_Pos)
  40. #define ANA_REG8_VDDPVDSEL_4 (0x4UL << ANA_REG8_VDDPVDSEL_Pos)
  41. #define ANA_REG8_VDDPVDSEL_5 (0x5UL << ANA_REG8_VDDPVDSEL_Pos)
  42. #define ANA_REG8_VDDPVDSEL_6 (0x6UL << ANA_REG8_VDDPVDSEL_Pos)
  43. #define ANA_REG8_VDDPVDSEL_7 (0x7UL << ANA_REG8_VDDPVDSEL_Pos)
  44. /****************************** PMU Instances *********************************/
  45. #define IS_PMU_ALL_INSTANCE(INSTANCE) ((INSTANCE) == PMU)
  46. /****************************** PMU_RETRAM Instances **************************/
  47. #define IS_PMU_RETRAM_ALL_INSTANCE(INSTANCE) ((INSTANCE) == PMU_RETRAM)
  48. /* COMP1Power */
  49. #define PMU_COMP1PWR_ON (ANA_REG3_CMP1PDN)
  50. #define PMU_COMP1PWR_OFF (0UL)
  51. #define IS_PMU_COMP1PWR(__COMP1PWR__) (((__COMP1PWR__) == PMU_COMP1PWR_ON) ||\
  52. ((__COMP1PWR__) == PMU_COMP1PWR_OFF))
  53. /* COMP2Power */
  54. #define PMU_COMP2PWR_ON (ANA_REG3_CMP2PDN)
  55. #define PMU_COMP2PWR_OFF (0UL)
  56. #define IS_PMU_COMP2PWR(__COMP2PWR__) (((__COMP2PWR__) == PMU_COMP2PWR_ON) ||\
  57. ((__COMP2PWR__) == PMU_COMP2PWR_OFF))
  58. /* TADCPower */
  59. #define PMU_TADCPWR_ON (ANA_REGF_ADTPDN)
  60. #define PMU_TADCPWR_OFF (0UL)
  61. #define IS_PMU_TADCPWR(__TADCPWR__) (((__TADCPWR__) == PMU_TADCPWR_ON) ||\
  62. ((__TADCPWR__) == PMU_TADCPWR_OFF))
  63. /* BGPPower */
  64. #define PMU_BGPPWR_ON (0UL)
  65. #define PMU_BGPPWR_OFF (ANA_REG3_BGPPD)
  66. #define IS_PMU_BGPPWR(__BGPPWR__) (((__BGPPWR__) == PMU_BGPPWR_ON) ||\
  67. ((__BGPPWR__) == PMU_BGPPWR_OFF))
  68. /* AVCCPower */
  69. #define PMU_AVCCPWR_ON (0UL)
  70. #define PMU_AVCCPWR_OFF (ANA_REG8_AVCCLDOPD)
  71. #define IS_PMU_AVCCPWR(__AVCCPWR__) (((__AVCCPWR__) == PMU_AVCCPWR_ON) ||\
  72. ((__AVCCPWR__) == PMU_AVCCPWR_OFF))
  73. /* VDCINDetector */
  74. #define PMU_VDCINDET_ENABLE (0UL)
  75. #define PMU_VDCINDET_DISABLE (ANA_REGA_VDCINDETPD)
  76. #define IS_PMU_VDCINDET(__VDCINDET__) (((__VDCINDET__) == PMU_VDCINDET_ENABLE) ||\
  77. ((__VDCINDET__) == PMU_VDCINDET_DISABLE))
  78. /* VDDDetector */
  79. #define PMU_VDDDET_ENABLE (0UL)
  80. #define PMU_VDDDET_DISABLE (ANA_REG9_VDDDETPD)
  81. #define IS_PMU_VDDDET(__VDDDET__) (((__VDDDET__) == PMU_VDDDET_ENABLE) ||\
  82. ((__VDDDET__) == PMU_VDDDET_DISABLE))
  83. #define PMU_APB_ALL (MISC2_PCLKEN_DMA \
  84. |MISC2_PCLKEN_I2C \
  85. |MISC2_PCLKEN_SPI1 \
  86. |MISC2_PCLKEN_UART0 \
  87. |MISC2_PCLKEN_UART1 \
  88. |MISC2_PCLKEN_UART2 \
  89. |MISC2_PCLKEN_UART3 \
  90. |MISC2_PCLKEN_UART4 \
  91. |MISC2_PCLKEN_UART5 \
  92. |MISC2_PCLKEN_ISO78160 \
  93. |MISC2_PCLKEN_ISO78161 \
  94. |MISC2_PCLKEN_TIMER \
  95. |MISC2_PCLKEN_MISC1 \
  96. |MISC2_PCLKEN_MISC2 \
  97. |MISC2_PCLKEN_U32K0 \
  98. |MISC2_PCLKEN_U32K1 \
  99. |MISC2_PCLKEN_SPI2 \
  100. |MISC2_PCLKEN_SPI3)
  101. #define PMU_APB_DMA MISC2_PCLKEN_DMA
  102. #define PMU_APB_I2C MISC2_PCLKEN_I2C
  103. #define PMU_APB_SPI1 MISC2_PCLKEN_SPI1
  104. #define PMU_APB_UART0 MISC2_PCLKEN_UART0
  105. #define PMU_APB_UART1 MISC2_PCLKEN_UART1
  106. #define PMU_APB_UART2 MISC2_PCLKEN_UART2
  107. #define PMU_APB_UART3 MISC2_PCLKEN_UART3
  108. #define PMU_APB_UART4 MISC2_PCLKEN_UART4
  109. #define PMU_APB_UART5 MISC2_PCLKEN_UART5
  110. #define PMU_APB_ISO78160 MISC2_PCLKEN_ISO78160
  111. #define PMU_APB_ISO78161 MISC2_PCLKEN_ISO78161
  112. #define PMU_APB_TIMER MISC2_PCLKEN_TIMER
  113. #define PMU_APB_MISC1 MISC2_PCLKEN_MISC1
  114. #define PMU_APB_U32K0 MISC2_PCLKEN_U32K0
  115. #define PMU_APB_U32K1 MISC2_PCLKEN_U32K1
  116. #define PMU_APB_SPI2 MISC2_PCLKEN_SPI2
  117. #define PMU_APB_SPI3 MISC2_PCLKEN_SPI3
  118. #define PMU_AHB_ALL (MISC2_HCLKEN_DMA \
  119. |MISC2_HCLKEN_GPIO \
  120. |MISC2_HCLKEN_CRYPT)
  121. // |MISC2_HCLKEN_LCD
  122. #define PMU_AHB_DMA MISC2_HCLKEN_DMA
  123. #define PMU_AHB_GPIO MISC2_HCLKEN_GPIO
  124. //#define PMU_AHB_LCD MISC2_HCLKEN_LCD
  125. #define PMU_AHB_CRYPT MISC2_HCLKEN_CRYPT
  126. //PMU interrupt
  127. #define PMU_INT_IOAEN PMU_CONTROL_INT_IOA_EN
  128. #define PMU_INT_32K PMU_CONTROL_INT_32K_EN
  129. #define PMU_INT_6M PMU_CONTROL_INT_6M_EN
  130. #define PMU_INT_Msk (PMU_INT_IOAEN \
  131. |PMU_INT_32K \
  132. |PMU_INT_6M)
  133. #define IS_PMU_INT(__INT__) ((((__INT__)&PMU_INT_Msk) != 0UL) &&\
  134. (((__INT__)&(~PMU_INT_Msk)) == 0UL))
  135. //INTStatus
  136. #define PMU_INTSTS_32K PMU_STS_INT_32K
  137. #define PMU_INTSTS_6M PMU_STS_INT_6M
  138. #define PMU_INTSTS_Msk (PMU_INTSTS_32K \
  139. |PMU_INTSTS_6M)
  140. #define IS_PMU_INTFLAGR(__INTFLAG__) (((__INTFLAG__) == PMU_INTSTS_32K) ||\
  141. ((__INTFLAG__) == PMU_INTSTS_6M))
  142. #define IS_PMU_INTFLAGC(__INTFLAG__) ((((__INTFLAG__)&PMU_INTSTS_Msk) != 0UL) &&\
  143. (((__INTFLAG__)&(~PMU_INTSTS_Msk)) == 0UL))
  144. /***** Reset Source Status *****/
  145. #define PMU_RSTSRC_EXTRST PMU_STS_EXTRST
  146. #define PMU_RSTSRC_PORST PMU_STS_PORST
  147. #define PMU_RSTSRC_DPORST PMU_STS_DPORST
  148. #define PMU_RSTSRC_WDTRST PMU_STS_WDTRST
  149. #define PMU_RSTSRC_SFTRST PMU_STS_SFTRST
  150. #define PMU_RSTSRC_MODERST PMU_STS_MODERST
  151. #define PMU_RSTSRC_Msk (PMU_RSTSRC_EXTRST |\
  152. PMU_RSTSRC_PORST |\
  153. PMU_RSTSRC_DPORST |\
  154. PMU_RSTSRC_WDTRST |\
  155. PMU_RSTSRC_SFTRST |\
  156. PMU_RSTSRC_MODERST)
  157. #define PMU_RSTSRC_ALL PMU_RSTSRC_Msk
  158. #define PMU_RESETSRC(__RSTSRC__) (((__RSTSRC__) == PMU_RSTSRC_EXTRST) ||\
  159. ((__RSTSRC__) == PMU_RSTSRC_PORST) ||\
  160. ((__RSTSRC__) == PMU_RSTSRC_DPORST) ||\
  161. ((__RSTSRC__) == PMU_RSTSRC_WDTRST) ||\
  162. ((__RSTSRC__) == PMU_RSTSRC_SFTRST) ||\
  163. ((__RSTSRC__) == PMU_RSTSRC_MODERST))
  164. #define PMU_RESETSRC_CLR(__RSTSRC__) ((((__RSTSRC__) & PMU_RSTSRC_Msk) != 0UL) &&\
  165. (((__RSTSRC__) & (~PMU_RSTSRC_Msk)) == 0UL))
  166. /***** DeepSleep wakeup Source Status *****/
  167. #define PMU_DSLEEPWKUSRC_MODE PMU_STS_WKUMODE
  168. #define PMU_DSLEEPWKUSRC_XTAL PMU_STS_WKUXTAL
  169. #define PMU_DSLEEPWKUSRC_U32K PMU_STS_WKUU32K
  170. #define PMU_DSLEEPWKUSRC_ANA PMU_STS_WKUANA
  171. #define PMU_DSLEEPWKUSRC_RTC PMU_STS_WKURTC
  172. #define PMU_DSLEEPWKUSRC_IOA PMU_STS_WKUIOA
  173. #define PMU_DSLEEPWKUSRC_Msk (PMU_DSLEEPWKUSRC_MODE |\
  174. PMU_DSLEEPWKUSRC_XTAL |\
  175. PMU_DSLEEPWKUSRC_U32K |\
  176. PMU_DSLEEPWKUSRC_ANA |\
  177. PMU_DSLEEPWKUSRC_RTC |\
  178. PMU_DSLEEPWKUSRC_IOA)
  179. #define IS_PMU_DSLEEPWKUSRC(__SRC__) (((__SRC__) == PMU_DSLEEPWKUSRC_MODE) ||\
  180. ((__SRC__) == PMU_DSLEEPWKUSRC_XTAL) ||\
  181. ((__SRC__) == PMU_DSLEEPWKUSRC_U32K) ||\
  182. ((__SRC__) == PMU_DSLEEPWKUSRC_ANA) ||\
  183. ((__SRC__) == PMU_DSLEEPWKUSRC_RTC) ||\
  184. ((__SRC__) == PMU_DSLEEPWKUSRC_IOA))
  185. //Status
  186. #define PMU_STS_32K PMU_STS_EXIST_32K
  187. #define PMU_STS_6M PMU_STS_EXIST_6M
  188. #define IS_PMU_FLAG(__FLAG__) (((__FLAG__) == PMU_STS_32K) || ((__FLAG__) == PMU_STS_6M))
  189. //Wakeup_Event
  190. #define IOA_DISABLE (0UL)
  191. #define IOA_RISING (1UL)
  192. #define IOA_FALLING (2UL)
  193. #define IOA_HIGH (3UL)
  194. #define IOA_LOW (4UL)
  195. #define IOA_EDGEBOTH (5UL)
  196. #define IS_PMU_WAKEUP(__WAKEUP__) (((__WAKEUP__) == IOA_DISABLE) ||\
  197. ((__WAKEUP__) == IOA_RISING) ||\
  198. ((__WAKEUP__) == IOA_FALLING) ||\
  199. ((__WAKEUP__) == IOA_HIGH) ||\
  200. ((__WAKEUP__) == IOA_LOW) ||\
  201. ((__WAKEUP__) == IOA_EDGEBOTH))
  202. /***** Wakeup_Event (PMU_SleepWKUSRCConfig_RTC) *****/
  203. #define PMU_RTCEVT_ALARM RTC_INTSTS_INTSTS10
  204. #define PMU_RTCEVT_WKUCNT RTC_INTSTS_INTSTS6
  205. #define PMU_RTCEVT_MIDNIGHT RTC_INTSTS_INTSTS5
  206. #define PMU_RTCEVT_WKUHOUR RTC_INTSTS_INTSTS4
  207. #define PMU_RTCEVT_WKUMIN RTC_INTSTS_INTSTS3
  208. #define PMU_RTCEVT_WKUSEC RTC_INTSTS_INTSTS2
  209. #define PMU_RTCEVT_TIMEILLE RTC_INTSTS_INTSTS1
  210. #define PMU_RTCEVT_ITVSITV RTC_INTSTS_INTSTS0
  211. #define PMU_RTCEVT_Msk (PMU_RTCEVT_WKUCNT \
  212. |PMU_RTCEVT_MIDNIGHT \
  213. |PMU_RTCEVT_WKUHOUR \
  214. |PMU_RTCEVT_WKUMIN \
  215. |PMU_RTCEVT_WKUSEC \
  216. |PMU_RTCEVT_TIMEILLE \
  217. |PMU_RTCEVT_ITVSITV \
  218. |PMU_RTCEVT_ALARM)
  219. #define IS_PMU_RTCEVT(__RTCEVT__) ((((__RTCEVT__)&PMU_RTCEVT_Msk) != 0UL) &&\
  220. (((__RTCEVT__)&(~PMU_RTCEVT_Msk)) == 0UL))
  221. /***** BATRTCDisc (PMU_BATDischargeConfig) *****/
  222. #define PMU_BAT1 ANA_REG6_BAT1DISC
  223. #define PMU_BATRTC ANA_REG6_BATRTCDISC
  224. #define IS_PMU_BATRTCDISC(__BATRTCDISC__) (((__BATRTCDISC__) == PMU_BAT1) || ((__BATRTCDISC__) == PMU_BATRTC))
  225. /***** PowerThreshold (PMU_PowerAlarmTHConfig) *****/
  226. #define PMU_VDDALARM_4_5V ANA_REG8_VDDPVDSEL_0
  227. #define PMU_VDDALARM_4_2V ANA_REG8_VDDPVDSEL_1
  228. #define PMU_VDDALARM_3_9V ANA_REG8_VDDPVDSEL_2
  229. #define PMU_VDDALARM_3_6V ANA_REG8_VDDPVDSEL_3
  230. #define PMU_VDDALARM_3_2V ANA_REG8_VDDPVDSEL_4
  231. #define PMU_VDDALARM_2_9V ANA_REG8_VDDPVDSEL_5
  232. #define PMU_VDDALARM_2_6V ANA_REG8_VDDPVDSEL_6
  233. #define PMU_VDDALARM_2_3V ANA_REG8_VDDPVDSEL_7
  234. #define IS_PMU_VDDALARM_THR(__VDDALARM__) (((__VDDALARM__) == PMU_VDDALARM_4_5V) ||\
  235. ((__VDDALARM__) == PMU_VDDALARM_4_2V) ||\
  236. ((__VDDALARM__) == PMU_VDDALARM_3_9V) ||\
  237. ((__VDDALARM__) == PMU_VDDALARM_3_6V) ||\
  238. ((__VDDALARM__) == PMU_VDDALARM_3_2V) ||\
  239. ((__VDDALARM__) == PMU_VDDALARM_2_9V) ||\
  240. ((__VDDALARM__) == PMU_VDDALARM_2_6V) ||\
  241. ((__VDDALARM__) == PMU_VDDALARM_2_3V))
  242. /***** RTCLDOSel (PMU_RTCLDOConfig) *****/
  243. #define PMU_RTCLDO_1_5 (0UL)
  244. #define PMU_RTCLDO_1_2 ANA_REGA_RTCVSEL
  245. /***** StatusMask (PMU_GetPowerStatus) *****/
  246. #define PMU_PWRSTS_AVCCLV ANA_COMPOUT_AVCCLV
  247. #define PMU_PWRSTS_VDCINDROP ANA_CMPOUT_VDCINDROP
  248. #define PMU_PWRSTS_VDDALARM ANA_CMPOUT_VDDALARM
  249. /***** PMU_PDNDSleepConfig *****/
  250. //VDCIN_PDNS
  251. #define PMU_VDCINPDNS_0 (0UL)
  252. #define PMU_VDCINPDNS_1 (ANA_CTRL_PDNS)
  253. #define IS_PMU_VDCINPDNS(__VDCINPDNS__) (((__VDCINPDNS__) == PMU_VDCINPDNS_0) ||\
  254. ((__VDCINPDNS__) == PMU_VDCINPDNS_1))
  255. //VDD_PDNS
  256. #define PMU_VDDPDNS_0 (0UL)
  257. #define PMU_VDDPDNS_1 (ANA_CTRL_PDNS2)
  258. #define IS_PMU_VDDPDNS(__VDDPDNS__) (((__VDDPDNS__) == PMU_VDDPDNS_0) ||\
  259. ((__VDDPDNS__) == PMU_VDDPDNS_1))
  260. #define PMU_VDDALARM_CHKFRE_NOCHECK (0x0UL << ANA_CMPCTL_VDDALARM_CHK_FRQ_SEL_Pos)
  261. #define PMU_VDDALARM_CHKFRE_30US (0x1UL << ANA_CMPCTL_VDDALARM_CHK_FRQ_SEL_Pos)
  262. #define IS_PMU_VDDALARM_CHKFRE(__CHKFRE__) (((__CHKFRE__) == PMU_VDDALARM_CHKFRE_NOCHECK) ||\
  263. ((__CHKFRE__) == PMU_VDDALARM_CHKFRE_30US))
  264. #define IS_PMU_PWR_DEBSEL(__DEBSEL__) ((__DEBSEL__) < 256UL)
  265. /* Exported Functions ------------------------------------------------------- */
  266. uint32_t PMU_EnterDSleepMode(void);
  267. void PMU_EnterIdleMode(void);
  268. uint32_t PMU_EnterSleepMode(void);
  269. void PMU_INTConfig(uint32_t INTMask, uint32_t NewState);
  270. uint8_t PMU_GetINTStatus(uint32_t INTMask);
  271. void PMU_ClearINTStatus(uint32_t INTMask);
  272. uint8_t PMU_GetCrystalStatus(uint32_t Mask);
  273. uint16_t PMU_GetIOAAllINTStatus(void);
  274. uint8_t PMU_GetIOAINTStatus(uint16_t INTMask);
  275. void PMU_ClearIOAINTStatus(uint16_t INTMask);
  276. void PMU_WakeUpPinConfig(uint32_t IOAx, uint32_t Wakeup_Event);
  277. uint8_t PMU_EnterDSleep_LowPower(PMU_LowPWRTypeDef *InitStruct);
  278. uint8_t PMU_EnterSleep_LowPower(PMU_LowPWRTypeDef *InitStruct);
  279. #ifndef __GNUC__
  280. void PMU_EnterIdle_LowPower(void);
  281. #endif
  282. void PMU_SleepWKUSRCConfig_IOA(uint16_t IOAx, uint32_t Wakeup_Event, uint32_t Priority);
  283. void PMU_SleepWKUSRCConfig_RTC(uint32_t Wakeup_Event, uint32_t Priority);
  284. void PMU_DeepSleepWKUSRCConfig_IOA(uint16_t IOAx, uint32_t Wakeup_Event);
  285. void PMU_DeepSleepWKUSRCConfig_RTC(uint32_t Wakeup_Event);
  286. void PMU_PDNDSleepConfig(uint32_t VDCIN_PDNS, uint32_t VDD_PDNS);
  287. /***** BGP functions *****/
  288. void PMU_BGPCmd(uint32_t NewState);
  289. /***** VDD functions *****/
  290. void PMU_VDDAlarmConfig(uint32_t CheckTHR, uint32_t CheckFrequency);
  291. uint8_t PMU_GetVDDAlarmStatus(void);
  292. /***** AVCC functions *****/
  293. void PMU_AVCCCmd(uint32_t NewState);
  294. void PMU_AVCCOutputCmd(uint32_t NewState);
  295. void PMU_AVCCLVDetectorCmd(uint32_t NewState);
  296. uint8_t PMU_GetAVCCLVStatus(void);
  297. /***** VDCIN functions *****/
  298. void PMU_VDCINDetectorCmd(uint32_t NewState);
  299. uint8_t PMU_GetVDCINDropStatus(void);
  300. void PMU_PWRDEBSel(uint32_t DEBSel);
  301. /***** BAT functions *****/
  302. void PMU_BATDischargeConfig(uint32_t BATDisc, uint32_t NewState);
  303. /***** Other functions *****/
  304. uint8_t PMU_GetModeStatus(void);
  305. uint8_t PMU_GetPowerStatus(uint32_t StatusMask);
  306. uint8_t PMU_GetResetSource(uint32_t Mask);
  307. void PMU_ClearResetSource(uint32_t Mask);
  308. uint32_t PMU_GetAllResetSource(void);
  309. uint8_t PMU_GetDSleepWKUSource(uint32_t Mask);
  310. uint32_t PMU_GetAllDSleepWKUSource(void);
  311. #ifdef __cplusplus
  312. }
  313. #endif
  314. #endif /* __LIB_PMU_H */
  315. /*********************************** END OF FILE ******************************/