[STM32L1] STM32L151无法进入STOP或是SLEEP模式

[复制链接]
9046|5
 楼主| qycc566 发表于 2016-1-11 15:30 | 显示全部楼层 |阅读模式
STM32L151,使用STM32CUBE生成的代码,系统使用HSI时钟,PLL到48MHz,RTC使用LSI。RTC配置用于WAKEUP。
RTC初始化函数如下:
  1. /* RTC init function */
  2. void MX_RTC_Init(void)
  3. {

  4.   RTC_TimeTypeDef sTime;
  5.   RTC_DateTypeDef sDate;

  6.     /**Initialize RTC and set the Time and Date
  7.     */
  8.   hrtc.Instance = RTC;
  9.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  10.   hrtc.Init.AsynchPrediv = 127;
  11.   hrtc.Init.SynchPrediv = 255;
  12.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  13.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  14.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  15.   HAL_RTC_Init(&hrtc);

  16.   sTime.Hours = 0x0;
  17.   sTime.Minutes = 0x0;
  18.   sTime.Seconds = 0x0;
  19.   sTime.TimeFormat = RTC_HOURFORMAT12_AM;
  20.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  21.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;
  22.   HAL_RTC_SetTime(&hrtc, &sTime, FORMAT_BCD);

  23.   sDate.WeekDay = RTC_WEEKDAY_MONDAY;
  24.   sDate.Month = RTC_MONTH_JANUARY;
  25.   sDate.Date = 0x1;
  26.   sDate.Year = 0x15;

  27.   HAL_RTC_SetDate(&hrtc, &sDate, FORMAT_BCD);

  28.     /**Enable the WakeUp
  29.     */
  30.   HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, RTC_WAKEUP_COUNTER, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);
  31.         RTC->ISR &= (~RTC_ISR_WUTF);
  32. }

进入STOP模式代码:
  1. void EnterStopMode(void){
  2.         #if !defined( BASE_STATION )
  3.         if((MainState & (MainState_AcOk | MainState_Charging)) == 0){
  4.                 MainState = (MainState_TypeDef)((MainState & 0xff00) | MainState_Stop);
  5.                 key_exti();
  6.                 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
  7.         }
  8.         #endif
  9. }

在执行完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();即可。

apple163 发表于 2016-3-31 08:28 | 显示全部楼层
1,stop模式下如果想功耗低,要将所有IO置为模拟输入状态
2,RTC唤醒没问题,但是唤醒之后需要重新配置时钟,有时候不是没有唤醒,是唤醒后时钟配置不对,造成假死
just_2010 发表于 2020-8-24 16:55 | 显示全部楼层
最近用到,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

3

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部