打印
[STM32L1]

不能够唤醒

[复制链接]
362|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiahy|  楼主 | 2022-12-3 10:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用STM8L152C6的disovery开发板,想要在Low power下,使用TIM2的Update事件唤醒CPU。我初始化了TIM2,只更改了官方工程中的LPR_Ram函数,但是不能够唤醒

使用特权

评论回复
沙发
jiahy|  楼主 | 2022-12-3 10:39 | 只看该作者

定时器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
  
}
更多操作

使用特权

评论回复
板凳
dingy| | 2022-12-3 10:41 | 只看该作者
STM8L,TIM2没有溢出事件

使用特权

评论回复
地板
jiahy|  楼主 | 2022-12-3 10:43 | 只看该作者
图上没有事件,也没有中断,可是TIM2可以溢出中断的啊

使用特权

评论回复
5
wyjie| | 2022-12-3 10:45 | 只看该作者
但是RM0031 ,379页有overflow event啊

使用特权

评论回复
6
gongche| | 2022-12-3 10:47 | 只看该作者
将CPU从从WFE模式唤醒有两个途径:中断或者wakeup事件。

使用特权

评论回复
7
renyaq| | 2022-12-3 10:49 | 只看该作者
RM0031中描述,由中断唤醒,中断执行完毕后会回到WFE模式。

使用特权

评论回复
8
zhanghqi| | 2022-12-3 10:51 | 只看该作者
即使使用事件唤醒,也要执行TIM2->IER |= 0x1;     //允许中断

使用特权

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

使用特权

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

使用特权

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

使用特权

评论回复
12
dengdc| | 2022-12-3 11:04 | 只看该作者
官方原来的例子可以这么唤醒吗

使用特权

评论回复
13
zhenykun| | 2022-12-3 11:06 | 只看该作者
还没做过st的低功耗

使用特权

评论回复
14
chuxh| | 2022-12-3 11:09 | 只看该作者
楼主检测寄存器状态了吗

使用特权

评论回复
15
dingy| | 2022-12-3 11:11 | 只看该作者
看不出来啥问题啊

使用特权

评论回复
16
supernan| | 2022-12-3 11:15 | 只看该作者
低功耗模式是不是不对啊

使用特权

评论回复
17
songqian17| | 2022-12-3 11:17 | 只看该作者
总中断开启了吗

使用特权

评论回复
18
chuxh| | 2022-12-3 11:22 | 只看该作者
数据手册上说可以吗

使用特权

评论回复
19
renyaq| | 2022-12-3 11:24 | 只看该作者
能看到进入中断吗

使用特权

评论回复
20
wuhany| | 2022-12-3 11:27 | 只看该作者
外部io中断可以唤醒吗

使用特权

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

本版积分规则

862

主题

9861

帖子

4

粉丝