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
11 #include <rthw.h>
12 #include <rtthread.h>
13 #include <rtdevice.h>
14 #include <board.h>
15 /**
16 * This function will put STM32F4xx into sleep mode.
17 *
18 * @param pm pointer to power manage structure
19 */
sleep(struct rt_pm * pm,uint8_t mode)20 static void sleep(struct rt_pm *pm, uint8_t mode)
21 {
22 switch (mode)
23 {
24 case PM_SLEEP_MODE_NONE:
25 break;
26
27 case PM_SLEEP_MODE_IDLE:
28 break;
29
30 case PM_SLEEP_MODE_LIGHT:
31 HAL_SuspendTick(); /* 关闭系统时钟中断 */
32 HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); /* 进入 F407 sleep 模式,这个模式会停掉所有时钟,可被任意中断唤醒 */
33 break;
34
35 case PM_SLEEP_MODE_DEEP:
36 HAL_SuspendTick(); /* 关闭系统时钟中断 */
37 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); /* 进入 F407 stop 模式,这个模式会停掉所有时钟,可被任意中断唤醒 */
38 break;
39
40 case PM_SLEEP_MODE_STANDBY:
41 break;
42
43 case PM_SLEEP_MODE_SHUTDOWN:
44 break;
45
46 default:
47 RT_ASSERT(0);
48 break;
49 }
50 }
51
52 /**
53 * This function will be Called in Wake up interrupt callback
54 *
55 * @param pm pointer to power manage structure
56 */
57
58 static struct rt_device *device = RT_NULL;
59 static struct rt_pm *pm = RT_NULL;
60
pm_wk_up()61 void pm_wk_up()
62 {
63
64 switch (pm->sleep_mode)
65 {
66 case PM_SLEEP_MODE_NONE:
67 break;
68
69 case PM_SLEEP_MODE_IDLE:
70 break;
71
72 case PM_SLEEP_MODE_LIGHT:
73 HAL_ResumeTick(); /* 启动系统时钟中断 */
74 break;
75
76 case PM_SLEEP_MODE_DEEP:
77 SystemClock_Config(); /* 重新配置系统时钟 */
78 HAL_ResumeTick(); /* 启动系统时钟中断 */
79 break;
80
81 case PM_SLEEP_MODE_STANDBY:
82 break;
83
84 case PM_SLEEP_MODE_SHUTDOWN:
85 break;
86
87 default:
88 RT_ASSERT(0);
89 break;
90 }
91
92 }
93
94 /**
95 * This function initialize the power manager
96 */
drv_pm_hw_init(void)97 static int drv_pm_hw_init(void)
98 {
99 static const struct rt_pm_ops _ops =
100 {
101 sleep,
102 RT_NULL,
103 RT_NULL,
104 RT_NULL,
105 RT_NULL
106 };
107
108 /* initialize system pm module */
109 rt_system_pm_init(&_ops, 0, RT_NULL);
110
111 /* get pm device */
112 device = rt_device_find("pm");
113 if(device == RT_NULL)
114 {
115 rt_kprintf("rt_pm find error");
116 return 0;
117 }
118 pm = rt_container_of(device,struct rt_pm,parent);
119 return 1;
120 }
121 INIT_DEVICE_EXPORT(drv_pm_hw_init);
122