在线时间20 小时
UID383154
注册时间2017-10-13
NXP金币0
该用户从未签到
注册会员

- 积分
- 96
- 最后登录
- 2018-3-13
|

楼主 |
发表于 2017-12-14 17:31:38
|
显示全部楼层
我使用的是keil开发的,另外整个工程涉及到项目部分代码,不方便提供。我就把我目前使用到的代码给你吧,其他的我也没有用上,测试的时候屏蔽了。程序的流程是上电时钟初始化->PMC初始化->进入STOP3模式。
上电时钟初始化,使用外部晶振
// 系统时钟初始化,使用外部晶振,总线频率20MHz
void SysClockInit(void)
{
#if USEINTERCLOCK_EN
ICS_C1|=ICS_C1_IRCLKEN_MASK; /* Enable the internal reference clock*/
ICS_C3= 0x90; /* Reference clock frequency = 31.25 KHz*/
while(!(ICS_S & ICS_S_LOCK_MASK)); /* Wait for PLL lock, now running at 40 MHz (1280 * 31.25Khz) */
ICS_C2|=ICS_C2_BDIV(1); /*BDIV=2, Bus clock = 20 MHz*/
ICS_S |= ICS_S_LOCK_MASK; /* Clear Loss of lock sticky bit */
#else
// 使用外部晶振,总线20MHz
ICS_ConfigType ICS_set={0}; /* Declaration of ICS_setup structure */
ICS_set.u8ClkMode=ICS_CLK_MODE_FEE;
ICS_set.bdiv = 0;// 1分频
ICS_set.oscConfig.bRange = 1; // high range
ICS_set.oscConfig.bGain = 0; // 高增益
ICS_set.oscConfig.bEnable = 1; // 使能
ICS_set.oscConfig.bStopEnable = 0;// 停止模式下失能
ICS_set.oscConfig.bIsCryst = 1;// 晶振输入
ICS_set.oscConfig.bWaitInit = 1;// 等待晶振初始化完成
ICS_set.oscConfig.u32OscFreq = EXTERNAL_CRYSTAL;
ICS_Init(&ICS_set);
#endif
}
PMC初始化
/* PMC Initialization */
PMC_ConfigType PMC_Config={{0}};
PMC_Config.sCtrlstatus.bits.bBandgapEn = 0; /* Enable Bandgap buffer */
PMC_Config.sCtrlstatus.bits.bLvdStopEn = 0; /* Disable Low-Voltage Detect(LVD) in Stop mode */
PMC_Config.sCtrlstatus.bits.bLvdRstEn = 0; /* LVD events do not generate hardware resets. */
PMC_Init(PMC, &PMC_Config); /* Initialization of PMC */
PMC_DisableLVWInterrupt(PMC); /* Disable hardware interrupt requests for LVWF */
uint8_t Ch = PMC_GetLVWFlag(PMC); /* Get the lvw warning flag */
进入stop3
void PMC_SetMode(PMC_Type *pPMC,uint8_t u8PmcMode)
{
switch(u8PmcMode & 0x3)
{
case PmcModeRun:
break;
case PmcModeWait:
/* Clear the SLEEPDEEP bit to make sure we go into WAIT (sleep) mode instead
* of deep sleep.
*/
SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;
/* Not using KEIL's uVision, so use the standard assembly command */
//asm("WFI");
__asm("WFI");
break;
case PmcModeStop4:
/* enable LVD in stop mode */
pPMC->SPMSC1 |= (PMC_SPMSC1_LVDE_MASK | PMC_SPMSC1_LVDSE_MASK);
/* Set the SLEEPDEEP bit to enable deep sleep mode (STOP) */
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
/* Not using KEIL's uVision, so use the standard assembly command */
//asm("WFI");
__asm("WFI");
break;
case PmcModeStop3:
/* disable LVD in stop mode */
pPMC->SPMSC1 &= ~(PMC_SPMSC1_LVDE_MASK | PMC_SPMSC1_LVDRE_MASK | PMC_SPMSC1_LVDSE_MASK);
/* Set the SLEEPDEEP bit to enable deep sleep mode (STOP) */
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
/* Not using KEIL's uVision, so use the standard assembly command */
//asm("WFI");
__asm("WFI");
break;
default:
break;
}
}
|
|