В данном уроке мы начнём знакомство с режимами пониженного энергопотребления микроконтроллеров STM32.
Зачем нужны такие режимы контроллеру?
Любое устройство, работающее от автономного источника питания, если будет эксплуатироваться только в основном (динамическом) режиме, скорее всего, долго не проработает. Поэтому и существуют данные режимы — режимы пониженного энергопотребления.
Режимы пониженного энергопотребления существуют разных видов в зависимости от того, что нам необходимо в таком режиме оставить в работе, а что отключить. Чем больше устройств отключено в том или ином режиме, тем, как правило, меньше у контроллера, а следовательно и у устройства, которым он управляет, будет энергопотребление. Только есть и отрицательная сторона данных режимов. Во-первых, чем больше устройств в режиме пониженного энергопотребления отключено (чем, так сказать, «глубже сон»), тем сложней будет данное устройство из такого режима вывести («разбудить»). Во-вторых, мы теряем очень много функционала в определённом режиме.
Поэтому, перед разработчиком, который пишет программу для того или иного устройства, стоит всегда две задачи: чтобы в этом режиме обеспечивался тот функционал, который необходим для функционирования устройства во время «сна», а также чтобы при этом устройство потребляло минимум энергии.
Перед нами сейчас такие задачи не стоят. Перед нами сейчас стоят другие задачи, а именно разобраться, какие именно у контроллера STM32, в частности у STM32F103, бывают режимы пониженного энергопотребления, как эти режимы включить, сколько в том или ином режиме контроллер будет потреблять и, конечно же, проверить и закрепить данные знания, которые мы получим, на практике. Также немаловажно понять, какие данные сохранятся после входа и выхода в режим, а какие — нет.
Поэтому откроем техническую документацию STM32F1 Reference Manual и посмотрим, какие же существуют режимы пониженного энергопотребления у микроконтроллеров STM32.
В данной таблице мы видим, что таких режимов у нашего контроллера всего три
Каждый из трёх режимов ведёт себя, соответственно по-разному и имеет различный эффект. При разных режимах отключаются различные виды периферии, также для выхода из каждого режима требуется различные мероприятия.
Общее то, что окончательный запуск любого режима осуществляется одной из ассемблерных команд — WFI (wait for interrupt) или WFE (wait for event). Отличие данных команд в том, что если мы используем команду WFI, то пробуждение из режима происходит по прерыванию, а если WFE — по наступлению события (периферийного прерывания, которое не было разрешено в NVIC).
Поэтому знакомиться с разными режимами мы будем в отдельных уроках.
И сегодня мы познакомимся с режимом, который занял первое почётное место в таблице — режимом SLEEP или режимом сна.
Потребление энергии у нашего контроллера в данном режиме, судя по даташиту на данную серию контроллеров следующее
Вход в режим SLEEP осуществляется при помощи одной из команд — WFI или WFE.
А перед тем, как мы дадим такую команду, мы проведём некоторые мероприятия.
Не помешает нам отключить кое-что в системном таймере SysTick.
Чтобы это проделать, необходимо немного знать о системном таймере.
Конечно, в рамках данного урока, мы не будем изучать полностью архитектуру данного таймера, этот вопрос, мы, скорее всего рассмотрим в каких-то последующих занятиях. Но с одним из регистров системного таймера SysTick мы познакомимся.
Для этого мы откроем другой технический документ — Programming Manual for STM32F10xxx/20xxx/21xxx/L1xxxx.
Зайдём в раздел, посвящённый SysTick и посмотрим описание управляющего регистра STK_CTRL (SysTick control and status register)
Из 32 возможных битов значащих у данного регистра всего 4.
Давайте их и рассмотрим.
Бит 16: COUNTFLAG — Возвращает 1, если SysTick после последнего считывания перешел на 0, то есть досчитал до конца.
Бит 2: CLKSOURCE (Clock source selection) — источник тактирования. 0 — AHB/8, 1 — с частотой тактирования процессора без делителя (AHB).
Бит 1: TICKINT SysTick (exception request enable) — разрешение прерывания по достижению 0. 0 — прерывание запрещено, 1 — прерывание разрешено.
Бит 0: ENABLE: (Counter enable) — включение счётчика. Когда бит установлен в 1, то счётчик загружает значение из регистра LOAD и начинает обратный отсчёт. 0 — счётчик выключен, 1 — счётчик включен.
Перед переходом в спящий режим SLEEP целесообразно бит TICKINT сбросить.
Также будет задействован ещё один регистр — SCR (System Control Register). Данный регистр уже относится к SCB (System control block) или блоку управления системой.
Поэтому вкратце изучим и этот регистр
Здесь действующих битов всего 3.
Бит 4: SEVONPEND (Send Event on Pending bit) — Настройка события об окончании ожидания. 0 — процессор разбудить могут только включенные прерывания, 1 — все прерывания, включая и отключенные, могут будить процессор.
Бит 2: SLEEPDEEP — Настройка режима сна. 0 — обычный «сон», 1 — «глубокий» «сон».
Бит 1: SLEEPONEXIT — Настраивает режим сна при использовании потокового режима. 0 — не спать при возвращении в потоковый режим, 1 — переход в режим сна по возвращении из процедуры обработки прерывания.
Поэтому мы также должны сбросить бит SLEEPDEEP в регистре SCR (System Control Register), так как сон у нас будет «неглубоким».
Ну, и после всего этого, собственно команда перехода в режим SLEEP.
Причём, если мы решили использовать WFI (а её мы и будем использовать), то используется только эта команда, а в случае WFE кроме собственно команды используется ещё одна команда ассемблера — SEV, которая генерирует (посылает) событие.
После выхода из режима сна мы должны не забыть включить прерывания от системного таймера SysTick, установив бит TICKINT.
В режиме SLEEP отключается только тактирование, из-за чего происходит прекращение выполнения кода. Вся периферия остаётся в работе, все ножки портов сохраняют своё состояние.
Выход из режима SLEEP осуществляется по любому прерыванию в случае использования команды WFI, а также по любому событию в случае использования WFE. В качестве источника прерывания мы будем использовать внешнее прерывание от кнопки, а также прерывание от будильника модуля RTC, так как кнопку не всегда есть кому нажать и мы в любой момент можем захотеть выводить систему из SLEEP по истечению определённого интервала времени, что используется даже гораздо чаще.
Контроллер мы по-прежнему будем использовать STM32F103C8T6, который установлен на недорогой отладочной плате, также вся схема, которая была у нас в уроках по сторожевым таймерам 138 и 140, также изменений не притерпела. Я только расскажу, что пришлось выпаять из отладочной платы, чтобы не было лишнего энергопотребления. Это было уже сделано давно, но как именно, я ещё не рассказывал.
Для начала посмотрим схему нашей отладочной платы
Из данной схемы мы уберём вот этот стабилизатор, так как он может немного через свой выход отбирать энергии
Также нам нужно будет отключить два светодиода. Но чтобы их не отпаивать, можно отпаять их токоограничивающие резисторы
Данные элементы находятся на плате снизу и удобнее всего всё это проделывать ещё до установки гребёнок с штырьевыми контактами
Вот так вот всё выглядит после процедуры выпаивания
Также мы подключим в разрыв плюса питания, поступающего с ST-Link, милиамперметр в лице мультиметра, который способен измерять токи с точностью до 1 микроамперметра. Точнее нам пока не надо. Возможно более точный прибор потребуется, когда мы будем тестировать подобные режимы у контроллеров серии L. Также подключим ST-Link к компьютеру
В следующей части урока мы создадим проект, напишем код и проверим на практике работу режима SLEEP.
Предыдущий урок Программирование МК STM32 Следующая часть
Техническая документация:
STM32F10xxx-20xxx-21xxx-L1xxxx-Programming-Manual
Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6
Программатор недорогой можно купить здесь ST-Link V2
Смотреть ВИДЕОУРОК (нажмите на картинку)
Добавить комментарий