打印
[STM8]

STM8L152,如何使用TIM2+WFE唤醒CPU

[复制链接]
2720|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
风云天下|  楼主 | 2015-11-16 18:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我使用STM8L152C6的disovery开发板,想要在Low power下,使用TIM2的Update事件唤醒CPU。我初始化了TIM2,只更改了官方工程中的LPR_Ram函数,但是不能够唤醒,代码如下(使用IAR开发):
定时器2初始化部分:
void ext_TIM2_Config(uint8_t mode)
{
  CLK->PCKENR1 |= 0x1;    // tim2
  TIM2->CR1 = 0x00;
  if(mode == 0)
  {
    //CLK:8MHz  1Hz
    TIM2->PSCR = 0x7;
    TIM2->CNTRH = 0;
    TIM2->CNTRL = 0;
    TIM2->ARRH = 62500u >> 8;
    TIM2->ARRL = 62500u & 0xFF;
    TIM2->IER |= 0x1;     //允许中断
  }
  else
  {
    //CLK:38K    1Hz
    TIM2->PSCR = 0x0;
    TIM2->CNTRH = 0;
    TIM2->CNTRL = 0;
    TIM2->ARRH = 38000u >> 8;
    TIM2->ARRL = 38000u & 0xFF;
    TIM2->IER &= ~0x1;    //不允许中断
    //TIM2->IER |= 0x1;
  }
#ifdef _COSMIC_
#pragma section (LPRUN)
void        LPR_Ram(void)
#endif
#ifdef _RAISONANCE_
void        LPR_Ram(void) inram
#endif
#ifdef _IAR_
#pragma location="MY_RAM_FUNC"
void        LPR_Ram(void)
#endif
{
  
#if 0  
  uint8_t i = 0;

/* To reduce consumption to minimal
  Swith off the Flash */
  FLASH->CR1 = 0x08;
  while(((CLK->REGCSR)&0x80)==0x80);
       
/* Swith off the Regulator*/
  CLK->REGCSR = 0x02;
  while(((CLK->REGCSR)&0x01)==0x01);

/* Set trigger on GPIOE pin6*/
  WFE->CR2 = 0x04;
  GPIOE->CR2 = 0x44;
  
  for (i=0; i<100; i++);

/* To start counter on falling edge*/
  GPIO_LOW(CTN_GPIO_PORT,CTN_CNTEN_GPIO_PIN);
  
/*Wait for end of counter */
  wfe();
  GPIOC->ODR ^= 0x80;
  EXTI->SR1 |= 0x40;
  WFE->CR2 = 0x00;
  
  //Switch on the regulator
  CLK->REGCSR = 0x00;
  while(((CLK->REGCSR)&0x1) != 0x1);
#else
  uint8_t i;
  FLASH->CR1 = 0x08;
  while(((CLK->REGCSR)&0x80)==0x80);
       
  CLK->REGCSR = 0x02;
  while(((CLK->REGCSR)&0x01)==0x01);

// -------------------------------------------------------
  WFE->CR1 = 0x01;    // tim2 wakeup update
  CLK->PCKENR1 |= 0x1;
  TIM2->CR1 |= 0x1;  
  //使能唤醒
  //for(i = 0;i < 100;i++);
  wfe();
  GPIOC->ODR ^= 0x80;
  //禁止唤醒
  TIM2->SR1 &= ~0x1;
  WFE->CR1 = 0x00;
  //---------------------------------------------------------
  
  //Switch on the regulator
  CLK->REGCSR = 0x00;
  while(((CLK->REGCSR)&0x1) != 0x1);
#endif
  
}
沙发
风云天下|  楼主 | 2015-11-17 11:43 | 只看该作者
找到问题了,STM8L,TIM2没有溢出事件,请看下图(图传不上,请参考RM0031,380页)

使用特权

评论回复
板凳
foxglove| | 2015-11-17 11:47 | 只看该作者
风云天下 发表于 2015-11-17 11:43
找到问题了,STM8L,TIM2没有溢出事件,请看下图(图传不上,请参考RM0031,380页)
...


找到问题了,STM8L,TIM2没有溢出事件,请看下图(图传不上,请参考RM0031,380页)

使用特权

评论回复
地板
风云天下|  楼主 | 2015-11-17 11:50 | 只看该作者
可也不对,图上没有事件,也没有中断,可是TIM2可以溢出中断的啊!!!!

使用特权

评论回复
5
风云天下|  楼主 | 2015-11-17 11:54 | 只看该作者
但是RM0031 ,379页有overflow event啊

使用特权

评论回复
6
amanda_s| | 2015-11-17 14:47 | 只看该作者
将CPU从从WFE模式唤醒有两个途径:中断或者wakeup事件。
RM0031中描述,由中断唤醒,中断执行完毕后会回到WFE模式。
楼主看看是不是这里的问题。

使用特权

评论回复
7
风云天下|  楼主 | 2015-11-17 15:28 | 只看该作者
@amanda_s,谢谢。我找到问题了,1,即使使用事件唤醒,也要执行TIM2->IER |= 0x1;     //允许中断;2,等到事件后,无需再判断FLASH是否准备好,无需再执行while(((CLK->REGCSR)&0x80) != 0x80);
我1楼贴的程序里面只需允许TIM2中断即可,只是昨天用的discovery板子,IDD跳线帽跳置ON端导致LED点亮时,有闪烁现象,致使我怀疑程序有问题。谢谢

使用特权

评论回复
8
风云天下|  楼主 | 2015-11-17 15:28 | 只看该作者
只是不清楚为什么从WFE醒来后,不能再判断FLASH是否准备好,不明白

使用特权

评论回复
9
exson_2006| | 2015-11-17 15:30 | 只看该作者
学习学习

使用特权

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

本版积分规则

1

主题

8

帖子

0

粉丝