lib_pmu.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158
  1. /**
  2. ******************************************************************************
  3. * @file lib_pmu.c
  4. * @author Application Team
  5. * @version V4.4.0
  6. * @date 2018-09-27
  7. * @brief PMU library.
  8. ******************************************************************************
  9. * @attention
  10. *
  11. ******************************************************************************
  12. */
  13. #include "lib_pmu.h"
  14. #include "lib_gpio.h"
  15. #include "lib_CodeRAM.h"
  16. #include "lib_clk.h"
  17. #include "lib_cortex.h"
  18. #define DSLEEPPASS_KEY 0xAA5555AA
  19. #define DSLEEPEN_KEY 0x55AAAA55
  20. extern __IO uint32_t ana_reg3_tmp;
  21. /**
  22. * @brief Enter Deep sleep mode.
  23. * @param None
  24. * @retval 1: Current mode is debug mode, function failed.
  25. * 2: Enter deep-sleep mode failed.
  26. */
  27. uint32_t PMU_EnterDSleepMode(void)
  28. {
  29. uint32_t hclk;
  30. /* Current MODE is 0, debug mode, return error */
  31. if (!(PMU->STS & PMU_STS_MODE))
  32. return 1;
  33. /* Enter deep sleep when WKU event is cleared */
  34. while (PMU->DSLEEPEN & PMU_DSLEEPEN_WKU)
  35. {
  36. }
  37. /* Flash 1USCYCLE configure */
  38. hclk = CLK_GetHCLKFreq();
  39. if(hclk > 1000000)
  40. {
  41. MISC2->FLASHWC = (hclk/1000000)<<8;
  42. }
  43. else
  44. {
  45. MISC2->FLASHWC = 0<<8;
  46. }
  47. ANA->REG7 &= ~BIT5;
  48. ANA->REGA |= BIT3 | BIT1;
  49. PMU->DSLEEPPASS = DSLEEPPASS_KEY;
  50. PMU->DSLEEPEN = DSLEEPEN_KEY;
  51. return 2;
  52. }
  53. /**
  54. * @brief Enter idel mode.
  55. * @note Any interrupt generate to CPU will break idle mode.
  56. * @param None
  57. * @retval None
  58. */
  59. void PMU_EnterIdleMode(void)
  60. {
  61. /* Clear SLEEPDEEP bit of Cortex-M0 System Control Register */
  62. SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk);
  63. __WFI();
  64. }
  65. /**
  66. * @brief Enter sleep mode.
  67. * @param None
  68. * @retval 1: Current mode is debug mode, function failed.
  69. * 0: Quit deep-sleep mode ucceeded.
  70. */
  71. uint32_t PMU_EnterSleepMode(void)
  72. {
  73. uint32_t hclk;
  74. /* Current MODE is 0, debug mode, return error */
  75. if (!(PMU->STS & PMU_STS_MODE))
  76. return 1;
  77. /* Flash 1USCYCLE configure */
  78. hclk = CLK_GetHCLKFreq();
  79. if(hclk > 1000000)
  80. {
  81. MISC2->FLASHWC = (hclk/1000000)<<8;
  82. }
  83. else
  84. {
  85. MISC2->FLASHWC = 0<<8;
  86. }
  87. ANA->REG7 &= ~BIT5;
  88. ANA->REGA |= BIT3 | BIT1;
  89. /* Set SLEEPDEEP bit of Cortex-M0 System Control Register */
  90. SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
  91. __WFI();
  92. return 0;
  93. }
  94. /**
  95. * @brief PMU interrupt configuration.
  96. * @param INTMask:(between PMU_INT_IOAEN,PMU_INT_32K and PMU_INT_6M, can use the | operator)
  97. PMU_INT_IOAEN
  98. PMU_INT_32K
  99. PMU_INT_6M
  100. NewState:
  101. ENABLE
  102. DISABLE
  103. * @retval None
  104. */
  105. void PMU_INTConfig(uint32_t INTMask, uint32_t NewState)
  106. {
  107. /* Check parameters */
  108. assert_parameters(IS_PMU_INT(INTMask));
  109. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  110. if (NewState == ENABLE)
  111. {
  112. PMU->CONTROL |= INTMask;
  113. }
  114. else
  115. {
  116. PMU->CONTROL &= ~INTMask;
  117. }
  118. }
  119. /**
  120. * @brief Get interrupt status.
  121. * @param INTMask:
  122. PMU_INTSTS_32K
  123. PMU_INTSTS_6M
  124. PMU_INTSTS_EXTRST
  125. PMU_INTSTS_PORST
  126. PMU_INTSTS_DPORST
  127. * @retval 1:status set
  128. 0:status reset
  129. */
  130. uint8_t PMU_GetINTStatus(uint32_t INTMask)
  131. {
  132. /* Check parameters */
  133. assert_parameters(IS_PMU_INTFLAGR(INTMask));
  134. if (PMU->STS&INTMask)
  135. {
  136. return 1;
  137. }
  138. else
  139. {
  140. return 0;
  141. }
  142. }
  143. /**
  144. * @brief Clear interrupt status.
  145. * @param INTMask:specifies the flag to clear.
  146. This parameter can be any combination of the following values
  147. PMU_INTSTS_32K
  148. PMU_INTSTS_6M
  149. PMU_INTSTS_EXTRST
  150. PMU_INTSTS_PORST
  151. PMU_INTSTS_DPORST
  152. * @retval None
  153. */
  154. void PMU_ClearINTStatus(uint32_t INTMask)
  155. {
  156. /* Check parameters */
  157. assert_parameters(IS_PMU_INTFLAGC(INTMask));
  158. PMU->STS = INTMask;
  159. }
  160. /**
  161. * @brief Get status.
  162. * @param Mask:
  163. PMU_STS_32K
  164. PMU_STS_6M
  165. * @retval 1:status set
  166. 0:status reset
  167. */
  168. uint8_t PMU_GetStatus(uint32_t Mask)
  169. {
  170. /* Check parameters */
  171. assert_parameters(IS_PMU_FLAG(Mask));
  172. if (PMU->STS&Mask)
  173. {
  174. return 1;
  175. }
  176. else
  177. {
  178. return 0;
  179. }
  180. }
  181. /**
  182. * @brief Get all IOA interrupt status.
  183. * @param None
  184. * @retval IOA's interrupt status
  185. */
  186. uint16_t PMU_GetIOAAllINTStatus(void)
  187. {
  188. return (PMU->IOAINTSTS);
  189. }
  190. /**
  191. * @brief Get IOA interrupt status.
  192. * @param INTMask:
  193. GPIO_Pin_0 ~ GPIO_Pin_15
  194. * @retval 1:status set
  195. 0:status reset
  196. */
  197. uint16_t PMU_GetIOAINTStatus(uint16_t INTMask)
  198. {
  199. /* Check parameters */
  200. assert_parameters(IS_GPIO_PINR(INTMask));
  201. if (PMU->IOAINTSTS&INTMask)
  202. {
  203. return 1;
  204. }
  205. else
  206. {
  207. return 0;
  208. }
  209. }
  210. /**
  211. * @brief Clear IOA interrupt status.
  212. * @param INTMask:
  213. This parameter can be any combination of the following values
  214. GPIO_Pin_0 ~ GPIO_Pin_15
  215. * @retval None
  216. */
  217. void PMU_ClearIOAINTStatus(uint16_t INTMask)
  218. {
  219. /* Check parameters */
  220. assert_parameters(IS_GPIO_PIN(INTMask));
  221. PMU->IOAINTSTS = INTMask;
  222. }
  223. /**
  224. * @brief Wake-up sources pin configuration.
  225. * @param IOAx: GPIO_Pin_0 ~ GPIO_Pin_15
  226. Wakeup_Event:
  227. IOA_DISABLE
  228. IOA_RISING
  229. IOA_FALLING
  230. IOA_HIGH
  231. IOA_LOW
  232. IOA_EDGEBOTH
  233. * @retval None
  234. */
  235. void PMU_WakeUpPinConfig(uint32_t IOAx, uint32_t Wakeup_Event)
  236. {
  237. uint32_t tmp;
  238. uint32_t position = 0x00U;
  239. uint32_t iocurrent = 0x00U;
  240. /* Check parameters */
  241. assert_parameters(IS_GPIO_PINR(IOAx));
  242. assert_parameters(IS_PMU_WAKEUP(Wakeup_Event));
  243. while ((IOAx >> position) != 0U)
  244. {
  245. /* Get current io position */
  246. iocurrent = IOAx & (0x01U << position);
  247. if (iocurrent)
  248. {
  249. /* Current IO Input configure*/
  250. GPIOA->OEN |= iocurrent;
  251. GPIOA->IE |= iocurrent;
  252. tmp = PMU->IOAWKUEN;
  253. tmp &= ~(3U << (2 * position));
  254. switch (Wakeup_Event)
  255. {
  256. /* Disable wake-up function */
  257. default:
  258. case IOA_DISABLE:
  259. break;
  260. /* wake-up function: Rising */
  261. case IOA_RISING:
  262. GPIOA->DAT &= ~iocurrent;
  263. tmp |= 1 << (2 * position);
  264. break;
  265. /* wake-up function: falling */
  266. case IOA_FALLING:
  267. GPIOA->DAT |= iocurrent;
  268. tmp |= 1 << (2 * position);
  269. break;
  270. /* wake-up function: high level */
  271. case IOA_HIGH:
  272. GPIOA->DAT &= ~iocurrent;
  273. tmp |= 2 << (2 * position);
  274. break;
  275. /* wake-up function: low level */
  276. case IOA_LOW:
  277. GPIOA->DAT |= iocurrent;
  278. tmp |= 2 << (2 * position);
  279. break;
  280. /* wake-up function: boht edge */
  281. case IOA_EDGEBOTH:
  282. tmp |= 3 << (2 * position);
  283. break;
  284. }
  285. PMU->IOAWKUEN = tmp;
  286. }
  287. position++;
  288. }
  289. }
  290. /**
  291. * @brief Control low-power configuration, enter deep-sleep mode.
  292. *
  293. * @param InitStruct : pointer to PMU_LowPWRTypeDef
  294. COMP1Power:
  295. PMU_COMP1PWR_ON
  296. PMU_COMP1PWR_OFF
  297. COMP2Power:
  298. PMU_COMP2PWR_ON
  299. PMU_COMP2PWR_OFF
  300. TADCPower:
  301. PMU_TADCPWR_ON
  302. PMU_TADCPWR_OFF
  303. BGPPower:
  304. PMU_BGPPWR_ON
  305. PMU_BGPPWR_OFF
  306. AVCCPower:
  307. PMU_AVCCPWR_ON
  308. PMU_AVCCPWR_OFF
  309. LCDPower:
  310. PMU_LCDPWER_ON
  311. PMU_LCDPWER_OFF
  312. VDCINDetector:
  313. PMU_VDCINDET_ENABLE
  314. PMU_VDCINDET_DISABLE
  315. VDDDetector:
  316. PMU_VDDDET_ENABLE
  317. PMU_VDDDET_DISABLE
  318. APBPeriphralDisable:
  319. PMU_APB_ALL
  320. PMU_APB_DMA
  321. PMU_APB_I2C
  322. PMU_APB_SPI1
  323. PMU_APB_SPI2
  324. PMU_APB_UART0
  325. PMU_APB_UART1
  326. PMU_APB_UART2
  327. PMU_APB_UART3
  328. PMU_APB_UART4
  329. PMU_APB_UART5
  330. PMU_APB_ISO78160
  331. PMU_APB_ISO78161
  332. PMU_APB_TIMER
  333. PMU_APB_MISC
  334. PMU_APB_U32K0
  335. PMU_APB_U32K1
  336. AHBPeriphralDisable:
  337. PMU_AHB_ALL
  338. PMU_AHB_DMA
  339. PMU_AHB_GPIO
  340. PMU_AHB_LCD
  341. PMU_AHB_CRYPT
  342. * @note This function performs the following:
  343. Comparator 1 power control ON or OFF(optional)
  344. Comparator 2 power control ON or OFF(optional)
  345. Tiny ADC power control ON or OFF(optional)
  346. Bandgap power control ON or OFF(optional)
  347. AVCC power control ON or OFF(optional)
  348. LCD controller power control ON or OFF(optional)
  349. VDCIN detector control Disable or Enable(optional)
  350. VDD detector control Disable or Enable(optional)
  351. Disable AHB/APB periphral clock Modules(optional)
  352. Disable AVCC output
  353. Power down ADC, Power down Temp sensor
  354. Disable resistance/capacitance division for ADC input signal
  355. * @retval 1: Current MODE is debug mode, enter deep-sleep mode failed.
  356. 2: VDCIN is not drop before enter deep-sleep mode or Failure to enter deep sleep mode.
  357. */
  358. uint8_t PMU_EnterDSleep_LowPower(PMU_LowPWRTypeDef *InitStruct)
  359. {
  360. uint32_t tmp;
  361. uint32_t hclk;
  362. /* Check parameters */
  363. assert_parameters(IS_PMU_COMP1PWR(InitStruct->COMP1Power));
  364. assert_parameters(IS_PMU_COMP2PWR(InitStruct->COMP2Power));
  365. assert_parameters(IS_PMU_TADCPWR(InitStruct->TADCPower));
  366. assert_parameters(IS_PMU_BGPPWR(InitStruct->BGPPower));
  367. assert_parameters(IS_PMU_AVCCPWR(InitStruct->AVCCPower));
  368. assert_parameters(IS_PMU_LCDPWER(InitStruct->LCDPower));
  369. assert_parameters(IS_PMU_VDCINDET(InitStruct->VDCINDetector));
  370. assert_parameters(IS_PMU_VDDDET(InitStruct->VDDDetector));
  371. /* Current MODE is 0, debug mode, return error */
  372. if (!(PMU->STS & PMU_STS_MODE))
  373. return 1;
  374. /* Disable AVCC output */
  375. ANA->REGF &= ~ANA_REGF_AVCCO_EN;
  376. /* Power down ADC */
  377. ana_reg3_tmp &= ~ANA_REG3_ADCPDN;
  378. ANA->REG3 = ana_reg3_tmp;
  379. /* Power down Temp sensor */
  380. while (ANA->ADCCTRL & ANA_ADCCTRL_MTRIG);
  381. ANA->ADCCTRL &= ~(ANA_ADCCTRL_MCH | ANA_ADCCTRL_ACH);
  382. /* Disable resistor/cap division for ADC input signal */
  383. ANA->REG1 &= ~(ANA_REG1_RESDIV | ANA_REG1_GDE4);
  384. /******** Comparator 1 power control ********/
  385. ana_reg3_tmp &= ~ANA_REG3_CMP1PDN;
  386. ana_reg3_tmp |= InitStruct->COMP1Power;
  387. ANA->REG3 = ana_reg3_tmp;
  388. /******** Comparator 2 power control ********/
  389. ana_reg3_tmp &= ~ANA_REG3_CMP2PDN;
  390. ana_reg3_tmp |= InitStruct->COMP2Power;
  391. ANA->REG3 = ana_reg3_tmp;
  392. /******** Tiny ADC power control ********/
  393. tmp = ANA->REGF;
  394. tmp &= ~ANA_REGF_PDNADT;
  395. tmp |= InitStruct->TADCPower;
  396. ANA->REGF = tmp;
  397. /******** BGP power control ********/
  398. ana_reg3_tmp &= ~ANA_REG3_BGPPD;
  399. ana_reg3_tmp |= InitStruct->BGPPower;
  400. ANA->REG3 = ana_reg3_tmp;
  401. /******** AVCC power control ********/
  402. tmp = ANA->REG8;
  403. tmp &= ~ANA_REG8_PD_AVCCLDO;
  404. tmp |= InitStruct->AVCCPower;
  405. ANA->REG8 = tmp;
  406. /******** LCD controller power control ********/
  407. tmp = LCD->CTRL;
  408. tmp &= ~LCD_CTRL_EN;
  409. tmp |= InitStruct->LCDPower;
  410. LCD->CTRL = tmp;
  411. /* LCD power off, disable all SEG */
  412. if (InitStruct->LCDPower == PMU_LCDPWER_OFF)
  413. {
  414. LCD->SEGCTRL0 = 0;
  415. LCD->SEGCTRL1 = 0;
  416. LCD->SEGCTRL2 = 0;
  417. }
  418. /******** VDCIN detector control ********/
  419. tmp = ANA->REGA;
  420. tmp &= ~ANA_REGA_PD_VDCINDET;
  421. tmp |= InitStruct->VDCINDetector;
  422. ANA->REGA = tmp;
  423. /******** VDD detector control *********/
  424. tmp = ANA->REG9;
  425. tmp &= ~ANA_REG9_PDDET;
  426. tmp |= InitStruct->VDDDetector;
  427. ANA->REG9 = tmp;
  428. /******** AHB Periphral clock disable selection ********/
  429. tmp = MISC2->HCLKEN;
  430. tmp &= ~((InitStruct->AHBPeriphralDisable) & PMU_AHB_ALL);
  431. MISC2->HCLKEN = tmp;
  432. /******** APB Periphral clock disable selection ********/
  433. tmp = MISC2->PCLKEN;
  434. tmp &= ~((InitStruct->APBPeriphralDisable) & PMU_APB_ALL);
  435. MISC2->PCLKEN = tmp;
  436. if ((InitStruct->VDCINDetector) != PMU_VDCINDET_DISABLE)
  437. {
  438. if (!(ANA->COMPOUT & ANA_COMPOUT_VDCINDROP))
  439. {
  440. return 2;
  441. }
  442. }
  443. // make sure WKU is 0 before entering deep-sleep mode
  444. while (PMU->DSLEEPEN & PMU_DSLEEPEN_WKU);
  445. /* Flash 1USCYCLE configure */
  446. hclk = CLK_GetHCLKFreq();
  447. if(hclk > 1000000)
  448. {
  449. MISC2->FLASHWC = (hclk/1000000)<<8;
  450. }
  451. else
  452. {
  453. MISC2->FLASHWC = 0<<8;
  454. }
  455. ANA->REG7 &= ~BIT5;
  456. ANA->REGA |= BIT3 | BIT1;
  457. /* Enter deep-sleep mode */
  458. PMU->DSLEEPPASS = DSLEEPPASS_KEY;
  459. PMU->DSLEEPEN = DSLEEPEN_KEY;
  460. return 2;
  461. }
  462. /**
  463. * @brief Control low-power configuration, enter sleep mode.
  464. *
  465. * @param InitStruct : pointer to PMU_LowPWRTypeDef
  466. COMP1Power:
  467. PMU_COMP1PWR_ON
  468. PMU_COMP1PWR_OFF
  469. COMP2Power:
  470. PMU_COMP2PWR_ON
  471. PMU_COMP2PWR_OFF
  472. TADCPower:
  473. PMU_TADCPWR_ON
  474. PMU_TADCPWR_OFF
  475. BGPPower:
  476. PMU_BGPPWR_ON
  477. PMU_BGPPWR_OFF
  478. AVCCPower:
  479. PMU_AVCCPWR_ON
  480. PMU_AVCCPWR_OFF
  481. LCDPower:
  482. PMU_LCDPWER_ON
  483. PMU_LCDPWER_OFF
  484. VDCINDetector:
  485. PMU_VDCINDET_ENABLE
  486. PMU_VDCINDET_DISABLE
  487. VDDDetector:
  488. PMU_VDDDET_ENABLE
  489. PMU_VDDDET_DISABLE
  490. APBPeriphralDisable:
  491. PMU_APB_ALL
  492. PMU_APB_DMA
  493. PMU_APB_I2C
  494. PMU_APB_SPI1
  495. PMU_APB_SPI2
  496. PMU_APB_UART0
  497. PMU_APB_UART1
  498. PMU_APB_UART2
  499. PMU_APB_UART3
  500. PMU_APB_UART4
  501. PMU_APB_UART5
  502. PMU_APB_ISO78160
  503. PMU_APB_ISO78161
  504. PMU_APB_TIMER
  505. PMU_APB_MISC
  506. PMU_APB_U32K0
  507. PMU_APB_U32K1
  508. AHBPeriphralDisable:
  509. PMU_AHB_ALL
  510. PMU_AHB_DMA
  511. PMU_AHB_GPIO
  512. PMU_AHB_LCD
  513. PMU_AHB_CRYPT
  514. * @note This function performs the following:
  515. Comparator 1 power control ON or OFF(optional)
  516. Comparator 2 power control ON or OFF(optional)
  517. Tiny ADC power control ON or OFF(optional)
  518. Bandgap power control ON or OFF(optional)
  519. AVCC power control ON or OFF(optional)
  520. LCD controller power control ON or OFF(optional)
  521. VDCIN detector control Disable or Enable(optional)
  522. VDD detector control Disable or Enable(optional)
  523. Disable AHB/APB periphral clock Modules(optional)
  524. Disable AVCC output
  525. Power down ADC, Power down Temp sensor
  526. Disable resistance/capacitance division for ADC input signal
  527. * @retval 2: VDCIN is not drop before enter sleep mode(failed).
  528. 1: Current mode is debug mode, enter sleep mode failed.
  529. 0: Quit from sleep mode success.
  530. */
  531. uint8_t PMU_EnterSleep_LowPower(PMU_LowPWRTypeDef *InitStruct)
  532. {
  533. uint32_t tmp;
  534. uint32_t hclk;
  535. /* Check parameters */
  536. assert_parameters(IS_PMU_COMP1PWR(InitStruct->COMP1Power));
  537. assert_parameters(IS_PMU_COMP2PWR(InitStruct->COMP2Power));
  538. assert_parameters(IS_PMU_TADCPWR(InitStruct->TADCPower));
  539. assert_parameters(IS_PMU_BGPPWR(InitStruct->BGPPower));
  540. assert_parameters(IS_PMU_AVCCPWR(InitStruct->AVCCPower));
  541. assert_parameters(IS_PMU_LCDPWER(InitStruct->LCDPower));
  542. assert_parameters(IS_PMU_VDCINDET(InitStruct->VDCINDetector));
  543. assert_parameters(IS_PMU_VDDDET(InitStruct->VDDDetector));
  544. /* Current MODE is 0, debug mode, return error */
  545. if (!(PMU->STS & PMU_STS_MODE))
  546. return 1;
  547. /* Disable AVCC output */
  548. ANA->REGF &= ~ANA_REGF_AVCCO_EN;
  549. /* Power down ADC */
  550. ana_reg3_tmp &= ~ANA_REG3_ADCPDN;
  551. ANA->REG3 = ana_reg3_tmp;
  552. /* Power down Temp sensor */
  553. while (ANA->ADCCTRL & ANA_ADCCTRL_MTRIG);
  554. ANA->ADCCTRL &= ~(ANA_ADCCTRL_MCH | ANA_ADCCTRL_ACH);
  555. /* Disable resistor/cap division for ADC input signal */
  556. ANA->REG1 &= ~(ANA_REG1_RESDIV | ANA_REG1_GDE4);
  557. /******** Comparator 1 power control ********/
  558. ana_reg3_tmp &= ~ANA_REG3_CMP1PDN;
  559. ana_reg3_tmp |= InitStruct->COMP1Power;
  560. ANA->REG3 = ana_reg3_tmp;
  561. /******** Comparator 2 power control ********/
  562. ana_reg3_tmp &= ~ANA_REG3_CMP2PDN;
  563. ana_reg3_tmp |= InitStruct->COMP2Power;
  564. ANA->REG3 = ana_reg3_tmp;
  565. /******** Tiny ADC power control ********/
  566. tmp = ANA->REGF;
  567. tmp &= ~ANA_REGF_PDNADT;
  568. tmp |= InitStruct->TADCPower;
  569. ANA->REGF = tmp;
  570. /******** BGP power control ********/
  571. ana_reg3_tmp &= ~ANA_REG3_BGPPD;
  572. ana_reg3_tmp |= InitStruct->BGPPower;
  573. ANA->REG3 = ana_reg3_tmp;
  574. /******** AVCC power control ********/
  575. tmp = ANA->REG8;
  576. tmp &= ~ANA_REG8_PD_AVCCLDO;
  577. tmp |= InitStruct->AVCCPower;
  578. ANA->REG8 = tmp;
  579. /******** LCD controller power control ********/
  580. tmp = LCD->CTRL;
  581. tmp &= ~LCD_CTRL_EN;
  582. tmp |= InitStruct->LCDPower;
  583. LCD->CTRL = tmp;
  584. /* LCD power off, disable all SEG */
  585. if (InitStruct->LCDPower == PMU_LCDPWER_OFF)
  586. {
  587. LCD->SEGCTRL0 = 0;
  588. LCD->SEGCTRL1 = 0;
  589. LCD->SEGCTRL2 = 0;
  590. }
  591. /******** VDCIN detector control ********/
  592. tmp = ANA->REGA;
  593. tmp &= ~ANA_REGA_PD_VDCINDET;
  594. tmp |= InitStruct->VDCINDetector;
  595. ANA->REGA = tmp;
  596. /******** VDD detector control *********/
  597. tmp = ANA->REG9;
  598. tmp &= ~ANA_REG9_PDDET;
  599. tmp |= InitStruct->VDDDetector;
  600. ANA->REG9 = tmp;
  601. /******** AHB Periphral clock disable selection ********/
  602. tmp = MISC2->HCLKEN;
  603. tmp &= ~((InitStruct->AHBPeriphralDisable) & PMU_AHB_ALL);
  604. MISC2->HCLKEN = tmp;
  605. /******** APB Periphral clock disable selection ********/
  606. tmp = MISC2->PCLKEN;
  607. tmp &= ~((InitStruct->APBPeriphralDisable) & PMU_APB_ALL);
  608. MISC2->PCLKEN = tmp;
  609. if ((InitStruct->VDCINDetector) != PMU_VDCINDET_DISABLE)
  610. {
  611. if (!(ANA->COMPOUT & ANA_COMPOUT_VDCINDROP))
  612. {
  613. return 2;
  614. }
  615. }
  616. /* Flash 1USCYCLE configure */
  617. hclk = CLK_GetHCLKFreq();
  618. if(hclk > 1000000)
  619. {
  620. MISC2->FLASHWC = (hclk/1000000)<<8;
  621. }
  622. else
  623. {
  624. MISC2->FLASHWC = 0<<8;
  625. }
  626. ANA->REG7 &= ~BIT5;
  627. ANA->REGA |= BIT3 | BIT1;
  628. /* Set SLEEPDEEP bit of Cortex-M0 System Control Register */
  629. SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
  630. __WFI();
  631. return 0;
  632. }
  633. /**
  634. * @brief Flash deep standby, enter idle mode.
  635. * @param None
  636. * @retval None
  637. */
  638. #ifndef __GNUC__
  639. void PMU_EnterIdle_LowPower(void)
  640. {
  641. uint32_t hclk;
  642. /* Flash 1USCYCLE configure */
  643. hclk = CLK_GetHCLKFreq();
  644. if(hclk > 1000000)
  645. {
  646. MISC2->FLASHWC = (hclk/1000000)<<8;
  647. }
  648. else
  649. {
  650. MISC2->FLASHWC = 0<<8;
  651. }
  652. PMU_EnterIdle_FlashDSTB();
  653. }
  654. #endif
  655. /**
  656. * @brief IOA wake-up source configure about Sleep mode.
  657. * @param IOAx: GPIO_Pin_0 ~ GPIO_Pin_15
  658. Wakeup_Event:
  659. IOA_DISABLE
  660. IOA_RISING
  661. IOA_FALLING
  662. IOA_HIGH
  663. IOA_LOW
  664. IOA_EDGEBOTH
  665. Priority: The preemption priority for the IRQn channel.
  666. This parameter can be a value between 0 and 3.
  667. * @retval
  668. */
  669. void PMU_SleepWKUSRC_Config_IOA(uint16_t IOAx, uint32_t Wakeup_Event, uint32_t Priority)
  670. {
  671. /* Check parameters */
  672. assert_parameters(IS_GPIO_PINR(IOAx));
  673. assert_parameters(IS_PMU_WAKEUP(Wakeup_Event));
  674. /* Disable PMU interrupt in NVIC */
  675. NVIC_DisableIRQ(PMU_IRQn);
  676. /* Wake-up pins configuration */
  677. PMU_WakeUpPinConfig(IOAx, Wakeup_Event);
  678. /* Clear interrupt flag */
  679. PMU->IOAINTSTS = IOAx;
  680. /* Enable PMU interrupt */
  681. PMU->CONTROL |= PMU_CONTROL_INT_IOA_EN;
  682. CORTEX_SetPriority_ClearPending_EnableIRQ(PMU_IRQn, Priority);
  683. }
  684. /**
  685. * @brief RTC wake-up source configure about Sleep mode.
  686. * @param Wakeup_Event:
  687. This parameter can be any combination of the following values
  688. PMU_RTCEVT_ACDONE
  689. PMU_RTCEVT_WKUCNT
  690. PMU_RTCEVT_MIDNIGHT
  691. PMU_RTCEVT_WKUHOUR
  692. PMU_RTCEVT_WKUMIN
  693. PMU_RTCEVT_WKUSEC
  694. PMU_RTCEVT_TIMEILLE
  695. Priority: The preemption priority for the IRQn channel.
  696. This parameter can be a value between 0 and 3.
  697. * @retval
  698. */
  699. void PMU_SleepWKUSRC_Config_RTC(uint32_t Wakeup_Event, uint32_t Priority)
  700. {
  701. /* Check parameters */
  702. assert_parameters(IS_PMU_RTCEVT(Wakeup_Event));
  703. /* Disable RTC interrupt in NVIC */
  704. NVIC_DisableIRQ(RTC_IRQn);
  705. /* Clear interrupt flag */
  706. RTC->INTSTS = Wakeup_Event;
  707. /* Enable RTC interrupt */
  708. RTC->INTEN |= Wakeup_Event & (~0x01UL);
  709. CORTEX_SetPriority_ClearPending_EnableIRQ(RTC_IRQn, Priority);
  710. }
  711. /**
  712. * @brief IOA wake-up source configure about Deep-Sleep mode.
  713. * @param IOAx: GPIO_Pin_0 ~ GPIO_Pin_15
  714. Wakeup_Event:
  715. IOA_DISABLE
  716. IOA_RISING
  717. IOA_FALLING
  718. IOA_HIGH
  719. IOA_LOW
  720. IOA_EDGEBOTH
  721. * @retval
  722. */
  723. void PMU_DeepSleepWKUSRC_Config_IOA(uint16_t IOAx, uint32_t Wakeup_Event)
  724. {
  725. /* Check parameters */
  726. assert_parameters(IS_GPIO_PINR(IOAx));
  727. assert_parameters(IS_PMU_WAKEUP(Wakeup_Event));
  728. /* Wake-up pins configuration */
  729. PMU_WakeUpPinConfig(IOAx, Wakeup_Event);
  730. /* Clear interrupt flag */
  731. PMU->IOAINTSTS = IOAx;
  732. }
  733. /**
  734. * @brief RTC wake-up source configure about Deep-Sleep mode.
  735. * @param Wakeup_Event:
  736. This parameter can be any combination of the following values
  737. PMU_RTCEVT_ACDONE
  738. PMU_RTCEVT_WKUCNT
  739. PMU_RTCEVT_MIDNIGHT
  740. PMU_RTCEVT_WKUHOUR
  741. PMU_RTCEVT_WKUMIN
  742. PMU_RTCEVT_WKUSEC
  743. PMU_RTCEVT_TIMEILLE
  744. * @retval
  745. */
  746. void PMU_DeepSleepWKUSRC_Config_RTC(uint32_t Wakeup_Event)
  747. {
  748. /* Check parameters */
  749. assert_parameters(IS_PMU_RTCEVT(Wakeup_Event));
  750. /* Clear interrupt flag */
  751. RTC->INTSTS = Wakeup_Event;
  752. /* Enable RTC interrupt */
  753. RTC->INTEN |= Wakeup_Event & (~0x01UL);
  754. }
  755. /**
  756. * @brief Set the deep sleep behavior when VDD/VDCIN is not drop.
  757. * @param VDCIN_PDNS:
  758. PMU_VDCINPDNS_0 , can't enter deep-sleep mode when VDCIN is not drop
  759. can wake-up mcu from deep-sleep, when VDCIN is not drop.
  760. PMU_VDCINPDNS_1 , The condition for entering deep sleep mode is independent of VDCIN.
  761. VDD_PDNS:
  762. PMU_VDDPDNS_0 , can't enter deep-sleep mode when VDD is not drop(>Threshold)
  763. can wake-up mcu from deep-sleep, when VDD is not drop.
  764. PMU_VDDPDNS_1 , The condition for entering deep sleep mode is independent of VDD.
  765. * @retval None
  766. */
  767. void PMU_PDNDSleepConfig(uint32_t VDCIN_PDNS, uint32_t VDD_PDNS)
  768. {
  769. uint32_t tmp;
  770. /* Check parameters */
  771. assert_parameters(IS_PMU_VDCINPDNS(VDCIN_PDNS));
  772. assert_parameters(IS_PMU_VDDPDNS(VDD_PDNS));
  773. tmp = ANA->CTRL;
  774. tmp &= ~(ANA_CTRL_PDNS | ANA_CTRL_PDNS2);
  775. tmp |= (VDCIN_PDNS | VDD_PDNS);
  776. ANA->CTRL = tmp;
  777. }
  778. /**
  779. * @brief BGP power control.
  780. * @param NewState:
  781. * ENABLE
  782. * DISABLE
  783. * @retval None
  784. */
  785. void PMU_BGP_Cmd(uint32_t NewState)
  786. {
  787. /* Check parameters */
  788. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  789. if (NewState == ENABLE)
  790. ana_reg3_tmp &= ~ANA_REG3_BGPPD;
  791. else
  792. ana_reg3_tmp |= ANA_REG3_BGPPD;
  793. ANA->REG3 = ana_reg3_tmp;
  794. }
  795. /**
  796. * @brief Configure VDD alarm threshold voltage.
  797. * @param PowerThreshold:
  798. * PMU_PWTH_4_5
  799. * PMU_PWTH_4_2
  800. * PMU_PWTH_3_9
  801. * PMU_PWTH_3_6
  802. * PMU_PWTH_3_2
  803. * PMU_PWTH_2_9
  804. * PMU_PWTH_2_6
  805. * PMU_PWTH_2_3
  806. * @retval None
  807. */
  808. void PMU_VDDAlarmTHConfig(uint32_t PowerThreshold)
  809. {
  810. uint32_t tmp;
  811. /* Check parameters */
  812. assert_parameters(IS_PMU_PWTH(PowerThreshold));
  813. tmp = ANA->REG8;
  814. tmp &= ~ANA_REG8_VDDPVDSEL;
  815. tmp |= PowerThreshold;
  816. ANA->REG8 = tmp;
  817. }
  818. /**
  819. * @brief Get POWALARM status.
  820. * @param None
  821. * @retval POWALARM status
  822. * 0: Voltage of VDD is higher than threshold.
  823. * 1: Voltage of VDD is lower than threshold.
  824. */
  825. uint8_t PMU_GetVDDALARMStatus(void)
  826. {
  827. if (ANA->COMPOUT & ANA_COMPOUT_VDDALARM)
  828. return 1;
  829. else
  830. return 0;
  831. }
  832. /**
  833. * @brief VDD detector enable control.
  834. * @param NewState:
  835. * ENABLE
  836. * DISABLE
  837. * @retval None
  838. */
  839. void PMU_VDDDetectorCmd(uint32_t NewState)
  840. {
  841. /* Check parameter */
  842. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  843. if (NewState == ENABLE)
  844. ANA->REG9 &= ~ANA_REG9_PDDET;
  845. else
  846. ANA->REG9 |= ANA_REG9_PDDET;
  847. }
  848. /**
  849. * @brief Gets current MODE pin status.
  850. * @param None
  851. * @retval MODE pin status
  852. * 0: Debug mode.
  853. * 1: Normal mode.
  854. */
  855. uint8_t PMU_GetModeStatus(void)
  856. {
  857. if(PMU->STS & PMU_STS_MODE)
  858. return 1;
  859. else
  860. return 0;
  861. }
  862. /**
  863. * @brief Control AVCC enable.
  864. * @param NewState:
  865. * ENABLE
  866. * DISABLE
  867. * @retval None
  868. */
  869. void PMU_AVCC_Cmd(uint32_t NewState)
  870. {
  871. /* Check parameters */
  872. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  873. if (NewState == ENABLE)
  874. ANA->REG8 &= ~ANA_REG8_PD_AVCCLDO;
  875. else
  876. ANA->REG8 |= ANA_REG8_PD_AVCCLDO;
  877. }
  878. /**
  879. * @brief Control VDD33_O pin power.
  880. * @param NewState:
  881. * ENABLE
  882. * DISABLE
  883. * @retval None
  884. */
  885. void PMU_AVCCOutput_Cmd(uint32_t NewState)
  886. {
  887. /* Check parameters */
  888. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  889. if (NewState == DISABLE)
  890. ANA->REGF &= ~ANA_REGF_AVCCO_EN;
  891. else
  892. ANA->REGF |= ANA_REGF_AVCCO_EN;
  893. }
  894. /**
  895. * @brief AVCC Low Voltage detector power control.
  896. * @param NewState:
  897. * ENABLE
  898. * DISABLE
  899. * @retval None
  900. */
  901. void PMU_AVCCLVDetector_Cmd(uint32_t NewState)
  902. {
  903. /* Check parameters */
  904. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  905. if (NewState == ENABLE)
  906. ANA->REG5 &= ~ANA_REG5_PD_AVCCDET;
  907. else
  908. ANA->REG5 |= ANA_REG5_PD_AVCCDET;
  909. }
  910. /**
  911. * @brief Get AVCC low power status.
  912. * @param None
  913. * @retval low power status of AVCC
  914. * 0: status not set, AVCC is higher than 2.5V.
  915. * 1: status set, AVCC is lower than 2.5V.
  916. */
  917. uint8_t PMU_GetAVCCLVStatus(void)
  918. {
  919. if (ANA->COMPOUT & ANA_COMPOUT_AVCCLV)
  920. return 1;
  921. else
  922. return 0;
  923. }
  924. /**
  925. * @brief Control VDCIN decector enable.
  926. * @param NewState:
  927. * ENABLE
  928. * DISABLE
  929. * @retval None
  930. */
  931. void PMU_VDCINDetector_Cmd(uint32_t NewState)
  932. {
  933. /* Check parameters */
  934. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  935. if (NewState == ENABLE)
  936. ANA->REGA &= ~ANA_REGA_PD_VDCINDET;
  937. else
  938. ANA->REGA |= ANA_REGA_PD_VDCINDET;
  939. }
  940. /**
  941. * @brief Get VDCIN drop status.
  942. * @param None
  943. * @retval drop status of VDCIN
  944. * 0: status not set, VDCIN is not drop.
  945. * 1: status set, VDCIN is drop.
  946. */
  947. uint8_t PMU_GetVDCINDropStatus(void)
  948. {
  949. if (ANA->COMPOUT & ANA_COMPOUT_VDCINDROP)
  950. return 1;
  951. else
  952. return 0;
  953. }
  954. /**
  955. * @brief Discharge the BAT battery.
  956. * @param BATDisc:
  957. * PMU_BATRTC_DISC
  958. * NewState:
  959. * ENABLE
  960. * DISABLE
  961. * @retval None
  962. */
  963. void PMU_BATDischargeConfig(uint32_t BATDisc, uint32_t NewState)
  964. {
  965. /* Check parameters */
  966. assert_parameters(IS_PMU_BATRTCDISC(BATDisc));
  967. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  968. if (NewState == ENABLE)
  969. ANA->REG6 |= BATDisc;
  970. else
  971. ANA->REG6 &= ~BATDisc;
  972. }
  973. /**
  974. * @brief Power drop de-bounce control.
  975. * @param Debounce:
  976. * PMU_PWRDROP_DEB_0
  977. * PMU_PWRDROP_DEB_1
  978. * PMU_PWRDROP_DEB_2
  979. * PMU_PWRDROP_DEB_3
  980. * @retval None
  981. */
  982. void PMU_PWRDropDEBConfig(uint32_t Debounce)
  983. {
  984. uint32_t tmp;
  985. /* Check parameters */
  986. assert_parameters(IS_PMU_PWRDROP_DEB(Debounce));
  987. tmp = ANA->CTRL;
  988. tmp &= ~ANA_CTRL_PWRDROPDEB;
  989. tmp |= Debounce;
  990. ANA->CTRL = tmp;
  991. }
  992. /**
  993. * @brief Get last reset source.
  994. * @param RSTSource:
  995. PMU_RSTSRC_EXTRST
  996. PMU_RSTSRC_PORST
  997. PMU_RSTSRC_DPORST
  998. * @retval 1:status set
  999. 0:status reset
  1000. */
  1001. uint8_t PMU_GetRSTSource(uint32_t RSTSource)
  1002. {
  1003. /* Check parameters */
  1004. assert_parameters(IS_PMU_RSTSRC(RSTSource));
  1005. if (PMU->STS & RSTSource)
  1006. {
  1007. PMU->STS = RSTSource; //Clear flag
  1008. return (1);
  1009. }
  1010. else
  1011. {
  1012. return (0);
  1013. }
  1014. }
  1015. /**
  1016. * @brief Get power status.
  1017. * @param StatusMask:
  1018. PMU_PWRSTS_AVCCLV
  1019. PMU_PWRSTS_VDCINDROP
  1020. PMU_PWRSTS_VDDALARM
  1021. * @retval power status
  1022. * 1 status set
  1023. * 0 status not set
  1024. */
  1025. uint8_t PMU_GetPowerStatus(uint32_t StatusMask)
  1026. {
  1027. if (ANA->COMPOUT & StatusMask)
  1028. return 1;
  1029. else
  1030. return 0;
  1031. }
  1032. /*********************************** END OF FILE ******************************/