📄 pmu.c
字号:
/******************** (C) COPYRIGHT 2010 Embest Info&Tech Co.,LTD. ************
* 文件名: pmu.c
* 作者 : Wuhan R&D Center, Embest
* 日期 : 01/18/2010
* 描述 : PMU相关的函数实现.
*******************************************************************************
*******************************************************************************
* 历史:
* 01/18/2010 : V1.0 初始版本
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
/* LPC11xx 外设定以 */
#include "LPC11xx.h"
#include "type.h"
#include "gpio.h"
#include "pmu.h"
volatile uint32_t pmu_counter = 0;
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/**
* @函数名:WAKEUP_IRQHandler
* @描述:唤醒中断例程
* @参数: 无
* @返回值:无
*/
void WAKEUP_IRQHandler(void)
{
uint32_t regVal;
/* 这个例程需要仔细注意管脚,如果它们被配置为唤醒源。 */
regVal = LPC_SYSCON->STARTSRP0;
if ( regVal != 0 )
{
LPC_SYSCON->STARTRSRP0CLR = regVal;
}
regVal = LPC_SYSCON->MAINCLKSEL;
if ( regVal != 0 )
{
LPC_SYSCON->MAINCLKUEN = regVal;
}
/* 为bug报告设置追踪点。 */
__NOP();
return;
}
/**
* @函数名:PMU_Init
* @描述:初始化PMU和建立唤醒源。对于睡眠或是深度睡眠的,任何I/O管脚都可以作为
* @ 唤醒源。对于处在深度低功耗模式下的时候,只有管脚P1.4可以被用作唤醒源
* @参数: 无
* @返回值:无
*/
void PMU_Init( void )
{
uint32_t i;
/* 使能所有的时钟,即使这些时钟在上电的时候被关掉。 */
LPC_SYSCON->PDRUNCFG &= ~(WDT_OSC_PD|SYS_OSC_PD|ADC_PD);
for ( i = 0; i < NUM_OF_WAKESOURCE; i++ )
{
NVIC_EnableIRQ((IRQn_Type)(WAKEUP0_IRQn+i));
}
/* 使用port0_1作为唤醒源的i/o管脚 */
LPC_IOCON->PIO0_1 &= ~0x07;
LPC_IOCON->PIO0_1 |= 0x20;
GPIOSetDir( PORT0, 1, 0 ); /* Input P0.1 */
/* 只是边界触发。在P0.1管脚上的激活极性是下降沿。 */
LPC_SYSCON->STARTAPRP0 = 0x00000000;
/* 清除所有的唤醒源 */
LPC_SYSCON->STARTRSRP0CLR = 0xFFFFFFFF;
LPC_SYSCON->MAINCLKUEN = 0xFFFFFFFF;
/* 使能Port 0.1作为唤醒源。 */
LPC_SYSCON->STARTERP0 = 0x1<<1;
return;
}
/**
* @函数名:PMU_Sleep
* @描述:使某些外设进入睡眠模式
* @参数: 睡眠模式:1是深度睡眠,0是睡眠,睡眠外设模块
* @返回值:无
*/
void PMU_Sleep( uint32_t SleepMode, uint32_t SleepCtrl )
{
LPC_SYSCON->PDAWAKECFG = LPC_SYSCON->PDRUNCFG;
LPC_SYSCON->PDSLEEPCFG = SleepCtrl;
/* 如果是正常的睡眠模式,不是深度睡眠,不需要对SCR寄存器做任何事情。 */
if ( SleepMode )
{
SCB->SCR |= NVIC_LP_SLEEPDEEP;
}
__WFI();
return;
}
/**
* @函数名:PMU_PowerDown
* @描述:在深度掉电到被唤醒过程中某些内容是不应该碰触的
* @参数: 无
* @返回值:无
*/
void PMU_PowerDown( void )
{
uint32_t regVal;
if ( (LPC_PMU->PCON & ((0x1<<8) | (0x1<<11))) != 0x0 )
{
/* 检查睡眠和深度掉电位。如果是进入了睡眠和/或深度掉电模式,清除PCON上的位. */
regVal = LPC_PMU->PCON;
regVal |= ((0x1<<8) | (0x1<<11));
LPC_PMU->PCON = regVal;
if ( (LPC_PMU->GPREG0 != 0x12345678)||(LPC_PMU->GPREG1 != 0x87654321)
||(LPC_PMU->GPREG2 != 0x56781234)||(LPC_PMU->GPREG3 != 0x43218765) )
{
while (1);
}
}
else
{
/* 如果进入的既不是睡眠也不是深度供电模式,进入的是深度掉电模式。 */
LPC_PMU->GPREG0 = 0x12345678;
LPC_PMU->GPREG1 = 0x87654321;
LPC_PMU->GPREG2 = 0x56781234;
LPC_PMU->GPREG3 = 0x43218765;
SCB->SCR |= NVIC_LP_SLEEPDEEP;
LPC_PMU->PCON = 0x2;
__WFI();
}
return;
}
/**
* @}
*/
/**
* @}
*/
/************* (C) COPYRIGHT 2010 Wuhan R&D Center, Embest *****文件结束*******/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -