Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Power Down и Sleep на lpx17xx
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
evgen2
Приветствую,
не подскажет ли всезнающий All хорошего примера по периодическому впадению в спячку и просыпанию.

А то (конкретно на lpx1778) какая-то ерунда получается. cranky.gif
Для случая DeepPowerDown и просыпанию от RTC Alarm - все получается на первый взгляд замечательно (по морганиям лампочки на пине в прерывании от обычного таймера) все замечательно в автомате - на время засыпания лампочка гаснет, по просыпанию частота моргания не меняется, без всяких дополнительных телодвижений.
В PowerDown и DeepSleep лампочка не гаснет, по просыпанию частоты уплывают раз в 10 (что вроде бы логично, нужно делать SystemInit),
А в Sleep вообще не спит.

А если нет TIMER0_IRQn, то все "входит и выходит", то есть уходит в PowerDown или Sleep на заданое время, по возвращении все частоты сохраняются и их не надо восстанавливать.

Смотрю в
\lpc\Examples\PWR\*.*
\lpc\Examples\RTC\Rtc_Alarm
и
\LPC178x Low Power Modes c AN11096_1.pdf

И чего-то как-то не складывается
jcxz
Цитата(evgen2 @ Jul 15 2015, 23:36) *
не подскажет ли всезнающий All хорошего примера по периодическому впадению в спячку и просыпанию.
А в Sleep вообще не спит.

А какой пример? Для SLEEP это: while (1) _WFI();
Работает на всех M3/M4 хоть LPC, хоть других одинаково.
Для LPC нужно только помнить, что флешь и некоторые регионы ОЗУ не доступны в SLEEP. Ну и читать соответствующий раздел user manual для LPC, касающийся режимов пониженного потребления.
evgen2
Цитата(jcxz @ Jul 16 2015, 10:34) *
Ну и читать соответствующий раздел user manual для LPC, касающийся режимов пониженного потребления.


действительно, теперь увидел в юзер мануале
In Sleep mode, execution of instructions is suspended until either a Reset or an interrupt occurs.
Т.е. при наличии прервываний по времени или устройств получается что-то вроде нормального писюшного sleep

А вот для PowerDown и Deep Sleep mode написано

The user must remember to re-configure any required PLLs and clock dividers after the wake-up

А оно и без re-configure работает, если нет прерываний.

Для Deep PowerDown про re-configure не написано, оно вроде бы так и работает, хотя кажется нелогичным.

Про "выдергивать JTAG" в юзер мануале, кстати, тоже не написано, только в аппноте. У меня от этого(?) чип перестал определяться JTAG-ом, хорошо что после заливки программы через COM-порт все восстановилось.

jcxz
Цитата(evgen2 @ Jul 16 2015, 16:13) *
А вот для PowerDown и Deep Sleep mode написано
The user must remember to re-configure any required PLLs and clock dividers after the wake-up
А оно и без re-configure работает, если нет прерываний.
Для Deep PowerDown про re-configure не написано, оно вроде бы так и работает, хотя кажется нелогичным.

Разве не очевидно, что Вы просто не входите ни в какой из этих режимов, так как там ясно написано: выход из любого режима пониженного потребления только по прерыванию.
Мне кажется в юзер-мануале ясно прописано как входить и выходить в/из этих режимов, и что где работает и не работает.
По-крайней мере когда я как-то использовал эти режимы, у меня всё получалось.
И хорошим тоном считаю явно самостоятельно отключать все блоки МК (в корректной последовательности), которые не работают в данном режиме перед входом в него. Как то: PLL, различную периферию и т.д. И переводить пины GPIO, подключенные к внешним цепям, в состояния GPIO, соответствующие для работы в нужном режиме сна. Тогда и не будет у Вас непонятного поведения на попытку входа в пониженное потребление и после выхода из него.
evgen2
Цитата(jcxz @ Jul 17 2015, 05:37) *
Мне кажется в юзер-мануале ясно прописано как входить и выходить в/из этих режимов, и что где работает и не работает.

Ясно оно становится после того, как в десятый раз прочтешь и наступишь на все грабли. Вот я как раз в процессе.

Цитата(jcxz @ Jul 17 2015, 05:37) *
По-крайней мере когда я как-то использовал эти режимы, у меня всё получалось.
И хорошим тоном считаю явно самостоятельно отключать все блоки МК (в корректной последовательности), которые не работают в данном режиме перед входом в него. Как то: PLL, различную периферию и т.д. И переводить пины GPIO, подключенные к внешним цепям, в состояния GPIO, соответствующие для работы в нужном режиме сна. Тогда и не будет у Вас непонятного поведения на попытку входа в пониженное потребление и после выхода из него.


Ну так хорошим тоном явлется и использование штатных примеров...
jcxz
Цитата(evgen2 @ Jul 17 2015, 12:25) *
Ясно оно становится после того, как в десятый раз прочтешь и наступишь на все грабли. Вот я как раз в процессе.

Это точно, читать там надо несколько раз, пока понимание не придёт wink.gif

Мне кстати нужно было чтобы работала встроенная тактируемая периферия (таймер) и при этом - минимальное потребление (устройство должно было периодически просыпаться, раз в неск. сотен мс,
опрашивать некоторую периферию (UART) и опять засыпать).
А среди режимов сна, в тех, которые удовлетворяли по потреблению, тактируемая периферия (в частности внутр. таймеры) не работают, а в тех, в которых они работают, потребление слишком большое.
Задействовать прерывание RTC или внешнее прерывание я не мог, так как изменения вносились в готовую плату и RTC там было не запитано.
Поэтому я сделал просто:
При входе в сон отключаю всю периферию. Все пины - в режим GPIO с нужными для сна уровнями. Перехожу на IRC без PLL, выключаю PLL.
Выставляю делитель частоты CPU (SYSCFG.CCLKCFG) на максимальный коэфф. деления == 256.
Запускаю Systick на требуемый интервал сна (с учётом текущей частоты ядра).
Затем - _WFE() и сон с завершением сна по прерыванию Systick и восстановлением всего в обратном порядке.

Получилось, что у меня ядро работало на частоте IRC/256=15.625кГц и весь МК потреблял примерно как в Power-down режиме.
Так что такой режим эквивалентен по потреблению режиму Power-down.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.