drv_pm.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-07-31 tanek first version
  9. */
  10. #include <rthw.h>
  11. #include <rtthread.h>
  12. #include <rtdevice.h>
  13. #include <board.h>
  14. /**
  15. * This function will put STM32F4xx into sleep mode.
  16. *
  17. * @param pm pointer to power manage structure
  18. */
  19. static void sleep(struct rt_pm *pm, uint8_t mode)
  20. {
  21. switch (mode)
  22. {
  23. case PM_SLEEP_MODE_NONE:
  24. break;
  25. case PM_SLEEP_MODE_IDLE:
  26. break;
  27. case PM_SLEEP_MODE_LIGHT:
  28. HAL_SuspendTick(); /* 关闭系统时钟中断 */
  29. HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); /* 进入 F407 sleep 模式,这个模式会停掉所有时钟,可被任意中断唤醒 */
  30. break;
  31. case PM_SLEEP_MODE_DEEP:
  32. HAL_SuspendTick(); /* 关闭系统时钟中断 */
  33. HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); /* 进入 F407 stop 模式,这个模式会停掉所有时钟,可被任意中断唤醒 */
  34. break;
  35. case PM_SLEEP_MODE_STANDBY:
  36. break;
  37. case PM_SLEEP_MODE_SHUTDOWN:
  38. break;
  39. default:
  40. RT_ASSERT(0);
  41. break;
  42. }
  43. }
  44. /**
  45. * This function will be Called in Wake up interrupt callback
  46. *
  47. * @param pm pointer to power manage structure
  48. */
  49. static struct rt_device *device = RT_NULL;
  50. static struct rt_pm *pm = RT_NULL;
  51. void pm_wk_up()
  52. {
  53. switch (pm->sleep_mode)
  54. {
  55. case PM_SLEEP_MODE_NONE:
  56. break;
  57. case PM_SLEEP_MODE_IDLE:
  58. break;
  59. case PM_SLEEP_MODE_LIGHT:
  60. HAL_ResumeTick(); /* 启动系统时钟中断 */
  61. break;
  62. case PM_SLEEP_MODE_DEEP:
  63. SystemClock_Config(); /* 重新配置系统时钟 */
  64. HAL_ResumeTick(); /* 启动系统时钟中断 */
  65. break;
  66. case PM_SLEEP_MODE_STANDBY:
  67. break;
  68. case PM_SLEEP_MODE_SHUTDOWN:
  69. break;
  70. default:
  71. RT_ASSERT(0);
  72. break;
  73. }
  74. }
  75. /**
  76. * This function initialize the power manager
  77. */
  78. static int drv_pm_hw_init(void)
  79. {
  80. static const struct rt_pm_ops _ops =
  81. {
  82. sleep,
  83. RT_NULL,
  84. RT_NULL,
  85. RT_NULL,
  86. RT_NULL
  87. };
  88. /* initialize system pm module */
  89. rt_system_pm_init(&_ops, 0, RT_NULL);
  90. /* get pm device */
  91. device = rt_device_find("pm");
  92. if(device == RT_NULL)
  93. {
  94. rt_kprintf("rt_pm find error");
  95. return 0;
  96. }
  97. pm = rt_container_of(device,struct rt_pm,parent);
  98. return 1;
  99. }
  100. INIT_DEVICE_EXPORT(drv_pm_hw_init);