[STM32L1] STM32L进入Sleep后,程序为什么还在运行?

[复制链接]
3289|2
 楼主| pengxizhen0 发表于 2015-12-7 20:49 | 显示全部楼层 |阅读模式
本帖最后由 pengxizhen0 于 2015-12-7 21:15 编辑
  1. void Sleep()
  2. {
  3.       RCC_DeInit(); // RCC 时钟系统重启
  4.               /* Flash 0 wait state */
  5.   FLASH_SetLatency(FLASH_Latency_0);
  6.    
  7.   /* Disable Prefetch Buffer */
  8.   FLASH_PrefetchBufferCmd(DISABLE);   

  9.   /* Disable 64-bit access */
  10.   FLASH_ReadAccess64Cmd(DISABLE);

  11.   /* Enable the PWR APB1 Clock */
  12.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

  13.   /* Select the Voltage Range 2 (1.5V) */
  14.   PWR_VoltageScalingConfig(PWR_VoltageScaling_Range2);
  15.   
  16.   /* Wait Until the Voltage Regulator is ready */
  17.   while(PWR_GetFlagStatus(PWR_FLAG_VOS) != RESET)
  18.   {
  19.   }
  20.         
  21.   /* HCLK = SYSCLK/2 = ~32KHz */
  22.   RCC_HCLKConfig(RCC_SYSCLK_Div2);

  23.   /* PCLK2 = HCLK */
  24.   RCC_PCLK2Config(RCC_HCLK_Div1);

  25.   /* PCLK1 = HCLK */
  26.   RCC_PCLK1Config(RCC_HCLK_Div1);

  27.   /* Set MSI clock range to 65.536KHz */
  28.   RCC_MSIRangeConfig(RCC_MSIRange_0);
  29.   
  30.   /* Select MSI as system clock source */
  31. RCC_SYSCLKConfig(RCC_SYSCLKSource_MSI);

  32.   /* Wait till PLL is used as system clock source */
  33.   while (RCC_GetSYSCLKSource() != 0x00)
  34.   {}

  35.   /* Enable The ultra Low Power Mode */
  36.   PWR_UltraLowPowerCmd(ENABLE);
  37.   
  38.   /* Enable the power down mode during Sleep mode */
  39.   FLASH_SLEEPPowerDownCmd(ENABLE);
  40.   
  41.   /* Request to enter SLEEP mode with regulator in low power mode */
  42.   PWR_EnterSleepMode(PWR_Regulator_LowPower, PWR_SLEEPEntry_WFI);
  43. }
  1. main(){
  2. if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_7)==0){
  3.             if(flagSLEEP == false){
  4.                 Sleep();
  5.                 flagSLEEP = true;
  6.             }
  7.             else{
  8.                 if(t == true){
  9.                     GPIO_SetBits(GPIOB,GPIO_Pin_5);
  10.                     t = false;
  11.                 }
  12.                 else{
  13.                     GPIO_ResetBits(GPIOB,GPIO_Pin_5);
  14.                     t = true;
  15.                 }
  16.             }
  17.         }
  18. }
其中函数Sleep是从STM32L1的例程中拿来的
在Datasheet中可以看到,Sleep模式下,CPU是关闭的,但感觉程序还可以运行,我按按钮PC7时,为什么IO还是可以翻转的?
13.jpg
 楼主| pengxizhen0 发表于 2015-12-7 23:24 | 显示全部楼层
已解决,因为我忽略了还有定时中断什么的,我没注意到的中断唤醒了MCU
cornrn 发表于 2016-1-13 09:26 | 显示全部楼层
pengxizhen0 发表于 2015-12-7 23:24
已解决,因为我忽略了还有定时中断什么的,我没注意到的中断唤醒了MCU

睡眠有几种方式其中有任意中断唤醒,还有停止模式不一样的,手册说的很清楚
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

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