打印
[STM32L1]

不能够唤醒

[复制链接]
1072|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiahy|  楼主 | 2016-9-28 20:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用STM8L152C6的disovery开发板,想要在Low power下,使用TIM2的Update事件唤醒CPU。我初始化了TIM2,只更改了官方工程中的LPR_Ram函数,但是不能够唤醒
沙发
spark周| | 2016-9-28 20:58 | 只看该作者
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
jiahy|  楼主 | 2016-9-28 20:59 | 只看该作者

定时器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
  
}

使用特权

评论回复
地板
liliang9554| | 2016-9-28 20:59 | 只看该作者
STM8L,TIM2没有溢出事件

使用特权

评论回复
5
jiahy|  楼主 | 2016-9-28 20:59 | 只看该作者
图上没有事件,也没有中断,可是TIM2可以溢出中断的啊

使用特权

评论回复
6
午夜粪车| | 2016-9-28 20:59 | 只看该作者
但是RM0031 ,379页有overflow event啊

使用特权

评论回复
7
zhaoxqi| | 2016-9-28 21:00 | 只看该作者
将CPU从从WFE模式唤醒有两个途径:中断或者wakeup事件。

使用特权

评论回复
8
jiajs| | 2016-9-28 21:00 | 只看该作者
RM0031中描述,由中断唤醒,中断执行完毕后会回到WFE模式。

使用特权

评论回复
9
jiajs| | 2016-9-28 21:01 | 只看该作者
即使使用事件唤醒,也要执行TIM2->IER |= 0x1;     //允许中断

使用特权

评论回复
10
zhenykun| | 2016-9-28 21:01 | 只看该作者
到事件后,无需再判断FLASH是否准备好,无需再执行while(((CLK->REGCSR)&0x80) != 0x80);

使用特权

评论回复
11
jiahy|  楼主 | 2016-9-28 21:01 | 只看该作者
贴的程序里面只需允许TIM2中断即可,只是昨天用的discovery板子,IDD跳线帽跳置ON端导致LED点亮时,有闪烁现象,致使我怀疑程序有问题

使用特权

评论回复
12
wyjie| | 2016-9-28 21:02 | 只看该作者
只是不清楚为什么从WFE醒来后,不能再判断FLASH是否准备好,不明白

使用特权

评论回复
13
jiahy|  楼主 | 2016-9-28 21:02 | 只看该作者
嗯,我再好好缕一缕吧,有了好消息及时通知大家,结贴喽

使用特权

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

本版积分规则

862

主题

9861

帖子

4

粉丝