⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pmu.c

📁 基于MDK的LPC1100处理器开发应用例程
💻 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 + -