[STM32L1] STM32L152 STOP模式

[复制链接]
2517|2
 楼主| 幸福小强 发表于 2018-5-13 19:59 | 显示全部楼层 |阅读模式
目的

配置芯片进入停止模式,RTC唤醒中断唤醒。

完成情况

成功进入停止模式4S,然后由RTC唤醒,ADC、日历、串口等功能成功启动。

步骤1,进入低功耗模式相关配置

关闭高速时钟;
RCC中关闭所有外设时钟;
关闭外设使能;

2,唤醒相关配置

要使能 RTC 唤醒中断,需按照以下顺序操作:
1. 将 EXTI 线 20 配置为中断模式并将其使能,然后选择上升沿有效。
2. 配置 NVIC 中的 RTC_WKUP IRQ 通道并将其使能。
3. 配置 RTC 以生成 RTC 唤醒定时器事件。

  1. void RTC_configration(void)
  2. {
  3.   NVIC_InitTypeDef  NVIC_InitStructure;
  4.   EXTI_InitTypeDef  EXTI_InitStructure;
  5.     RTC_InitTypeDef RTC_InitStructure;


  6.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

  7.   /*!< Allow access to RTC */
  8.   PWR_RTCAccessCmd(ENABLE);

  9. /* Clear WakeUp flag */
  10.   PWR_ClearFlag(PWR_FLAG_WU);

  11.   /*!< Reset RTC Domain */
  12.   RCC_RTCResetCmd(ENABLE);
  13.   RCC_RTCResetCmd(DISABLE);

  14.   /*!< LSE Enable */
  15.   RCC_LSEConfig(RCC_LSE_ON);

  16.   /*!< Wait till LSE is ready */
  17.   while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  18.   {}

  19.   /*!<RTC Clock Source Selection */
  20.   RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

  21.   /*!< Enable the RTC Clock */
  22.   RCC_RTCCLKCmd(ENABLE);

  23.   /*!< Wait for RTC APB registers synchronisation */
  24.   RTC_WaitForSynchro();


  25.     /* Calendar Configuration这里时假设RTC时钟是32.768,如果不是,需要在system设置中更改 */
  26.   RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
  27.   RTC_InitStructure.RTC_SynchPrediv =  0x120; /* (37KHz / 128) - 1 = 0x120*/
  28.   RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
  29.   RTC_Init(&RTC_InitStructure);

  30.       /* Set the date: Wednesday January 17th 2017 */
  31.   RTC_DateStructure.RTC_Year =0x11;
  32.   RTC_DateStructure.RTC_Month = RTC_Month_January;
  33.   RTC_DateStructure.RTC_Date =0x13;
  34.   RTC_DateStructure.RTC_WeekDay = RTC_Weekday_Tuesday;
  35.   RTC_SetDate(RTC_Format_BIN, &RTC_DateStructure);//注意设置格式

  36.   /* Set the time to 01h 00mn 00s AM */
  37.   RTC_TimeStructure.RTC_H12     = RTC_H12_PM;
  38.   RTC_TimeStructure.RTC_Hours   = 0x0a;
  39.   RTC_TimeStructure.RTC_Minutes = 0x15;
  40.   RTC_TimeStructure.RTC_Seconds = 0x03;
  41.   RTC_SetTime(RTC_Format_BIN, &RTC_TimeStructure); //注意设置格式     


  42.   /* EXTI configuration *******************************************************/
  43.   EXTI_ClearITPendingBit(EXTI_Line20);
  44.   EXTI_InitStructure.EXTI_Line = EXTI_Line20;
  45.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  46.   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  47.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  48.   EXTI_Init(&EXTI_InitStructure);

  49.   /* Enable the RTC Wakeup Interrupt */
  50.   NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn;
  51.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  52.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  53.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  54.   NVIC_Init(&NVIC_InitStructure);

  55.   /* RTC Wakeup Interrupt Generation: Clock Source: RTCDiv_16, Wakeup Time Base: 4s */
  56.   RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);
  57.   RTC_SetWakeUpCounter(0x0004);

  58.   /* Enable the Wakeup Interrupt */
  59.   RTC_ITConfig(RTC_IT_WUT, ENABLE);  

  60. }

然后在需要进入停止模式的地方运行以下函数

  1. void To_enter_Stop(void)
  2. {

  3. GPIO_InitTypeDef GPIO_InitStructure;   

  4. //1)关闭所有不用的外设及时钟

  5. //2)设置IO

  6.      /* Enable Wakeup Counter */
  7.     RTC_WakeUpCmd(ENABLE);

  8.     /* Enter Stop Mode */
  9.     PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
  10. }
3,管脚的配置

所有管脚设置为模拟输入以降低功耗。
如果需要使能低功耗调试DEBUG,响应管脚保持原有设置。

4,使能低功耗模式下DEBUG

/Enable debug in stop mode/

DBGMCU_Config(DBGMCU_STOP,ENABLE);

RCC_AHBPeriphClockLPModeCmd(RCC_AHBPeriph_GPIOA,ENABLE);


 楼主| 幸福小强 发表于 2018-5-13 20:00 | 显示全部楼层
5,退出低功耗模式配置
先配置时钟,然后开启GPIO,然后重新初始化相关外设。
注意:重新初始化之前Deinit一下,否则有的会重新配置 不成功。例如GPIO
  1. void To_Exit_Stop(void)
  2. {

  3.      RTC_WakeUpCmd(DISABLE);
  4.     /* Enable HSI Clock */
  5.   RCC_HSICmd(ENABLE);

  6.   /*!< Wait till HSI is ready */
  7.   while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);

  8.   /* Enable 64-bit access */
  9.   FLASH_ReadAccess64Cmd(ENABLE);

  10.   /* Enable Prefetch Buffer */
  11.   FLASH_PrefetchBufferCmd(ENABLE);

  12.   /* Flash 1 wait state */
  13.   FLASH_SetLatency(FLASH_Latency_1);

  14.   RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);

  15.   while (RCC_GetSYSCLKSource() != 0x04);

  16.   RCC_HCLKConfig(RCC_SYSCLK_Div1);  
  17.   /* PCLK2 = HCLK */
  18.   RCC_PCLK2Config(RCC_HCLK_Div1);

  19.   /* PCLK1 = HCLK */
  20.   RCC_PCLK1Config(RCC_HCLK_Div1);  

  21.      PWR_VoltageScalingConfig(PWR_VoltageScaling_Range1);
  22.   /* Wait Until the Voltage Regulator is ready */
  23.   while (PWR_GetFlagStatus(PWR_FLAG_VOS) != RESET);

  24.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC |
  25.                         RCC_AHBPeriph_GPIOD | RCC_AHBPeriph_GPIOE | RCC_AHBPeriph_GPIOH |
  26.                           RCC_AHBPeriph_GPIOF | RCC_AHBPeriph_GPIOG, ENABLE);

  27.     GPIO_DeInit(GPIOA);
  28.     GPIO_DeInit(GPIOB);
  29.     GPIO_DeInit(GPIOC);
  30.     GPIO_DeInit(GPIOD);
  31.     GPIO_DeInit(GPIOE);
  32.     GPIO_DeInit(GPIOF);
  33.     GPIO_DeInit(GPIOG);
  34.     GPIO_DeInit(GPIOH);


  35. }
734774645 发表于 2018-5-13 21:03 | 显示全部楼层
这种模式比较给力,估计闹钟的定时就是这种方式实现的吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

143

主题

1720

帖子

2

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