[STM32L1] 不能够唤醒

[复制链接]
2021|25
 楼主| jiahy 发表于 2020-9-29 23:38 | 显示全部楼层 |阅读模式
使用STM8L152C6的disovery开发板,想要在Low power下,使用TIM2的Update事件唤醒CPU。我初始化了TIM2,只更改了官方工程中的LPR_Ram函数,但是不能够唤醒
spark周 发表于 2020-9-29 23:39 | 显示全部楼层
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因
 楼主| jiahy 发表于 2020-9-29 23:40 | 显示全部楼层

定时器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 发表于 2020-9-29 23:41 | 显示全部楼层
STM8L,TIM2没有溢出事件
 楼主| jiahy 发表于 2020-9-29 23:42 | 显示全部楼层
图上没有事件,也没有中断,可是TIM2可以溢出中断的啊
午夜粪车 发表于 2020-9-29 23:43 | 显示全部楼层
但是RM0031 ,379页有overflow event啊
zhaoxqi 发表于 2020-9-29 23:43 | 显示全部楼层
将CPU从从WFE模式唤醒有两个途径:中断或者wakeup事件。
jiajs 发表于 2020-9-29 23:44 | 显示全部楼层
RM0031中描述,由中断唤醒,中断执行完毕后会回到WFE模式。
jiajs 发表于 2020-9-29 23:45 | 显示全部楼层
即使使用事件唤醒,也要执行TIM2->IER |= 0x1;     //允许中断
zhenykun 发表于 2020-9-29 23:46 | 显示全部楼层
到事件后,无需再判断FLASH是否准备好,无需再执行while(((CLK->REGCSR)&0x80) != 0x80);
 楼主| jiahy 发表于 2020-9-29 23:47 | 显示全部楼层
贴的程序里面只需允许TIM2中断即可,只是昨天用的discovery板子,IDD跳线帽跳置ON端导致LED点亮时,有闪烁现象,致使我怀疑程序有问题
wyjie 发表于 2020-9-29 23:48 | 显示全部楼层
只是不清楚为什么从WFE醒来后,不能再判断FLASH是否准备好,不明白
juventus9554 发表于 2020-9-29 23:50 | 显示全部楼层
官方原来的例子可以这么唤醒吗
yinxiangh 发表于 2020-9-29 23:51 | 显示全部楼层

还没做过st的低功耗
dingy 发表于 2020-9-29 23:52 | 显示全部楼层
楼主检测寄存器状态了吗
renyaq 发表于 2020-9-29 23:53 | 显示全部楼层
看不出来啥问题啊
houcs 发表于 2020-9-29 23:54 | 显示全部楼层
低功耗模式是不是不对啊
xxrs 发表于 2020-9-29 23:55 | 显示全部楼层
总中断开启了吗
 楼主| jiahy 发表于 2020-9-29 23:56 | 显示全部楼层

唉,还是没有什么结果,算了,多谢大家啦
wakayi 发表于 2020-10-12 09:40 | 显示全部楼层
数据手册上说可以吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

862

主题

9861

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部