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