打印

STM32低功耗问题

[复制链接]
5601|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ploto|  楼主 | 2009-9-24 16:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我写了一段STM32低功耗的程序,采用RTC唤醒,但是发现总是不会醒来。而我一旦只要打开了DEBUG,在KEIL 调试时,如果我设置一下或是停止一下断点,就能够醒过来,奇怪:
我的代码如下:

/**
  * @brief  Main program.
  * @param  None
  * @retval : None
  */
int main(void)
{

  INT8U  i;
  //看门狗初始化
//  IWDogInit();
  RCC_Init();
  TIM_Setup();
  uartInit();
  RTC_Configuration();

  EnablePheriperalsRCC(TRUE);
  /* Keep the default configuration HSI 8MHz */
// DBGMCU_Config(DBGMCU_STOP,ENABLE);

  while(1)
  {
     PWR_ClearFlag(PWR_FLAG_WU);
   //使能外设
    EnablePheriperals(TRUE);

    //配置输入测试引脚
    SetupTestPin();
    //检查,如果被拉低,复位,进入bootloader
    if(ReadTestPin() == RESET)
    {
        NVIC_GenerateSystemReset();
    }
    //-----------stop 模式后,继续在这里执行---------
    //如果串口连接的,那么配置串口准备输出调试信息
      RedLedOn();
      GreenLedOff();
    if(sysConfig.mDebug )
    {
  
      //开一个LED 显示正在工作
  
    }
     //配置TN100,包括配置GPIO,配置SPI,配置RCC,配置vector
    RadioInit();
    //休眠32ms,等待TN100启动成功
    //启动TN100
    NtrxInit();
    //
    PA_Init();
    //启动PA电源
    PA_PowerOn();
  
    //启动定位
    //startLocate
    if(tagStartLocate(0) != 0)
    {
      while(range_time_out)
      {
        for(i= 0; i < MAX_RECV_BUF; i++)
        {
          if(recv_bufs[i].new_data == 1)
          {
            //处理新接收到的数据
            OnRangeFrameCallBack(&recv_bufs[i].msdu,&recv_bufs[i].packet_info);
            recv_bufs[i].new_data = 0;
          }
        }
       //sleep休眠
       __WFI();
       // PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
       //重新设置外部时钟等信息
      }
      //定位结束,发送定位结果
      DoRangeTimeOut();
    }
   

    //时钟到了,停止射频
    //关闭PA
    PA_Shutdown();
    /**
     * TN100低功耗
     */
    NTRXPowerdownMode(0,0);

       while(RTC_GetFlagStatus(RTC_FLAG_SEC) == RESET);

  
    RTC_SetAlarm(RTC_GetCounter()+ (sysConfig.interval));
  
    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();

   //等待串口发送完毕
       while(!isUartIdle() )
               __WFI();
    //关闭所有的外设
    EnablePheriperals(FALSE);


    /* Select the RTC Clock Source */
      RedLedOff();
      GreenLedOn();
    /* Request to enter STANDBY mode (Wake Up flag is cleared in PWR_EnterSTANDBYMode function) */
    PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFE);
     /* Wait till RTC Second event occurs */
    RTC_ClearFlag(RTC_FLAG_SEC);
     
   //启动后,重新配置时钟
    SYSCLKConfig_STOP();

  }
}



/**
  * @brief  Configures RTC clock source and prescaler.
  * @param  None
  * @retval : None
  */
void RTC_Configuration(void)
{

  /* Enable PWR and BKP clocks */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  /* Allow access to BKP Domain */
  PWR_BackupAccessCmd(ENABLE);

  /* Reset Backup Domain */
  BKP_DeInit();

  /* Enable LSE */
  RCC_LSEConfig(RCC_LSE_ON);
  /* Wait till LSE is ready */
  while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  {}

  /* Select LSE as RTC Clock Source */
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

  /* Enable RTC Clock */
  RCC_RTCCLKCmd(ENABLE);

  /* Wait for RTC registers synchronization */
  RTC_WaitForSynchro();

  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();

  /* Enable the RTC Second */
// RTC_ITConfig(RTC_IT_SEC, ENABLE);

  /* Wait until last write operation on RTC registers has finished */
// RTC_WaitForLastTask();

  /* Set RTC prescaler: set RTC period to 0.5sec */
  RTC_SetPrescaler(16383); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */

  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();

}
请高手指导。
沙发
ploto|  楼主 | 2009-9-24 21:15 | 只看该作者
经过网上以及例程,终于解决了,方法如下:
1.采用WFI进入
PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFE);=>PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);

2.设置RTCAlarm以及Exti_line17,过程如下:
void AutoWakeupConfigure(void)
{
        //首先配置Exit_line17为上升沿
  EXTI_InitTypeDef EXTI_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

  /* Configure EXTI Line17(RTC Alarm) to generate an interrupt on rising edge */
  EXTI_ClearITPendingBit(EXTI_Line17);
  EXTI_InitStructure.EXTI_Line = EXTI_Line17;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
// EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Event;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_Init(&EXTI_InitStructure);  

  //然后配置Alarm
  /* 2 bits for Preemption Priority and 2 bits for Sub Priority */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

    /* Enable the RTC Alarm interrupt */
  RTC_ITConfig(RTC_IT_ALR, ENABLE);
  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();

}
3.编写RTC_IRQHandler如下:
void RTCAlarm_IRQHandler(void)
{
        if(RTC_GetITStatus(RTC_IT_ALR) != RESET)
        {
                RTC_WaitForLastTask();
                RTC_ClearFlag(RTC_FLAG_ALR);
                RTC_WaitForLastTask();
        }
        EXTI_ClearITPendingBit(EXTI_Line17);
}
4.在vector.s中设置3。.
5.终于工作了,睡了一会儿就醒啦!!

使用特权

评论回复
板凳
playzhp| | 2009-9-27 15:58 | 只看该作者
:lol
楼主大哥你的程序看了头好晕啊

使用特权

评论回复
地板
paulinx| | 2009-11-10 12:54 | 只看该作者
楼主也在玩TN100?
同道中人:handshake

使用特权

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

本版积分规则

7

主题

99

帖子

0

粉丝