first
This commit is contained in:
121
board/ports/pm/drv_pm.c
Normal file
121
board/ports/pm/drv_pm.c
Normal file
@@ -0,0 +1,121 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-07-31 tanek first version
|
||||
*/
|
||||
|
||||
#include <rthw.h>
|
||||
#include <rtthread.h>
|
||||
#include <rtdevice.h>
|
||||
#include <board.h>
|
||||
/**
|
||||
* This function will put STM32F4xx into sleep mode.
|
||||
*
|
||||
* @param pm pointer to power manage structure
|
||||
*/
|
||||
static void sleep(struct rt_pm *pm, uint8_t mode)
|
||||
{
|
||||
switch (mode)
|
||||
{
|
||||
case PM_SLEEP_MODE_NONE:
|
||||
break;
|
||||
|
||||
case PM_SLEEP_MODE_IDLE:
|
||||
break;
|
||||
|
||||
case PM_SLEEP_MODE_LIGHT:
|
||||
HAL_SuspendTick(); /* 关闭系统时钟中断 */
|
||||
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); /* 进入 F407 sleep 模式,这个模式会停掉所有时钟,可被任意中断唤醒 */
|
||||
break;
|
||||
|
||||
case PM_SLEEP_MODE_DEEP:
|
||||
HAL_SuspendTick(); /* 关闭系统时钟中断 */
|
||||
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); /* 进入 F407 stop 模式,这个模式会停掉所有时钟,可被任意中断唤醒 */
|
||||
break;
|
||||
|
||||
case PM_SLEEP_MODE_STANDBY:
|
||||
break;
|
||||
|
||||
case PM_SLEEP_MODE_SHUTDOWN:
|
||||
break;
|
||||
|
||||
default:
|
||||
RT_ASSERT(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This function will be Called in Wake up interrupt callback
|
||||
*
|
||||
* @param pm pointer to power manage structure
|
||||
*/
|
||||
|
||||
static struct rt_device *device = RT_NULL;
|
||||
static struct rt_pm *pm = RT_NULL;
|
||||
|
||||
void pm_wk_up()
|
||||
{
|
||||
|
||||
switch (pm->sleep_mode)
|
||||
{
|
||||
case PM_SLEEP_MODE_NONE:
|
||||
break;
|
||||
|
||||
case PM_SLEEP_MODE_IDLE:
|
||||
break;
|
||||
|
||||
case PM_SLEEP_MODE_LIGHT:
|
||||
HAL_ResumeTick(); /* 启动系统时钟中断 */
|
||||
break;
|
||||
|
||||
case PM_SLEEP_MODE_DEEP:
|
||||
SystemClock_Config(); /* 重新配置系统时钟 */
|
||||
HAL_ResumeTick(); /* 启动系统时钟中断 */
|
||||
break;
|
||||
|
||||
case PM_SLEEP_MODE_STANDBY:
|
||||
break;
|
||||
|
||||
case PM_SLEEP_MODE_SHUTDOWN:
|
||||
break;
|
||||
|
||||
default:
|
||||
RT_ASSERT(0);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* This function initialize the power manager
|
||||
*/
|
||||
static int drv_pm_hw_init(void)
|
||||
{
|
||||
static const struct rt_pm_ops _ops =
|
||||
{
|
||||
sleep,
|
||||
RT_NULL,
|
||||
RT_NULL,
|
||||
RT_NULL,
|
||||
RT_NULL
|
||||
};
|
||||
|
||||
/* initialize system pm module */
|
||||
rt_system_pm_init(&_ops, 0, RT_NULL);
|
||||
|
||||
/* get pm device */
|
||||
device = rt_device_find("pm");
|
||||
if(device == RT_NULL)
|
||||
{
|
||||
rt_kprintf("rt_pm find error");
|
||||
return 0;
|
||||
}
|
||||
pm = rt_container_of(device,struct rt_pm,parent);
|
||||
return 1;
|
||||
}
|
||||
INIT_DEVICE_EXPORT(drv_pm_hw_init);
|
44
board/ports/pm/drv_wakeup.c
Normal file
44
board/ports/pm/drv_wakeup.c
Normal file
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-08-07 Tanek first implementation
|
||||
*/
|
||||
|
||||
#include <rtthread.h>
|
||||
#include <rtdevice.h>
|
||||
#include <stm32F4xx.h>
|
||||
#include "board.h"
|
||||
#include "drv_gpio.h"
|
||||
|
||||
#define USER_WAKEUP_PIN GET_PIN(C, 5)
|
||||
#define DRV_WKUP_PIN_IRQ_MODE PIN_IRQ_MODE_FALLING
|
||||
|
||||
static void (*_wakeup_hook)(void);
|
||||
|
||||
void bsp_register_wakeup(void (*hook)(void))
|
||||
{
|
||||
RT_ASSERT(hook != RT_NULL);
|
||||
|
||||
_wakeup_hook = hook;
|
||||
}
|
||||
|
||||
static void _wakeup_callback(void *args)
|
||||
{
|
||||
extern void pm_wk_up();
|
||||
pm_wk_up(); /* wakeup from deep sleep */
|
||||
if (_wakeup_hook)
|
||||
_wakeup_hook();
|
||||
}
|
||||
|
||||
static int rt_hw_wakeup_init(void)
|
||||
{
|
||||
rt_pin_mode(USER_WAKEUP_PIN, PIN_MODE_INPUT_PULLUP);
|
||||
rt_pin_attach_irq(USER_WAKEUP_PIN, DRV_WKUP_PIN_IRQ_MODE, _wakeup_callback, RT_NULL);
|
||||
rt_pin_irq_enable(USER_WAKEUP_PIN, 1);
|
||||
return 0;
|
||||
}
|
||||
INIT_BOARD_EXPORT(rt_hw_wakeup_init);
|
17
board/ports/pm/drv_wakeup.h
Normal file
17
board/ports/pm/drv_wakeup.h
Normal file
@@ -0,0 +1,17 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2018-08-07 Tanek first implementation
|
||||
*/
|
||||
|
||||
#ifndef __DRV_WAKEUP_H__
|
||||
#define __DRV_WAKEUP_H__
|
||||
|
||||
extern void bsp_register_wakeup(void (*hook)(void));
|
||||
|
||||
#endif /* __DRV_WAKEUP_H__ */
|
||||
|
Reference in New Issue
Block a user