AnsweredAssumed Answered

low power on discovery board

Question asked by hudgell.michael on Jan 10, 2012
I'm trying to do something really simple, take the STM32L discovery, put some code in it and measure the current across JP1 (in the off position as the manual suggests).... However, I can't seem to get down to the low power levels suggested, does anyone have any example code they could share for this?

My quick copy/paste from the current measuring example isn't performing:

GPIO_InitTypeDef GPIO_InitStructure;
 
    /*!< Set MSION bit */
      RCC->CR |= (uint32_t)0x00000100;
 
      /*!< Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], MCOSEL[2:0] and MCOPRE[2:0] bits */
      RCC->CFGR &= (uint32_t)0x88FFC00C;
 
      /*!< Reset HSION, HSEON, CSSON and PLLON bits */
      RCC->CR &= (uint32_t)0xEEFEFFFE;
 
      /*!< Reset HSEBYP bit */
      RCC->CR &= (uint32_t)0xFFFBFFFF;
 
      /*!< Reset PLLSRC, PLLMUL[3:0] and PLLDIV[1:0] bits */
      RCC->CFGR &= (uint32_t)0xFF02FFFF;
 
      /*!< Disable all interrupts */
      RCC->CIR = 0x00000000;
 
      __IO uint32_t  MSIStatus = 0;
       /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/
       if ((RCC->CR & RCC_CR_MSIRDY) != RESET)
       {
         MSIStatus = (uint32_t)0x01;
       }
       else
       {
         MSIStatus = (uint32_t)0x00;
       }
        if (MSIStatus == (uint32_t)0x01)
        {
         /* Enable 64-bit access */
         FLASH->ACR |= FLASH_ACR_ACC64;
 
         /* Enable Prefetch Buffer */
         FLASH->ACR |= FLASH_ACR_PRFTEN;
 
         /* Flash 1 wait state */
         FLASH->ACR |= FLASH_ACR_LATENCY;
 
         /* Power enable */
         RCC->APB1ENR |= RCC_APB1ENR_PWREN;
 
         /* Select the Voltage Range 1 (1.8 V) */
         PWR->CR = PWR_CR_VOS_0;
 
         /* Wait Until the Voltage Regulator is ready */
         while((PWR->CSR & PWR_CSR_VOSF) != RESET)
         {
         }
         /* HCLK = SYSCLK /1*/
         RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
 
         /* PCLK2 = HCLK /1*/
         RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
 
         /* PCLK1 = HCLK /1*/
         RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1;
 
         RCC->ICSCR &= (uint32_t)((uint32_t)~(RCC_ICSCR_MSIRANGE));
         RCC->ICSCR |= (uint32_t)RCC_ICSCR_MSIRANGE_0;
 
         /* Select MSI as system clock source */
         RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
         RCC->CFGR |= (uint32_t)RCC_CFGR_SW_MSI;
 
         /* Wait till MSI is used as system clock source */
         while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_MSI)
         {
         }
       }
       else
       {
         /* If MSI fails to start-up, the application will have wrong clock
            configuration. User can add here some code to deal with this error */
       }
 
    #ifdef VECT_TAB_SRAM
      SCB->VTOR = SRAM_BASE | 0x0; /* Vector Table Relocation in Internal SRAM. */
    #else
      SCB->VTOR = FLASH_BASE | 0x0; /* Vector Table Relocation in Internal FLASH. */
    #endif
 
 
     /* Keep debugger connection during SLEEP (debugging) */
     DBGMCU_Config(DBGMCU_SLEEP, ENABLE);
     /* Keep debugger connection during STOP (debugging) */
     DBGMCU_Config(DBGMCU_STOP, ENABLE);
      /* IWDG stopped when core is halted (debugging) */
      DBGMCU_Config(DBGMCU_IWDG_STOP, ENABLE);
 
   // now we're going to try to shut down the micro to lowest power
     // level
      /* Enable HSI Clock */
        RCC_HSICmd(ENABLE);
 
        /*!< Wait till HSI is ready */
        while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
 
        /* Set HSI as sys clock*/
        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
 
        /* Set MSI clock range to ~4.194MHz*/
        RCC_MSIRangeConfig(RCC_MSIRange_6);
 
        /* Enable the GPIOs clocks */
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC| RCC_AHBPeriph_GPIOD| RCC_AHBPeriph_GPIOE| RCC_AHBPeriph_GPIOH, ENABLE);
 
        /* Enable comparator, LCD and PWR mngt clocks */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_COMP | RCC_APB1Periph_LCD | RCC_APB1Periph_PWR,ENABLE);
 
        /* Enable ADC & SYSCFG clocks */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_SYSCFG , ENABLE);
 
        /* Allow access to the RTC */
        PWR_RTCAccessCmd(ENABLE);
 
        /* Reset RTC Backup Domain */
        RCC_RTCResetCmd(ENABLE);
        RCC_RTCResetCmd(DISABLE);
 
        /* LSE Enable */
        RCC_LSEConfig(RCC_LSE_ON);
 
        /* Wait until LSE is ready */
        while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
 
         /* RTC Clock Source Selection */
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
 
        /* Enable the RTC */
        RCC_RTCCLKCmd(ENABLE);
 
        /*Disable HSE*/
        RCC_HSEConfig(RCC_HSE_OFF);
        if(RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET )
        {
          /* Stay in infinite loop if HSE is not disabled*/
          while(1);
        }
 
      /* Configure all GPIO port pins in Analog input mode (trigger OFF) */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
 
 
        GPIOD->MODER   = 0xFFFFFFFF;
        GPIOE->MODER   = 0xFFFFFFFF;
        GPIOH->MODER   = 0xFFFFFFFF;
 
 
        /* all GPIOA */
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_6| GPIO_Pin_7 \
          | GPIO_Pin_13 | GPIO_Pin_14|GPIO_Pin_5 | GPIO_Pin_8  |GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |  GPIO_Pin_12 |GPIO_Pin_15 ;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
 
         /* All GPIOC except PC13 which is used for mesurement */
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4|  GPIO_Pin_5 |GPIO_Pin_6| GPIO_Pin_7| GPIO_Pin_8 \
                                       | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |  GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15 ;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
 
         /* all GPIOB except PB6 and PB7 used for LED*/
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4|  GPIO_Pin_5 | GPIO_Pin_8 \
                                       | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |  GPIO_Pin_12 |GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 ;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
 
     /* RCC system reset */
     RCC_DeInit();
 
     /* Select the Voltage Range 3 (1.2V) */
      PWR_VoltageScalingConfig(PWR_VoltageScaling_Range3);
 
      /* Wait Until the Voltage Regulator is ready */
       while (PWR_GetFlagStatus(PWR_FLAG_VOS) != RESET);
 
       /* Configure the MSI frequency */
      // RCC_MSIRangeConfig(RCC_MSIRange_0);
 
       /* Select MSI as system clock source */
       RCC_SYSCLKConfig(RCC_SYSCLKSource_MSI);
 
       /* Wait until MSI is used as system clock source */
       while (RCC_GetSYSCLKSource() != 0x00);
 
       RCC_HSICmd(DISABLE);
 
       /* Disable HSE clock */
       RCC_HSEConfig(RCC_HSE_OFF);
 
       /* Disable LSI clock */
       RCC_LSICmd(DISABLE);
 
       /* Disable the RTC Wakeup Interrupt */
       RTC_ITConfig(RTC_IT_WUT, DISABLE);
 
       /*Disable fast wakeUp*/
       PWR_FastWakeUpCmd(DISABLE);
 
       /* Disable PVD */
       PWR_PVDCmd(DISABLE);
 
       /* Enable Ultra low power mode */
       PWR_UltraLowPowerCmd(ENABLE);
 
       /* To stop the sys tick for avoid IT */
       SysTick->CTRL = 0;
 
 
     while(1)
     {
         PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
     }




Outcomes