打印

求助 睡眠模式没唤醒

[复制链接]
3988|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
star143133|  楼主 | 2012-3-13 14:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
int main(void)
{  
  /* Clock configuration */
  RCC_Configuration();
  /* Enable PWR and BKP clock */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
  /* GPIO configuration */
  GPIO_Configuration();
  /* Configure EXTI Line9 to generate an interrupt on falling edge */
  EXTI_Configuration();
  /* Configure RTC clock source and prescaler */
  RTC_Configuration();
  /* NVIC configuration */
  NVIC_Configuration();
  /* Configure the SysTick to generate an interrupt each 1 millisecond */
  SysTick_Configuration();
  
    /* Alarm in 3 second */
          RTC_SetAlarm(RTC_GetCounter()+ 3); //3秒钟后把MCU从睡眠模式唤醒
          RTC_WaitForLastTask();
    PWR_EnterSLEEPMode(0x01, PWR_SLEEPEntry_WFI);
  while(1)
  {
  }
}
程序在PWR_EnterSLEEPMode(0x01, PWR_SLEEPEntry_WFI);
以后,就没被唤醒。用的是RTC。
void PWR_EnterSLEEPMode(u32 SysCtrl_Set, u8 PWR_SLEEPEntry)
{

  if (SysCtrl_Set)
   *(vu32 *) SCB_SysCtrl |= SysCtrl_SLEEPONEXIT_Set;   // Set SLEEPONEXIT
  else
   *(vu32 *) SCB_SysCtrl &= ~SysCtrl_SLEEPONEXIT_Set;// Reset SLEEPONEXIT
  *(vu32 *) SCB_SysCtrl &= ~SysCtrl_SLEEPDEEP_Set;  // Clear SLEEPDEEP bit
  if(PWR_SLEEPEntry == PWR_SLEEPEntry_WFI)      // Select SLEEP mode entry
   __WFI();                    // Request Wait For Interrupt
  else
   __WFE(); // Request Wait For Event

}这个是进入睡眠的代码。
求指导 哪里有问题么~~
沙发
star143133|  楼主 | 2012-3-13 14:46 | 只看该作者
香水版主 求解救

使用特权

评论回复
板凳
香水城| | 2012-3-13 14:56 | 只看该作者
你能确认RTC工作正常么?

STM32标准外设库中有利用RTC唤醒待机模式和停止模式的例子,你可以先运行一个这2个例子,然后稍加修改即可。

使用特权

评论回复
地板
star143133|  楼主 | 2012-3-13 15:26 | 只看该作者
3# 香水城
RTC在工作。

void RTCAlarm_IRQHandler(void)
{
  if(RTC_GetITStatus(RTC_IT_ALR) != RESET)
  {
    /* Clear EXTI line17 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line17);
    /* Check if the Wake-Up flag is set */
    if(PWR_GetFlagStatus(PWR_FLAG_WU) != RESET)
    {
      // Clear Wake Up flag
      PWR_ClearFlag(PWR_FLAG_WU);
    }
    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();   
    /* Clear RTC Alarm interrupt pending bit */
    RTC_ClearITPendingBit(RTC_IT_ALR);
    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();
// GPIO_WriteBit(GPIOC, GPIO_Pin_13, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13)));
  }
}

使用特权

评论回复
5
star143133|  楼主 | 2012-3-13 15:28 | 只看该作者
3# 香水城
在停止模式跑的是正常的。
但是在我的睡眠模式,中断是进去了。因为PC13亮了。但是好像没唤醒

使用特权

评论回复
6
香水城| | 2012-3-13 16:03 | 只看该作者
进了中断,就表示系统已经被唤醒。

使用特权

评论回复
7
star143133|  楼主 | 2012-3-13 16:24 | 只看该作者
6# 香水城
但是为什么后面的无法执行呢。。。
while(1)
{
  Delay(1000);
  RTC_ClearFlag(RTC_FLAG_SEC);
     while(RTC_GetFlagStatus(RTC_FLAG_SEC) == RESET);
    /* Alarm in 3 second */
        RTC_SetAlarm(RTC_GetCounter()+ 3); //3秒钟后把MCU从睡眠模式唤醒
        RTC_WaitForLastTask();
  PWR_EnterSLEEPMode(0x01, PWR_SLEEPEntry_WFI);
}

使用特权

评论回复
8
香水城| | 2012-3-13 16:50 | 只看该作者
你不是一个while循环吗?后面什么也没有了,还要执行什么?

使用特权

评论回复
9
star143133|  楼主 | 2012-3-13 17:05 | 只看该作者
8# 香水城
不是。我是把灯闪灭的代码拿掉了。

while(1)
{
  Delay(1000);
  PC3_L;  //PC3亮
  RTC_ClearFlag(RTC_FLAG_SEC);
     while(RTC_GetFlagStatus(RTC_FLAG_SEC) == RESET);
    /* Alarm in 3 second */
        RTC_SetAlarm(RTC_GetCounter()+ 3); //3秒钟后把MCU从睡眠模式唤醒
        RTC_WaitForLastTask();
  PWR_EnterSLEEPMode(0x01, PWR_SLEEPEntry_WFI);
     PC3_H;//PC3灭
}
如果唤醒了的话。PC3会灭掉。然后再亮起来。RTC中断里的PC13也会随着中断闪或者灭。但是现在PC3和PC13都一直亮着,没反应了。

使用特权

评论回复
10
香水城| | 2012-3-13 17:22 | 只看该作者
这样的话,你应该先不进入睡眠模式,先把RTC调通。

怀疑5楼说的进了中断,是在睡眠之前进去的,或者根本不是唤醒中断。

使用特权

评论回复
11
star143133|  楼主 | 2012-3-14 09:38 | 只看该作者
10# 香水城

现在能进入睡眠和唤醒了。睡眠的时候是14mA,唤醒了32mA。
但是当我运行了几分钟以后。电流表显示是6mA,然后就不动了。
这是为什么呢

使用特权

评论回复
12
star143133|  楼主 | 2012-3-14 09:58 | 只看该作者
顶起来

使用特权

评论回复
13
香水城| | 2012-3-14 14:34 | 只看该作者
10# 香水城  

现在能进入睡眠和唤醒了。睡眠的时候是14mA,唤醒了32mA。
但是当我运行了几分钟以后。电流表显示是6mA,然后就不动了。
这是为什么呢 ...
star143133 发表于 2012-3-14 09:38


不知道为什么。 而且我也不知道你之前为什么有问题,有什么问题。

使用特权

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

本版积分规则

0

主题

28

帖子

1

粉丝