打印
[Kinetis]

KL27怎样使用RTC作为VLLS1的唤醒源?

[复制链接]
829|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dfr3602|  楼主 | 2017-3-4 14:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
RTC, ST, TE, SIM, SMC
目前程序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模式
}

相关帖子

沙发
dfr3602|  楼主 | 2017-3-4 14:35 | 只看该作者
或者有没有这方面的例程学习下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

59

帖子

1

粉丝