打印
[STM32L1]

不能够唤醒

[复制链接]
1558|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没有溢出事件

使用特权

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

使用特权

评论回复
6
午夜粪车| | 2020-9-29 23:43 | 只看该作者
但是RM0031 ,379页有overflow event啊

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

评论回复
13
juventus9554| | 2020-9-29 23:50 | 只看该作者
官方原来的例子可以这么唤醒吗

使用特权

评论回复
14
yinxiangh| | 2020-9-29 23:51 | 只看该作者

还没做过st的低功耗

使用特权

评论回复
15
dingy| | 2020-9-29 23:52 | 只看该作者
楼主检测寄存器状态了吗

使用特权

评论回复
16
renyaq| | 2020-9-29 23:53 | 只看该作者
看不出来啥问题啊

使用特权

评论回复
17
houcs| | 2020-9-29 23:54 | 只看该作者
低功耗模式是不是不对啊

使用特权

评论回复
18
xxrs| | 2020-9-29 23:55 | 只看该作者
总中断开启了吗

使用特权

评论回复
19
jiahy|  楼主 | 2020-9-29 23:56 | 只看该作者

唉,还是没有什么结果,算了,多谢大家啦

使用特权

评论回复
20
wakayi| | 2020-10-12 09:40 | 只看该作者
数据手册上说可以吗

使用特权

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

本版积分规则

862

主题

9861

帖子

4

粉丝