目前程序RTC使用外部32.768晶振,工作正常。程序也可以控制进入VLLS1低功耗模式,现在想通过RTC定时将KL27从VLLS1中唤醒。试了一直不成功。程序如下。
void Clock_Init( ) // 时钟初始化
{
MCG_C2 |= MCG_C2_EREFS0_MASK;
MCG_C1 &= ~MCG_C1_CLKS_MASK;
MCG_C1 |= MCG_C1_CLKS(2);
while(!(MCG_S & 0x08));
}
void System_VLLS1() // 切换到VLLS1函数
{
volatile unsigned int dummyread;
SMC_STOPCTRL |= 0x01;
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
SMC_PMCTRL &= ~SMC_PMCTRL_STOPM_MASK;
SMC_PMCTRL |= SMC_PMCTRL_STOPM(0x04);
dummyread = SMC_PMCTRL;
while((dummyread &0x07) != 0x04);
SMC_STOPCTRL &= ~SMC_STOPCTRL_VLLSM_MASK;
asm("WFI");
}
void RTC_Init(U8 Clkout) // RTC初始化
{
SIM_SOPT1 &= ~SIM_SOPT1_OSC32KSEL_MASK; // 选择OSC32KCLK作为RTC时钟, 也就是ERCLK32K
SIM_SOPT1 &= ~SIM_SOPT1_OSC32KOUT_MASK;
if(Clkout ==1)
{
SIM_SOPT1 |= SIM_SOPT1_OSC32KOUT(1); // 选择ERCLK32K输出到PTE0管脚。
port_Init(Battery_Monitor_Control, ALT4);
GPIO_Init(KEY_i,OUT,LOW);
}
SIM_SCGC6 |= SIM_SCGC6_RTC_MASK; // 使能RTC时钟
RTC_SR &= ~RTC_SR_TCE_MASK; // 复位RTC时钟步骤1 停止RTC计数
RTC_SR |= RTC_CR_SWR_MASK; // 复位RTC时钟步骤2
RTC_SR &= ~RTC_CR_SWR_MASK; // 复位RTC时钟步骤3
RTC_TSR = 1; // 给RTC计数器TSR赋初值
RTC_SR |= RTC_SR_TCE_MASK; // 开始RTC计数
RTC_SR &= ~RTC_SR_TIF_MASK;
RTC_CR |= RTC_CR_OSCE_MASK; // 使能32.768时钟
RTC_TAR = 3; // 每隔3秒钟产生一次alarm
RTC_IER |= RTC_IER_TAIE_MASK; // RTC alarm中断使能
LLWU_ME |= LLWU_ME_WUME5_MASK; // RTC alarm低漏唤醒使能
}
void main(void)
{
Board_Init();
Clock_Init(); //时钟初始化
RTC_Init(); //RTC初始化
RTC_SR &= ~RTC_SR_TAF_MASK; // 清RTC中断标志
INT_SYS_InstallHandler(LLWU_IRQn, IRQ_handler_LLWU);
INT_SYS_EnableIRQ(LLWU_IRQn); // LLWU中断使能
System_Mode_Switch(); // 进入VLLS1模式
}
void IRQ_handler_LLWU() // LLWU 中断处理程序
{
static U8 temp = 0;
RTC_SR &= ~RTC_SR_TAF_MASK; // 清RTC中断标志位
RTC_TAR += 3; // 设置产生下一次中断的时间间隔
if(temp == 0) // 测试,每次进入中断后将PTA2管脚翻转一次
{
Set_GPIOX_Value(KEY_i, LOW);
temp = 1;
}
else
{
Set_GPIOX_Value(KEY_i, HIGH);
temp = 0;
}
System_Mode_Switch(VLLS1); // 执行完重新进入VLLS1模式
} |