lib_pmu.c 30 KB

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