реклама на сайте
подробности

 
 
> Грабли с энергосбережением STM32F0, STM32F0 low power mode, exti
stas00n
сообщение Jan 25 2018, 09:44
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 181
Регистрация: 26-11-10
Пользователь №: 61 198



Понадобилось тут "усыпить" STM32F030R8 чтобы только часы работали от резервной батарейки. Сделал вроде все по уму - висячие и не нужные ноги сконфигурировал выходами, где надо pullup/pulldown в нужную сторону, усыпляю - жрет 500 мкА. Перешерстил схему, код, прощупал все в поисках неправильных подтяжек и паразитных питаний - все ОК. Перечитал Reference manual, Datasheet и еррату. Все по науке, криминала не нашел. Поменял контроллер - предположил что подпаленный - результат тот же, - 450-500 мкА.
Вернулся к коду. В начале main инициализирую RCC и GPIO, усыпляю - потребляет 30 мкА, как и должно. Значит проблема в какой-то периферии далее. Копаю дальше не маленький код, тыкаю осциллографом, листаю регистры в отладчике, построчно комментирую. Проблема то появится то исчезнет, на ее локализацию ушло полдня и много нервных клеток.
Причина: используется у меня ножка GPIOB1 как вход для внешнего прерывания в режиме когда подключено основное питание. Подтянута вверх. Во сне эта ножка не нужна и я ее подтягиваю к земле, чтобы не давала паразитного питания на остальную схему которая обесточена. Перед этим, естественно, запрещаю соответствующее прерывание. Причем запрещал только в NVIC, а в регистрах EXTI->IMR, EXTI->FTSR оставлял разрешенным. В результате, как только я (перед сном sm.gif )дрыгаю этой ногой вниз, взводится флаг в EXTI->PR, но прерывание не возникает, поскольку запрещено в NVIC. Так вот, если контроллер теперь положить в любой из энергосберегающих режимов, с установленными битами в PR - он будет потреблять лишние 450 мкА!
Решение:
1. Если надо запретить внеш. прерывание, делать это сначала в периф. модуле, а уж потом, если есть необходимость - в NVIC.
2. После запрета в NVIC - вручную сбросить pending bits, если таковые появились.
3. После выполнения п.2 сразу переводить МК в low power mode, не дрыгая ногами.
Код для "воспроизведения" граблей:
CODE
void Exti_Leak_Test()
{
// Включаем тактирование..
RCC_AHBPeriphClockCmd((RCC_AHBPeriph_GPIOA |
RCC_AHBPeriph_GPIOB |
RCC_AHBPeriph_GPIOC |
RCC_AHBPeriph_GPIOD |
RCC_AHBPeriph_GPIOF ), ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

// ..и инициализируем GPIO
GPIO_InitTypeDef io;
// Все "не нужные" входы подтягиваем:
io.GPIO_Mode = GPIO_Mode_IN;
io.GPIO_OType = GPIO_OType_PP;
io.GPIO_PuPd = GPIO_PuPd_DOWN;
io.GPIO_Speed = GPIO_Speed_Level_1;
// Пины SWD не трогаем
io.GPIO_Pin = (GPIO_Pin_All & (~GPIO_Pin_13) & (~GPIO_Pin_14));
GPIO_Init(GPIOA, &io);

io.GPIO_Pin = GPIO_Pin_All;
GPIO_Init(GPIOB, &io);
GPIO_Init(GPIOC, &io);
GPIO_Init(GPIOD, &io);
GPIO_Init(GPIOF, &io);

// Настраиваем внешнее прерывание:
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource1);

EXTI_InitTypeDef exti;
exti.EXTI_Line = EXTI_Line1;
exti.EXTI_Trigger = EXTI_Trigger_Rising;
exti.EXTI_Mode = EXTI_Mode_Interrupt;
// ..и разрешаем его в периф. модуле, но не разрешаем в NVIC
exti.EXTI_LineCmd = ENABLE;
EXTI_Init(&exti);

// "Генерируем" прерывание дергая подтяжку на PB1
GPIOB->PUPDR &= ~(0xC);
GPIOB->PUPDR |= 4;

// Ждем нарастания фронта
volatile uint32_t delay = 1000;
while(--delay);

// Возвращаем подтяжку PB1 к земле
GPIOB->PUPDR &= ~(0xC);
GPIOB->PUPDR |= 8;

// Если не сбросить бит в EXTI->PR, будет лишнее потребление тока
//EXTI->PR = 2;

// Переходим в режим STOP
//PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
// ..или StandBy
PWR_EnterSTANDBYMode();
// Тут отладчик отвалится, смотрим на амперметр.
// Также надо отключить разъем отладчика - он тоже потребляет ток.
}


Может кому поможет. Сам я не нашел ни предупреждений в документации, ни прецедентов в гугле.

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
amiller
сообщение May 1 2018, 05:16
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612



А ток потребления измеряете до линейника 3V3 или после? 100 мкА вполне может оказаться собственным потреблением LDO, если он выбран неправильно.
А периферию, ненужную во время сна, нужно было питать от другого (отключаемого) источника. Иначе возникает сомнение, где тут ток периферии, а где ток контроллера, теоретические умозаключения?
При соблюдении этих условий на F1 и F4 удавалось добиваться потребления в соответствии с документацией без танцев с бубном.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение May 3 2018, 10:37
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(amiller @ May 1 2018, 06:16) *
А ток потребления измеряете до линейника 3V3 или после? 100 мкА вполне может оказаться собственным потреблением LDO, если он выбран неправильно.
А периферию, ненужную во время сна, нужно было питать от другого (отключаемого) источника. Иначе возникает сомнение, где тут ток периферии, а где ток контроллера, теоретические умозаключения?
При соблюдении этих условий на F1 и F4 удавалось добиваться потребления в соответствии с документацией без танцев с бубном.

В качестве LDO выбран MCP1702, который имеет Iq = 2мкА и который, в свою очередь и согласно графикам дока, растет незначительно до тех токов (~0.13mA), которые сейчас имеют место в режиме STOP. На входе LDO (в режиме STOP процессора, когда он обнаруживает пропадание 5V внешнего питания) - примерно 4V от LiPo акумулятора. Ток я меряю как раз из аккумулятора. Зарядом акку и переключением нагрузки при пропадании питания 5V занимается BQ24232 (то есть, выход BQ24232 подан на вход LDO).
Как я писал в этой ветке чуть выше, я имею потребление в 25мкА, если перевожу процессор в режим STANDBY, при котором он не ест почти ничего. То есть, 100мкА из 125мкА моего режима STOP съедает явно процессор.
Go to the top of the page
 
+Quote Post
Baser
сообщение May 4 2018, 13:54
Сообщение #4


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(KnightIgor @ May 3 2018, 13:37) *
Как я писал в этой ветке чуть выше, я имею потребление в 25мкА, если перевожу процессор в режим STANDBY, при котором он не ест почти ничего. То есть, 100мкА из 125мкА моего режима STOP съедает явно процессор.

Это еще не факт, ибо в Standby почти все порты аппаратно переключаются на вход без подтяжек, а при STOP они сохраняют свое состояние. Поэтому проверьте все уровни на ножках.
Еще может быть эффект с уровнем в половину питания на плавающей ножке. Столкнулся с этим на STM32L1 в Standby:
Поднимаю напряжение (независимое) на отключенной ноге WakeUp - начинает расти потребление от батареи!
Сначала микроамперы, а при половине питания до 80 мкА лишних потекло. А вроде бы какая связь, источники то разные smile3046.gif
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение May 7 2018, 18:40
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(Baser @ May 4 2018, 14:54) *
Это еще не факт, ибо в Standby почти все порты аппаратно переключаются на вход без подтяжек, а при STOP они сохраняют свое состояние. Поэтому проверьте все уровни на ножках.
Еще может быть эффект с уровнем в половину питания на плавающей ножке. Столкнулся с этим на STM32L1 в Standby:

Да, я проверял все уровни, благо, ножек не много. Так я обнаружил "средний" уровень на TX процессора, когда я деактивировал его UART, что приводило в итоге к значительному росту потребления (скорее) со стороны RS485 чипа. Я перестал деактивировать UART, т.к. этот узел ничего не потребляет в STOP, однако сохраняет управление TX и уровень последнего. Все это немедленно улучшило ситуацию. Остальные ноги находятся на определенных предусмотренных уровнях, не "тягаясь" с кем-то снаружи. Если предусмотрены Pull-up, так и внешние OK транзисторы закрыты, и т.п. Единственный аналоговый вход имеет действительно примерно половинное питание от выхода операционника. Этот вход определен как аналоговый, а не цифровой вход, а операционник - вообще TLV2401, который "кушает" 0.9мкА.

Где копать дальше - не знаю.
Go to the top of the page
 
+Quote Post
zhevak
сообщение May 14 2018, 07:35
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(KnightIgor @ May 7 2018, 23:40) *
Где копать дальше - не знаю.


1. Не отчаиваться!

2. Возможно я не прав, но я бы сначала сдул с платы всю (потребляющую или возможно потребляющую)
периферию. Оставил бы МК "голым", в гордом одиночестве. И в такой конфигурации попытался бы
получить нужное потребление. Потом бы шаг за шагом добавлял на плату периферийные микросхемы.

3. Когда я работал с MSP430, то в книжке (по моему вроде в книжке автора Фрузе) приводилась наглядная
диаграмма сквозного тока у полевых структур, который возникает при входном напряжении, близком к
половине питания. К сожалению, эту картинку я не смог найти, но нашел другую:


Зрительные образы лучще запоминаются.

4. И ещё -- выдержка из книжки John H. Davies "MSP430 Microcontroller Basics" (она в инете выложена в pdf)

Цитата
[page 215]
7.2.1 Configuration of Unused Pins

Not all of the input/output pins are used in most applications. Unused pins must never be
left unconnected in their default state as inputs. This follows a general rule that inputs to
CMOS must never be left unconnected or ”floating.” A surprising number of problems can
be caused by floating inputs. The most trivial is that the input circuit draws an excessive
current from the power supply. This is because the input is likely to float to the midpoint
of V SS and V CC , turning on both MOSFETs and leading to the situation shown in
Figure 7.2©. The shoot-through current may exceed 40 ␮A, a huge waste by the standards
of the MSP430.

Old CMOS circuits, such as the 74HC family, are amazingly sensitive to floating
inputs. They may oscillate or refuse to work at all if an input is floating, even if the input
belongs to an unused gate or flip-flop. I have seen this happen many times when students
have not taken heed of the rule about floating inputs. Missing decoupling (bypass)
capacitors can cause similar problems. Floating inputs are also susceptible to noise
and to static electricity if the product is handled, which may lead to permanent
damage.

There are three ways of avoiding these problems:

1. Wire the unused pins externally to a well-defined voltage, either V SS or V CC , and
configure them as inputs. The danger with this is that you might damage the MCU
if the pins are accidentally configured as outputs.

2. Leave the pins unconnected externally but connect them internally to either V SS or
V CC by using the pull-down or pull-up resistors. They are again configured as
inputs. I prefer this approach but it is restricted to the MSP430F2xx family
because the others lack internal pull resistors.

3. Leave the pins unconnected and configure them as outputs. The value in the
output register does not matter. This is perhaps the most robust solution and is
recommended for MSP430 devices that lack internal pull resistors. I am less keen
on this approach for experimental systems because it is easy to short-circuit pins
with a test probe.

There is a helpful list of recommended connections for unused pins at the end of the
chapter on System Resets, Interrupts, and Operating Modes in the family user’s
guides.

In some manufacturers’ devices the unconnected bits of a port may be present on the chip
itself but are not bonded to pins
. In this case it is important to configure all bits of the port
correctly, including those that are not connected to the outside world. This issue arises
when the same integrated circuit (the same ”silicon”) may be offered in packages with
different numbers of pins. I believe that this does not apply to the MSP430. However, a
few input/output registers contain bits without corresponding pins. For example, the
F1121A has all 8 bits of P2IFG implemented on silicon but there are pins for only
P2.0–P2.5. The bits for the missing pins 6 and 7 can be used for software interrupts.


Собственно, об этом С.Борщ сказал уже.

5. А Вы, случаем, не забываете отключить от платы программатор, когда измеряете потребление?
У меня при подключении st-link (по SWD) потребление сразу возрастает.

6. Мне тоже нужно загнать свой девайс в спячку. Проц MSP430F030C8. Питание проца 3.3 В.
Режим "спчки" -- STOP. Внутренний стабилизатор LDO на 1.8 В, я НЕ перевожу в
малопотребляющий режим. Все биты портов проинициализированы и развёрнуты на выход.
В том числе биты, которые предназначены для подключения кварцевых резонаторов. Вся
внутренняя периферия (за исключенимем PWR и RTC) отключена. Главный цикл программы
пустой:

Код
  while (true)
  {
    SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
    __WFE();
  }


Просыпаюсь раз в секунду (от Alarm), зажигаю сетодиод на 5 мкс и тут же гашу -- потребление
33 мкА, Если просыпаюсь 128 раз в секунду (тоже по событию от AlarmA), то потребление
возрастает до 40 мкА.

Следует заметить, что разные тестеры (типа традиционного 838-го) показывают разное
потребление. Показания колеблются от 27 мкА до 40 мкА.


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение May 15 2018, 07:35
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(zhevak @ May 14 2018, 08:35) *
1. Не отчаиваться!

biggrin.gif

Цитата
2. Возможно я не прав, но я бы сначала сдул с платы всю (потребляющую или возможно потребляющую)
периферию. Оставил бы МК "голым", в гордом одиночестве. И в такой конфигурации попытался бы
получить нужное потребление. Потом бы шаг за шагом добавлял на плату периферийные микросхемы.

Запланировано.

Цитата
4. И ещё -- выдержка из книжки John H. Davies "MSP430 Microcontroller Basics" (она в инете выложена в pdf)

Все входы-выходы перепроверил, никаких неопределенностей нет, все, что не задействовано (пара ног), - определено.

Цитата
5. А Вы, случаем, не забываете отключить от платы программатор, когда измеряете потребление?

Не забываю sm.gif.

Цитата
6. Мне тоже нужно загнать свой девайс в спячку. Проц MSP430F030C8.

Может MSP432?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- stas00n   Грабли с энергосбережением STM32F0   Jan 25 2018, 09:44
- - KnightIgor   Цитата(stas00n @ Jan 25 2018, 10:44) усып...   Jan 25 2018, 11:13
|- - stas00n   Цитата(KnightIgor @ Jan 25 2018, 13:13) П...   Jan 25 2018, 11:45
|- - KnightIgor   Цитата(stas00n @ Jan 25 2018, 12:45) При ...   Jan 25 2018, 12:05
- - stas00n   Действительно, забыл подать клок на секцию PWR. По...   Jan 25 2018, 12:40
|- - KnightIgor   Цитата(stas00n @ Jan 25 2018, 13:40) Дейс...   Apr 27 2018, 16:16
|- - Сергей Борщ   QUOTE (KnightIgor @ Apr 27 2018, 19:16) К...   Apr 27 2018, 20:19
|- - KnightIgor   Цитата(Сергей Борщ @ Apr 27 2018, 21:19) ...   Apr 29 2018, 20:07
||- - aaarrr   Цитата(KnightIgor @ Apr 29 2018, 23:07) П...   Apr 29 2018, 20:25
||- - KnightIgor   Цитата(aaarrr @ Apr 29 2018, 21:25) Хм. Н...   Apr 29 2018, 22:33
||- - aaarrr   Цитата(KnightIgor @ Apr 30 2018, 01:33) И...   Apr 29 2018, 22:55
||- - KnightIgor   Цитата(aaarrr @ Apr 29 2018, 23:55) Прове...   Apr 30 2018, 15:48
|- - KnightIgor   Цитата(Сергей Борщ @ Apr 27 2018, 21:19) ...   Sep 26 2018, 12:36
- - k155la3   Цитата(amiller @ May 1 2018, 08:16) . . ....   May 1 2018, 10:23
|- - amiller   Цитата(k155la3 @ May 1 2018, 13:23) На ма...   May 1 2018, 11:44
|- - k155la3   Цитата(amiller @ May 1 2018, 14:44) Может...   May 1 2018, 11:51
- - KnightIgor   Цитата(KnightIgor @ May 3 2018, 11:37) Ка...   May 4 2018, 12:41
- - zhevak   Цитата(KnightIgor @ May 15 2018, 12:35) М...   May 15 2018, 07:50
- - zhevak   Коллеги! Двумя комментариями выше я привёл код...   May 20 2018, 06:09


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 17:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.01447 секунд с 7
ELECTRONIX ©2004-2016