打印
[STM32L1]

STM32L151无法进入STOP或是SLEEP模式

[复制链接]
8810|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qycc566|  楼主 | 2016-1-11 15:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32L151,使用STM32CUBE生成的代码,系统使用HSI时钟,PLL到48MHz,RTC使用LSI。RTC配置用于WAKEUP。
RTC初始化函数如下:
/* RTC init function */
void MX_RTC_Init(void)
{

  RTC_TimeTypeDef sTime;
  RTC_DateTypeDef sDate;

    /**Initialize RTC and set the Time and Date
    */
  hrtc.Instance = RTC;
  hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  hrtc.Init.AsynchPrediv = 127;
  hrtc.Init.SynchPrediv = 255;
  hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  HAL_RTC_Init(&hrtc);

  sTime.Hours = 0x0;
  sTime.Minutes = 0x0;
  sTime.Seconds = 0x0;
  sTime.TimeFormat = RTC_HOURFORMAT12_AM;
  sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  sTime.StoreOperation = RTC_STOREOPERATION_RESET;
  HAL_RTC_SetTime(&hrtc, &sTime, FORMAT_BCD);

  sDate.WeekDay = RTC_WEEKDAY_MONDAY;
  sDate.Month = RTC_MONTH_JANUARY;
  sDate.Date = 0x1;
  sDate.Year = 0x15;

  HAL_RTC_SetDate(&hrtc, &sDate, FORMAT_BCD);

    /**Enable the WakeUp
    */
  HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, RTC_WAKEUP_COUNTER, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);
        RTC->ISR &= (~RTC_ISR_WUTF);
}

进入STOP模式代码:
void EnterStopMode(void){
        #if !defined( BASE_STATION )
        if((MainState & (MainState_AcOk | MainState_Charging)) == 0){
                MainState = (MainState_TypeDef)((MainState & 0xff00) | MainState_Stop);
                key_exti();
                HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
        }
        #endif
}

在执行完HAL_PWR_EnterSTOPMode后,系统的电流从29mA下降到14mA。但从此不再有响应,RTC也无法唤醒。经测试,如果注释掉HAL_PWR_EnterSTOPMode后,RTC的wakeup中断是有正常产生的。
沙发
huangcunxiake| | 2016-1-11 16:35 | 只看该作者
停止模式应该是没法通过RTC唤醒的,需要按键复位唤醒,这跟电脑关机一样。

使用特权

评论回复
板凳
huangcunxiake| | 2016-1-11 16:40 | 只看该作者
https://bbs.21ic.com/icview-848184-1-1.html
这个人的帖子是进去后还嫌功耗高。

使用特权

评论回复
地板
huangcunxiake| | 2016-1-11 16:58 | 只看该作者
采用RTC报警功能来触发退出停止模式,LED2闪烁3次,共计3秒后退出停止模式。重复试验。。。。。。。。
//STOPMODE设置初始化
void STOPMODEG_Config(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOE, &GPIO_InitStructure);


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  GPIO_ResetBits(GPIOE, GPIO_Pin_2);
  GPIO_SetBits(GPIOC, GPIO_Pin_2);

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource2);

  EXTI_InitStructure.EXTI_Line = EXTI_Line2;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  //EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Event;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);

  EXTI_ClearITPendingBit(EXTI_Line17);
  EXTI_InitStructure.EXTI_Line = EXTI_Line17;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_Init(&EXTI_InitStructure);   
  RTC_Configuration();

  GPIO_SetBits(GPIOD, GPIO_Pin_6);

  GPIO_ResetBits(GPIOD, GPIO_Pin_3);
  GPIO_ResetBits(GPIOB, GPIO_Pin_5);
  GPIO_ResetBits(GPIOD, GPIO_Pin_6);
  GPIO_ResetBits(GPIOD, GPIO_Pin_3);
}

void RTC_Configuration(void)
{


  PWR_BackupAccessCmd(ENABLE);

  BKP_DeInit();


  RCC_LSEConfig(RCC_LSE_ON);

  while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  {
  }

  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

  RCC_RTCCLKCmd(ENABLE);


  RTC_WaitForSynchro();

  RTC_SetPrescaler(32767);

  RTC_WaitForLastTask();

  RTC_ITConfig(RTC_IT_ALR, ENABLE);

  RTC_WaitForLastTask();
}

void SYSCLKConfig_STOP(void)
{

  RCC_HSEConfig(RCC_HSE_ON);

  HSEStartUpStatus = RCC_WaitForHSEStartUp();
  if(HSEStartUpStatus == SUCCESS)
  {

    RCC_PLLCmd(ENABLE);

    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
}
void TEST_STOPMODE(void)
{

    Tic_Delay(1500);

    RTC_ClearFlag(RTC_FLAG_SEC);
    while(RTC_GetFlagStatus(RTC_FLAG_SEC) == RESET);

    RTC_SetAlarm(RTC_GetCounter()+ 3);

    RTC_WaitForLastTask();

    GPIO_SetBits(GPIOD, GPIO_Pin_3);

    GPIO_ResetBits(GPIOD, GPIO_Pin_6);

    PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);



    GPIO_SetBits(GPIOD, GPIO_Pin_6);

    SYSCLKConfig_STOP();

    GPIO_ResetBits(GPIOD, GPIO_Pin_3);
}
以上为STOP子程序代码。。。。。。。。在主程序中运行TEST_STOPMODE();即可。

使用特权

评论回复
5
apple163| | 2016-3-31 08:28 | 只看该作者
1,stop模式下如果想功耗低,要将所有IO置为模拟输入状态
2,RTC唤醒没问题,但是唤醒之后需要重新配置时钟,有时候不是没有唤醒,是唤醒后时钟配置不对,造成假死

使用特权

评论回复
6
just_2010| | 2020-8-24 16:55 | 只看该作者
最近用到,谢谢

使用特权

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

本版积分规则

3

主题

3

帖子

0

粉丝