|
Грабли с энергосбережением STM32F0, STM32F0 low power mode, exti |
|
|
|
Jan 25 2018, 09:44
|
Частый гость
 
Группа: Участник
Сообщений: 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 оставлял разрешенным. В результате, как только я (перед сном  )дрыгаю этой ногой вниз, взводится флаг в 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(); // Тут отладчик отвалится, смотрим на амперметр. // Также надо отключить разъем отладчика - он тоже потребляет ток. } Может кому поможет. Сам я не нашел ни предупреждений в документации, ни прецедентов в гугле.
|
|
|
|
|
 |
Ответов
|
May 3 2018, 10:37
|
Знающий
   
Группа: Участник
Сообщений: 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 съедает явно процессор.
|
|
|
|
|
May 4 2018, 13:54
|

Просто 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 мкА лишних потекло. А вроде бы какая связь, источники то разные
|
|
|
|
|
May 7 2018, 18:40
|
Знающий
   
Группа: Участник
Сообщений: 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мкА. Где копать дальше - не знаю.
|
|
|
|
|
May 14 2018, 07:35
|

Знающий
   
Группа: Свой
Сообщений: 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 мкА.
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
May 15 2018, 07:35
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(zhevak @ May 14 2018, 08:35)  1. Не отчаиваться! Цитата 2. Возможно я не прав, но я бы сначала сдул с платы всю (потребляющую или возможно потребляющую) периферию. Оставил бы МК "голым", в гордом одиночестве. И в такой конфигурации попытался бы получить нужное потребление. Потом бы шаг за шагом добавлял на плату периферийные микросхемы. Запланировано. Цитата 4. И ещё -- выдержка из книжки John H. Davies "MSP430 Microcontroller Basics" (она в инете выложена в pdf) Все входы-выходы перепроверил, никаких неопределенностей нет, все, что не задействовано (пара ног), - определено. Цитата 5. А Вы, случаем, не забываете отключить от платы программатор, когда измеряете потребление? Не забываю  . Цитата 6. Мне тоже нужно загнать свой девайс в спячку. Проц MSP430F030C8. Может MSP432?
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|