Методы энергосбережения в STM8L

Питание от кактусов, долгие годы работы от батарейки…
Сегодня рассмотрим способы снижения энергопотребления в STM8L.

Все технические подробности которые тут указаны, справедливы для линейки STM8L15xx/STM8L16xx, представитель которой стоит на STM8L-Discovery. Для других МК — смотрите референс мануал на нужную линейку.


Во-первых для снижения потребления можно уменьшать частоту МК.

По умолчанию МК стартует от внутреннего 16МГц RC генератора с делителем на 8. Потом при необходимости можно переключится на другие источники тактирования:

-LSI (Low speed internal) — Низкочастотный RC генератор с частотой 38кГц.
-HSI (High speed internal) — Собственно, тот источник от которого тактируется МК при старте. Номинальная частота = 16МГц.
-LSE (Low speed external) — Низкочастотный внешний генератор или кварц. Обычно с частотой 32.768кГц.
-HSE (High speed external) — Кварц или генератор с высокой частотой.

Хотя это и немного выходит за тему, покажу как перключаться между источниками тактирования:

    // Настройка тактового генератора
    CLK_ECKR_bit.HSEEN = 1;            // Вкючаем HSE
    CLK_SWCR_bit.SWEN=1;               // Разрешаем переключение источника тактовой частоты
    while(CLK_ECKR_bit.HSERDY != 1) {} //Ждем готовности источника тактирования
    CLK_CKDIVR = 0;                    // Предделитель равен нулю
    CLK_SWR = 0xB4;                    // Выбираем HSE источником тактовой частоты
    while (CLK_SWCR_bit.SWIF != 1){}   // Ждем готовности переключения 

Это код из статьи ZiB про систему тактирования в STM8. Оно, правда, для STM8S но суть от этого не меняется.

Для снижения тактовой частоты HSI можно использовать регистр CLK_CKDIVR, который отвечает за предделитель. Вот его возможные значения:
0 - CLK/1
1 - CLK/2
2 - CLK/4
3 - CLK/8
4 - CLK/16
5 - CLK/32
6 - CLK/64
7 - CLK/128


Вот как выглядит потребление STM8L15x при разных источниках тактового сигнала и разных частотах (вся периферия отключена, код выполняется из флеш памяти):


Кроме снижения частоты можно отключить ненужную периферию. В случае STM8L — просто не включать её (вся периферия при старте отключена).

Для контроля за тактированием периферии служат регистры CLK_PCKENR1, 2 и 3. В STM8L101 всего один регистр, ибо периферии там намного меньше. Каждый бит этих регистров соответствует какому-либо периферийному устройству. Чтобы подать на него тактовый сигнал, в бит записывается 1. Для отключения периферии — записывается 0.

В STM8S при запуске тактирование подано на все периферийные устройства, поэтому очень важно отключать все, что не нужно, если требуется низкое потребление.

При отключении тактирования периферии, доступ к её регистрам невозможен, но их значение остается неизменным. Это значит, что можно отключать тактирование на то время, пока устройство не используется, без необходимости повторной инициализации после того, как тактирование будет включено.

Теперь перейдем к самому главному средству экономии батареек — ждущим и спящим режимам.

WFI — Wait For Interrupt
Как следует из названия, в этом режиме МК ждет прерывания. Если точнее, то ядро останавливается, а периферия продолжает работать. Как только периферия даст прерывание, ядро проснется и побежит выполнять обработчик.

Переход в этот режим осуществляется при помощи инструкции WFI. При этом нужные прерывания должны быть настроены и включены.

Если программа полностью построена на прерываниях, то можно поступить еще хитрее.
При инициализации устанавливаем бит AL в регистре CFG_GCR. Теперь после того, как МК выйдет из обработчика прерывания, он вернется обратно в спящий режим, не возвращаясь в основную программу. Удобно же.

WFE — Wait For Event

В отличие от предыдушего режима, тут мы ждем не прерывание, а событие. Какое именно? Это настраивается через регистры WFE_CRx (x = 1..4).

Например, событием может быть завершение према/передачи по какому-либо интерфейсу или совпадение/захват на любом из таймеров.

Событий чуть более, чем много. Практически на каждый случай жизни. Полный список смотрите в референс мануале на нужную линейку МК.

Этот режим удобно использовать вместо циклов ожидания при работе с какой-нибудь периферией.

МК выходит из WFE режима не только по событию, но и по прерыванию, как в WFI.

Находясь в режимах ожидания, МК потребляет намного меньше тока, чем в активном режиме:


Halt и Active Halt

Этот режим похож на Power Down в AVR. Останавливается тактовый генератор, периферия отключается, потребление при этом падает до сверхнизких показаталей.

Для входа в этот режим предназначена команда HALT.
Перед этим надо сбросить флаги активных прерываний (если они установлены), иначе фокус не получится, и МК в спящий режим не уйдет.
Так-же перед уходом в спячку стоит заглянуть в регистр CLK_ICKCR — там есть несколько интересных флагов:



Первое, что нас интересует, это FHWU — бит отвечающий за источник тактового сигнала, который будет выбран при выходе из halt режима.
0 означает, что МК продолжит работать с тем-же источником тактового сигнала, какой был выбран до входа в спящий режим.
1 значит, что при выходе из спящего режима будет выбран внутренний RC с делителем на 8. При этом МК будет просыпаться немного быстрее, и не зависнет, если кто-то оторвал кварц, пока МК спал.

Бит SAHALT отвечает за то, будет-ли включен внутренний стабилизатор напряжения (1.8V для ядра) в спящем режиме. По умолчанию он не отключается (SAHALT=0). Если записать в SAHALT 1, то регулятор будет отключаться, но и пробуждение будет занимать немного больше времени.

Выход из Halt и Active-halt режима происходит по внешнему прерыванию или прерыванию от RTC.

ВАЖНОЕ ЗАМЕЧАНИЕ
Неиспользуемые пины, которые болтаются в воздухе, надо вешать на внутренний подтягивающий резистор или переключать на выход. Иначе, если они будут настроены на floating input, никакой экономии не получится.

For example

Для примера напишем программку, которая будет циклически выводить на LCD цифры от 0 до 9 с задержкой в 1 сек.

Для вывода цифр будет использовать функции из демо программы, которая зашита в STM8L-Discovery. Там есть несколько функций, позволяющих выводить на дисплей не только цифры, но и буквы и даже время из RTC. Вся эта штука невозбранно отъела 2к памяти, но у нас осталось еще 30 :)

Большую часть времени программа будет находится в active-halt режиме с работающим LCD. Пробуждение будет осуществляться при помощи AWU — приблуды, встроенной в RTC, которая может генерировать прерывания через заданый промежуток времени.

Итак, инициализируем периферию:

   CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);//Такт для RTC
   LCD_GLASS_Init(); //Инициализируем стекляшку
   
   //Переключаем все неиспользуемые пины на выход:
   GPIOA->DDR = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
   GPIOC->DDR = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_1 | GPIO_Pin_0;
   GPIOE->DDR = GPIO_Pin_7 | GPIO_Pin_6;
      
   //Настраиваем RTC
   RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16); //time_step = 488uS
   RTC_ITConfig(RTC_IT_WUT, ENABLE);
   enableInterrupts();

Потом уходим в halt, не забыв поднять бит AL (МК будет автоматически уходить в спящий режим после выхода из прерывания)

   CFG->GCR |= CFG_GCR_AL; //Поднимаем флаг AL
   RTC_SetWakeUpCounter(2049);//Прерывание через каждую секунду
   RTC_WakeUpCmd(ENABLE);

   halt();

Теперь обработчик прерывания, в котором мы инкрементируем переменную и выводим её на LCD:

count++;
   if (count>9) count=0;
   tmp = 0x30 + count; 
   ptmp =&tmp;
   LCD_GLASS_WriteChar(ptmp, FALSE, FALSE,1); //Выводим цифру в 1 позицию на экране
  
   RTC_ClearITPendingBit(RTC_IT_WUT); //Сбрасываем флаг прерывания

(сие находится в файле STM8L15x_it.c в папке src)

Вот так. В архиве, как обычно проект для IAR.

  • +11
  • 02 августа 2011, 00:40
  • dcoder
  • 1
Файлы в топике: LCD-HALT.zip

Комментарии (23)

RSS свернуть / развернуть
надо было замерить, сколько он работает, допустим, от ионистора в разных режимах :)
0
Устанешь ждать. ATtiny с похожим дисплеем, показывающая температуру от двух датчиков DS18B20, живёт от конденсатора на 10000 мкФ, заряженного до 5 вольт, от 2 до 13 минут, в зависимости от частоты опроса датчиков (раз в 1-30 секунд) и точности измерения (11-12 бит). Потребляло примерно 20 мкА в режиме ожидания. Что уж говорить о stm8l и ионисторе 1Ф. Пару суток наверное проработает, если у ионистора саморазряда не будет.
0
ну тогда кондер взять. чтоб в пределах получаса
0
Нормальненько. Не измерял потребление в зависимости от кода?
(http://ziblog.ru/2011/07/25/stm8l-ndash-tok-potrebleniya-v-aktivnom-rezhime/)
0
  • avatar
  • ZiB
  • 02 августа 2011, 05:39
Нет, хотел измерить потребление в спящем режиме в зависимости от настроек LCD, но потом лень стало :) Может еще к этому вернусь.
0
Событий чуть более, чем много. Практически на каждый случай жизни. Полный список смотрите в референс мануале на нужную линейку МК.

Назвал бы чтоль парочку событий для примера.
0
Готово, шеф :)
0
Спасибо за статью! Но один аспект который я ещё из книги по AVR запомнил: необходимо учитывать рентабельность снижения частоты, ибо при её сильном понижении МК будеть потреблять больше из-за большего времени выполнения операций.
P.S.: Ещё больше захотел приобрести STM8L.
0
В том то и дело что нужно (можно) управлять частотой или как в статье просто укладывать в спячку(ожидание) мк, а после пробуждения (повышать частоту) быстренько обрабатывать что нужно.
0
Спасибо за разъяснение.
0
На самом деле в статичном режиме (между тактами) МК практически не потребляет. Основная масса затрат энергии идет на перезаряд емкостей затворов в ключах. Соответственно чем быстрей тикаем тем больше тратим. Но т.к. операцию можно выполнить строго за определенное число тиков и от частоты это не зависит, то на какой частоте тикать не имеет значения почти. С другой стороны на большей частоте у МК больше свободного времени на котором он тикает вхолостую тратя энергию.
+1
Вбросил на конкурс.
0
Недавно тоже проводил «исследования» потребляемого тока в активном режиме у MSP430. Прогнал 20 разных процов.

Энергопотребление в активном режиме на частоте 1.1 МГц при питании 3.54В составляет (у разных моделей) от 350 до 480 мкА.

Кому интересно — тут zhevak.wordpress.com/2011/08/05/msp430-потребляемый-ток/
0
То же не плохо, но по моему у данной линейки мало чего есть из периферии, да и памяти мало. (могу ошибаться не спец по ним).
На вскидку у STM8L152C8 почти такое же потребление на 1 МГц, до 550 из флеша и до 320 из ОЗУ.
А на борту много чего вкусного есть ;)
0
То же не плохо, но по моему у данной линейки мало чего есть из периферии, да и памяти мало. (могу ошибаться не спец по ним).
На вскидку у STM8L152C8 почти такое же потребление на 1 МГц, до 550 из флеша и до 320 из ОЗУ.
А на борту много чего вкусного есть ;)
Хотя наверное у ТИ есть 16 ацп, чего нет у стм
0
Вот и я думаю — чем эти msp430 лучше STM8L? вроде ничего такого в них нету.
А в каком-то мк от TI был 24 бит Сигма-дельта АЦП :)
0
читал, я там отписался по режиму Low Power Run…
0
Да как бы сами по себе MSP430 ничем не лучше. И если хуже, то не особо и не на много.

Сравнивая по потреблению и скорости работы два этих проца, я вижу, что ничего существенного в STM8 я не выигрываю. Но это мое мнение, частное. А вот проигрываю — это, да.

Причем сразу. STM8 — это новое ядро (для меня лично). В него еще нужно вкладывать свои ресурсы (время и деньги), а MSP430 — уже освоено и приносит урожай каждый месяц.

Второй момент. На сколько я знаю, для STM8 до сих пор отсутствуют Линуксовые компиляторы-программаторы-отладчики, и которые, как понимаю, даже не планируются. Вендовые тулчейны, запускаемые под Вайном, — это все не то. Это костыли. Уж лучше Венда, чем Линух с костылями.

Третий момент. Если в серьез задумываться о том, что MSP430 — это старое ядро и периферии там не много, тогда уж лучше ориентироваться на Cortex-M0. По крайней мере будешь находится в мэйнстриме.

Еще один момент. Цена. Конечно, цена на STM8 не может не радовать. Но давайте честно ответим себе на два вопроса. Первый: какими партиями мы собираемся продавать свои изделия? Второй: сколько процентов в конечной цене изделия составляет цена процессора?

При поставках в 1000 изделий в месяц, мне кажется, что лучше продолжать работать с тем, что хорошо знаешь. А те процы, которые интересны, «попиливать» в тихие зимние вечера, в свободное от работы время.

Сам по себе STM8 — не плохая штука. Но… чем он лучше, чем другие процы?

Я тоже не вижу, чем (MSP430 + вся связанная с ним экосистема) лучше. Но я так же не вижу, чем (STM8 + вся связанная с ним экосистема) лучше. Эти процы — одного поля ягоды.
Различия не существенны, чтобы бросить все наработанное и начать жизнь снова.

А потом, когда количество ядер становится большим, начинаются проблемы. Поэтому я бы предпочел не отвлекаться на STM8.

Для одноразовых поделок цена не является решающим фактором, поэтому берем то, что есть — например, AVR, изученный вдоль и поперек. А в какую-нибудь серийную продукцию наверно лучше закладывать то, что лучше поддерживается в коммьюнити и что лучше знаешь.

Не знаю, чем MSP430 лучше… Он удовлетворяет моим требованиям, а это главное. А вот STM8 — пока нет. И вряд-ли будет, если я буду пилить не его, а, например, lpc1114. Я не знаю, чем MSP430 лучше… наверно только тем, что я сказал.

Я ответил на Ваш вопрос?
0
Да, я вроде не задавал вопрос :)
Цель высказывания была показать что в плане потребления стм-ка не сильно отстает от мсп430, как может показаться тому кто только что зашел сюда.

P/S В текущий момент мне нравиться работать с стм8(32), лично для меня серьезный прорыв после авр (sam7s(arm7)).
0
О-о, это я так отвечал dcoderу.
Но пост почему-то «подклеился» параллельно Вашему.
Извините!

По энергетике. В 2008-ом я как-то измерял энергопотребление ATTINY48P. Примерно раза в полтора Тайни потребляла больше, чем MSP430 на одномегагерцовой частоте и напряжении питания 3.3В. При снижении питания до 2.2 энергетика выравнивалась. А при напряжении ниже 1.8В MSP430 уже начинала проигрывать. Понятно, что при таком напряжении лучше не работать. Поэтому, в те времена я выбрал более дорогую MSP430.

Прошло два года. Цены повернулись в другую сторону. На рынке появился третий кандидат, примерно с таким же параметрами. Появились маложрущие Кортексы, которые я пока еще не успел пощупать. Я задаюсь вопросом — что-нибудь существенно в энергопотреблении процов изменилось? — Нет! Стало больше зверей в зоопарке, да. Но существенных изменений в области энергетики пока не видно. Суета все это.

А вот обзоры такого характеры очень даже нужны.
Спасибо автору за проделанную работу!
0
ОК, нет проблем. Я обычно не сильно восприимчив :)
Я раньше как-то не думал о малом потреблении, но когда стал заниматься переносными шутчками, то стало интересно что да как.
Разнообразия добавилось за последнее время. Жду удобного момента для тестирования STM32L, то же вроде не плохие камушки должны быть.
0
ага. Вот и так же. Производители пишут про свои камушки много заманчивых слов. LPC1114 — 165 мкА на MIPS (ЕМНИП). Хочется пощупать своими руками. Но как! Как блин Это ж надо в отпуск уйти на месяцок. Отрубить все телефоны, что никто не дергал. Вот тогда можно реально ощутить проц. А так, среди рабочей беготни! Ха! Я не помню, что я на прошлой неделе делал, какой код писал, и какие идеи преследовал. То одно, то другое… то АВР, то MSP, то Кортексы, то асм, то Си, то CD4013 (-- у него вроде как CLR и SET входа управляются единицами?). То заказчик вместо 12 В подаст 220. Все нахрен воносит! Потом претензии шлет — «гавно — Ваши приборы!». То по пол-года не платит, а продукцию регулярно запрашивает. Блин! Чем зарплату платить — хз! То склад затопит, зх что делать с утопленными компонентами. То узбеки варить втихаря что-нибудь начнут — помехи гроздями, питалово исчезает. То старший ребенок школу закончит, то крыша в гараже потечет, то связисты пришлют счет на оплату телефона, которого никогда не было, то Московские бандиты (коллекторная контора по выбиванию долгов) наедут — дескать, плати бабло связистам и нам тоже! А у них там такой бардак в их БД с их козлячим биллингом. То лето заканчивается — жену срочно выгулять на юга надо… бли-и-ин! А когда ж кортексами заниматься?

Хех! Думаю, Вы меня понимаете.
+1
коллега это жизнь :) и я вас прекрасно понимаю :)
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.