راه اندازی حالت Low Power در STM32 (حالت Sleep Mode)

مقدمه

به طور پیش فرض ، میکروکنترلر پس از اتصال برق در حالت Run قرار می گیرد. کلاک CPU ، توسط HCLK تنظیم می شود و کد برنامه اجرا می شود. STM32 چندین حالت کم مصرف برای صرفه جویی در مصرف انرژی وجود دارد ، هنگامی که CPU نیازی به فعالیت ندارد ، به عنوان مثال هنگام انتظار برای یک رویداد خارجی ما می توانیم میکروکنترلر را در حالت کم مصرف قرار دهیم. امروز در این آموزش قصد داریم در مورد این حالت ها بحث کنیم.

 

سه حالت کم مصرف در STM32 موجود است و به شرح زیر است:

  • حالت SLEEP MODE: هسته FPU متوقف می شود ، لوازم جانبی (peripherals ) همچنان در حال اجرا هستند
  • حالت STOP MODE: ‌ همه کلاک ها متوقف می شوند.
  • حالت STANDBY MODE: میکرو روی دامنه ۱٫۲ ولت در حالت خاموش است.

 

  1. حالت SLEEP MODE

ما ابتدا با ساده ترین حالت ، که SLEEP MODE است ، شروع می کنیم. در این حالت CPU CLK خاموش است و هیچ تاثیری روی سایر کلاک ها یا منابع کلاک آنالوگ ندارد. میزان مصرف جریان در این حالت بالاترین نسبت به سایر حالت های کم مصرف است.

 

ورود

برای ورود به SLEEP MODE ، ابتدا باید وقفه systick  را غیرفعال کنیم یا در غیر این صورت این وقفه هر زمان که وقفه trigger شود، MCU را بیدار می کند.

;()HAL_SuspendTick

در مرحله بعد ، ما با اجرای دستورالعمل های WFI (انتظار برای وقفه) یا WFE (انتظار برای Event) وارد حالت خواب خواهیم شد. اگر دستورالعمل WFI برای ورود به حالت SLEEP MODE استفاده شده باشد ، هرگونه و  peripheral interrupt acknowledged که توسط NVIC انجام شده باشد می تواند میکرو را از خواب بیدار کند.

 

HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WF

 

بیدار شدن

همان طور که در بالا ذکر شد ، ما با استفاده از دستورالعمل WFI وارد SLEEP MODE شده ایم ، بنابراین هر زمان که وقفه ای ایجاد شود (تریگ شود) ، دستگاه بیدار می شود.

;(void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin

{

  ;()HAL_ResumeTic

}

در داخل تابع callback می توانیم systick مجدد را از سر بگیریم پس می توانیم از تابع تاخیر مجدد برای باقی مانده کد استفاده کنیم.

 

Sleep on EXIT

این یکی دیگر از ویژگی های موجود در SLEEP MODE است ، که MCU هنگام شروع (trigger) وقفه از خواب بیدار می شود ، ISR را پردازش می کند و هنگام خروج ISR دوباره به خواب می رود. این زمانی مفید است که می خواهیم کنترلر فقط در حالت وقفه (interrupt mode) کار کند.

;()HAL_PWR_EnableSleepOnExit 

 

قبل از وارد شدن به SLEEP MODE باید تابع فوق را فراخوانی کنید تا ویژگی sleeponexit فعال شود. می توانیم با فراخوانی آن را غیرفعال کنیم.


برای دانلود این پروژه به لینک زیر مراجعه کنید:

Sleep mode in STM32