ciu32f003_std_pmu.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /************************************************************************************************/
  2. /**
  3. * @file ciu32f003_std_pmu.c
  4. * @author MCU Ecosystem Development Team
  5. * @brief PMU STD库驱动。
  6. * 实现低功耗模式进入功能API。
  7. *
  8. *
  9. **************************************************************************************************
  10. * @attention
  11. * Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
  12. *
  13. **************************************************************************************************
  14. */
  15. /************************************************************************************************/
  16. /**
  17. * @addtogroup CIU32F003_STD_Driver
  18. * @{
  19. */
  20. /**
  21. * @addtogroup PMU
  22. * @{
  23. *
  24. */
  25. /************************************************************************************************/
  26. /*------------------------------------------includes--------------------------------------------*/
  27. #include "ciu32f003_std.h"
  28. #ifdef STD_PMU_PERIPHERAL_USED
  29. /*-------------------------------------------functions------------------------------------------*/
  30. /************************************************************************************************/
  31. /**
  32. * @addtogroup PMU_External_Functions
  33. * @{
  34. *
  35. */
  36. /************************************************************************************************/
  37. /**
  38. * @brief 进入sleep模式
  39. * @param mode_entry 进入低功耗模式的方式
  40. * @arg PMU_ENTRY_LOWPOWER_MODE_WFE
  41. * @arg PMU_ENTRY_LOWPOWER_MODE_WFI
  42. * @retval 无
  43. */
  44. void std_pmu_enter_sleep(uint32_t mode_entry)
  45. {
  46. /* 清除 SLEEPDEEP 标志 */
  47. SCB->SCR &= (~SCB_SCR_SLEEPDEEP_Msk);
  48. /* 处理低功耗模式的进入方式*/
  49. if(PMU_ENTRY_LOWPOWER_MODE_WFI == mode_entry)
  50. {
  51. __WFI();
  52. }
  53. else
  54. {
  55. /* 先生成一个事件,通过WFE清除事件,重新调用WFE进入低功耗模式*/
  56. __SEV();
  57. __WFE();
  58. __WFE();
  59. }
  60. }
  61. /**
  62. * @brief 进入stop/Deepstop模式
  63. * @param stop_mode 低功耗模式选择
  64. * @arg PMU_MODE_STOP
  65. * @arg PMU_MODE_DEEPSTOP
  66. * @param mode_entry 进入低功耗模式的方式
  67. * @arg PMU_ENTRY_LOWPOWER_MODE_WFE
  68. * @arg PMU_ENTRY_LOWPOWER_MODE_WFI
  69. * @retval 无
  70. */
  71. void std_pmu_enter_stop(uint32_t stop_mode, uint32_t mode_entry)
  72. {
  73. std_rcc_apb1_clk_enable(RCC_PERIPH_CLK_PMU);
  74. /* 配置低功耗模式 */
  75. MODIFY_REG(PMU->CR, PMU_CR_LP_MODE, stop_mode);
  76. /* 置位SLEEPDEEP标志 */
  77. SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
  78. /* 处理低功耗模式的进入方式*/
  79. if(PMU_ENTRY_LOWPOWER_MODE_WFI == mode_entry)
  80. {
  81. __WFI();
  82. }
  83. else
  84. {
  85. /* 先生成一个事件,通过WFE清除事件,重新调用WFE进入低功耗模式*/
  86. __SEV();
  87. __WFE();
  88. __WFE();
  89. }
  90. /* 还原SLEEPDEEP标志 */
  91. SCB->SCR &= (~SCB_SCR_SLEEPDEEP_Msk);
  92. }
  93. /**
  94. * @}
  95. */
  96. #endif /* STD_PMU_PERIPHERAL_USED */
  97. /**
  98. * @}
  99. */
  100. /**
  101. * @}
  102. */