STM32的停机模式与唤醒

  这个星期弄停机模式,下面是代码:

    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_DMA_Init();
    MX_ADC_Init();
    MX_LPUART1_UART_Init();
    MX_USART1_UART_Init();
    MX_RTC_Init();
    WorkFinished=0;//工作没有完成
    while(1)
	 {
		  LED1_ON; LED2_ON; LED3_ON;HAL_Delay (500);
		  printf ("Before Stop   \r\n");
		  if(WorkFinished){
			HAL_PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);//进入停止模式
		  }
		  LED1_OFF; LED2_OFF; LED3_OFF;
		  printf ("After Stop   \r\n");			
	 }

//用于停机模式的声明
#define PWR_Regulator_LowPower    ((uint32_t)0x00000001)
#define PWR_STOPEntry_WFI         ((uint8_t)0x01)

void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry)
{
    uint32_t tmpreg = 0U;
    /* Check the parameters */
    assert_param(IS_PWR_REGULATOR(Regulator));
    assert_param(IS_PWR_STOP_ENTRY(STOPEntry));
    /* Select the regulator state in Stop mode ---------------------------------*/
    tmpreg = PWR->CR;
    /* Clear PDDS and LPDS bits */
    CLEAR_BIT(tmpreg, (PWR_CR_PDDS | PWR_CR_LPSDSR));
   /* Set LPSDSR bit according to PWR_Regulator value */
    SET_BIT(tmpreg, Regulator);
    /* Store the new value */
    PWR->CR = tmpreg;
    /* Set SLEEPDEEP bit of Cortex System Control Register */
    SET_BIT(SCB->SCR, SCB_SCR_SLEEPDEEP_Msk);
    /* Select Stop mode entry --------------------------------------------------*/
    if(STOPEntry == PWR_STOPENTRY_WFI)
    {
        /* Request Wait For Interrupt */
        __WFI();
    }
    else
    {
        /* Request Wait For Event */
        __SEV();
        __WFE();
        __WFE();
  }
    /* Reset SLEEPDEEP bit of Cortex System Control Register */
    CLEAR_BIT(SCB->SCR, SCB_SCR_SLEEPDEEP_Msk);
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{ 
	WorkFinished=~WorkFinished;
  SystemClock_Config();
	printf ("Callback \r\n"); //外设中断 打印
}

  程序正常启动后三个灯闪烁(PB12|PB13|PB14),按键后进入停机模式,再按键程序继续执行,再按键进入停机模式。

  停机模式下耗电:148uA。

 

你可能感兴趣的:(VC++/C++/C,STM32)