[其他ST产品] STM32物联网项目-低功耗模式

[复制链接]
830|25
 楼主| 鱿鱼丝 发表于 2023-2-27 02:25 | 显示全部楼层
void HAL_PWR_EnterSTOPMode(uint32_t Regulator,uint8_t STOPEntry)

进入停机模式的函数中,参数Regulator(内部调压器的)有两种选择,

一种是:PWR_MAINREGULATOR_ON(正常模式)

另一种是:PwR_LOWPOWERREGULATOR_ON(低功耗模式)

两种选择的区别,正常模式恢复比较快,低功耗模式功耗较低,但启动时间会长点,可根据产品来选择,如果产品要求启动时间要快,则选择正常模式,如果对启动时间没有要求,则选择低功耗模式

注意:当一个中断或唤醒事件导致退出停止模式时,HSI RC振荡器被选为系统时钟,所以从停止模式退出后,要重新设置系统时钟,需要调用SystemClock_Config()函数
 楼主| 鱿鱼丝 发表于 2023-2-27 02:25 | 显示全部楼层
进入和退出待机模式

待机模式可实现系统的最低功耗。该模式是在Cortex-M3深睡眠模式时关闭电压调节器。整个 1.8V供电区域被断电。PLL、HSI和HSE振荡器也被断电。SRAM和寄存器内容丢失。只有备份的寄存器和待机电路维持供电

直接调用库函数进入待机模式,此时芯片的IO引脚处于高阻态,并不受芯片控制,所以那些模块的电最好都先断掉

4951363fba423140e3.png
 楼主| 鱿鱼丝 发表于 2023-2-27 02:25 | 显示全部楼层
  1. /*
  2. * @name   Enter_Standby_Mode
  3. * @brief  进入待机模式
  4. * @param  None
  5. * @retval None
  6. */
  7. static void Enter_Standby_Mode()
  8. {
  9.     /*注意:系统复位键可以将系统从待机模式中唤醒*/

  10.     //待机模式直接调用库函数即可
  11.     HAL_PWR_EnterSTANDBYMode();
  12. }
 楼主| 鱿鱼丝 发表于 2023-2-27 02:26 | 显示全部楼层
System.c

运行函数中延时1s,然后每隔10ms检测低功耗模式标志位是否被置位,是则调用函数进入对应的低功耗模式

  1. /*
  2. * @name   Run
  3. * @brief  系统运行
  4. * @param  None
  5. * @retval None   
  6. */
  7. static void Run()
  8. {
  9.   uint8_t i;
  10.   //延时1s,期间每隔10ms检测是否需要进入低功耗模式
  11.   for(i=0;i<100;i++)
  12.   {
  13.     //进入睡眠模式
  14.     if(LowPower.Enter_Sleep_Mode_Flag == TRUE)
  15.     {
  16.       LowPower.Enter_Sleep_Mode_Flag = FALSE;
  17.       printf("系统进入睡眠模式,通过按键4唤醒\r\n");
  18.       LowPower.Enter_Sleep_Mode();
  19.     }
  20.     //进入停机模式
  21.     if(LowPower.Enter_Stop_Mode_Flag == TRUE)
  22.     {
  23.       LowPower.Enter_Stop_Mode_Flag = FALSE;
  24.       printf("系统进入停机模式,通过按键4唤醒\r\n");
  25.       LowPower.Enter_Stop_Mode();
  26.     }
  27.     //进入待机模式
  28.     if(LowPower.Enter_Standby_Mode_Flag == TRUE)
  29.     {
  30.       LowPower.Enter_Standby_Mode_Flag = FALSE;
  31.       printf("系统进入待机模式,通过复位按键唤醒\r\n");
  32.       printf("待机模式,外设不受STM32控制,系统功耗可能增加!\r\n");
  33.       printf("如WiFi模块,可以用镊子将EN管脚短接到地!\r\n");
  34.       LowPower.Enter_Standby_Mode();
  35.     }
  36.     //延时
  37.     HAL_Delay(10);
  38.   }
  39.   printf("系统正常运行\r\n");
  40. }

 楼主| 鱿鱼丝 发表于 2023-2-27 02:26 | 显示全部楼层
CallBack.c

在中断回调函数中判断触摸按键是否被按下,是则将低功耗模式标志位置位,然后主函数中就可以调用低功耗函数让系统进入低功耗模式


  1. /*
  2. * @name   HAL_GPIO_EXTI_Callback
  3. * @brief  外部中断回调函数
  4. * @param  GPIO_Pin:触发外部中断的引脚
  5. * @retval None   
  6. */
  7. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  8. {
  9.   uint8_t i;
  10.   if(GPIO_Pin == KEY1_Pin)
  11.   {
  12.     printf("检测到按键1被按下\r\n");
  13.     LowPower.Enter_Sleep_Mode_Flag = TRUE;
  14.     LED.LED_Fun(LED2,LED_ON);
  15.     for(i=0;i<100;i++)
  16.     {
  17.       HAL_Delay(10);
  18.       if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == GPIO_PIN_SET)
  19.       {
  20.         LowPower.Enter_Sleep_Mode_Flag = FALSE;
  21.         printf("按键1提前释放,系统正常运行\r\n");
  22.         break;
  23.       }
  24.     }
  25.     LED.LED_Fun(LED2,LED_OFF);
  26.   }

  27.   if(GPIO_Pin == KEY2_Pin)
  28.   {
  29.     printf("检测到按键2被按下\r\n");
  30.     LowPower.Enter_Stop_Mode_Flag = TRUE;
  31.     LED.LED_Fun(LED2,LED_ON);
  32.     for(i=0;i<100;i++)
  33.     {
  34.       HAL_Delay(10);
  35.       if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_SET)
  36.       {
  37.         LowPower.Enter_Stop_Mode_Flag = FALSE;
  38.         printf("按键2提前释放,系统正常运行\r\n");
  39.         break;
  40.       }
  41.     }
  42.     LED.LED_Fun(LED2,LED_OFF);
  43.   }

  44.   if(GPIO_Pin == KEY3_Pin)
  45.   {
  46.     printf("检测到按键3被按下\r\n");
  47.     LowPower.Enter_Standby_Mode_Flag = TRUE;
  48.     LED.LED_Fun(LED2,LED_ON);
  49.     for(i=0;i<100;i++)
  50.     {
  51.       HAL_Delay(10);
  52.       if(HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin) == GPIO_PIN_SET)
  53.       {
  54.         LowPower.Enter_Standby_Mode_Flag = FALSE;
  55.         printf("按键3提前释放,系统正常运行\r\n");
  56.         break;
  57.       }
  58.     }
  59.     LED.LED_Fun(LED2,LED_OFF);
  60.   }
  61. }

 楼主| 鱿鱼丝 发表于 2023-2-27 02:26 | 显示全部楼层
实验效果
3024563fba45ff0144.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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