|
Грабли с энергосбережением STM32F0, STM32F0 low power mode, exti |
|
|
|
Jan 25 2018, 09:44
|
Частый гость
![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif)
Группа: Участник
Сообщений: 181
Регистрация: 26-11-10
Пользователь №: 61 198
![](style_images/1/spacer.gif)
|
Понадобилось тут "усыпить" STM32F030R8 чтобы только часы работали от резервной батарейки. Сделал вроде все по уму - висячие и не нужные ноги сконфигурировал выходами, где надо pullup/pulldown в нужную сторону, усыпляю - жрет 500 мкА. Перешерстил схему, код, прощупал все в поисках неправильных подтяжек и паразитных питаний - все ОК. Перечитал Reference manual, Datasheet и еррату. Все по науке, криминала не нашел. Поменял контроллер - предположил что подпаленный - результат тот же, - 450-500 мкА. Вернулся к коду. В начале main инициализирую RCC и GPIO, усыпляю - потребляет 30 мкА, как и должно. Значит проблема в какой-то периферии далее. Копаю дальше не маленький код, тыкаю осциллографом, листаю регистры в отладчике, построчно комментирую. Проблема то появится то исчезнет, на ее локализацию ушло полдня и много нервных клеток. Причина: используется у меня ножка GPIOB1 как вход для внешнего прерывания в режиме когда подключено основное питание. Подтянута вверх. Во сне эта ножка не нужна и я ее подтягиваю к земле, чтобы не давала паразитного питания на остальную схему которая обесточена. Перед этим, естественно, запрещаю соответствующее прерывание. Причем запрещал только в NVIC, а в регистрах EXTI->IMR, EXTI->FTSR оставлял разрешенным. В результате, как только я (перед сном ![sm.gif](style_emoticons/default/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(); // Тут отладчик отвалится, смотрим на амперметр. // Также надо отключить разъем отладчика - он тоже потребляет ток. } Может кому поможет. Сам я не нашел ни предупреждений в документации, ни прецедентов в гугле.
|
|
|
|
|
![Start new topic](style_images/1/t_new.gif) |
Ответов
|
Jan 25 2018, 12:40
|
Частый гость
![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif)
Группа: Участник
Сообщений: 181
Регистрация: 26-11-10
Пользователь №: 61 198
![](style_images/1/spacer.gif)
|
Действительно, забыл подать клок на секцию PWR. Поэтому был режим не standby, а Sleep. Сейчас 3.1 мкА. Спасибо. Цитата(KnightIgor @ Jan 25 2018, 14:05) ![*](style_images/1/post_snapback.gif) Вы там ноги вниз тянете перед сном. Может где pull-up включен, вот он и жрёт? не, уже разобрался - см. выше. пулапы проверены были в первую очередь. Да и в standby режиме все подтяжки отключаются автоматом.. Я еще думал почему у меня порты сохраняют состояние, хотя в ДШ написано обратное. И, кстати, не сброшенный флаг в EXTI->PR "жрет", получается, только в Sleep mode, а в Stop и Standby - не влияет.
Сообщение отредактировал stas00n - Jan 25 2018, 12:12
|
|
|
|
|
Apr 27 2018, 16:16
|
Знающий
![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif)
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725
![](style_images/1/spacer.gif)
|
Цитата(stas00n @ Jan 25 2018, 13:40) ![*](style_images/1/post_snapback.gif) Действительно, забыл подать клок на секцию PWR. Поэтому был режим не standby, а Sleep. Сейчас 3.1 мкА. Спасибо. Вернулся к теме, т.к. теперь сам тут вожусь с F051, загоняю его в STOP режим и получаю... Вот тут уже интересно. У меня два экземпляра платы, совершенно идентичные, однако одна жрет в STOP (если исключить другие чипы, которые в сумме едят 26мкА) где-то 125мкА, а другая 370мкА! Причем та самая внешняя периферия на обеих платах ест одинаково 26мкА, что я определил, усадив F051 экспериментально в полный Standby. - Тактирование PWR модуля включено. - Перед входом в STOP: + PWR->CR |= PWR_CR_LPDS; + SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; + USART выключается на всякий. + ADC выключается, а также запрещаются VREF и TEMP. + DAC не используется (он там есть вообще?). Кто хавает ток в темноте, не знаю... По ходу обнаружил интересную вещь: у меня используется только внутренний генератор, внешние ножки OSC не используются. Так вот, потребление процессора уменьшается ощутимо, если посадить вход OSC на землю. Правда, я еще не достиг таким образом желаемых 4мкА, но всем может быть полезно: заземляйте вход OSC, если не используется!
Сообщение отредактировал KnightIgor - Apr 27 2018, 16:36
|
|
|
|
|
Apr 27 2018, 20:19
|
![](https://electronix.ru/forum/uploads/av-17095.jpg)
Гуру
![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif)
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095
![](style_images/1/spacer.gif)
|
QUOTE (KnightIgor @ Apr 27 2018, 19:16) ![*](style_images/1/post_snapback.gif) Кто хавает Фу. Не в подворотне же. Из техописания на F030, раздел "I/O system current consumption" QUOTE Caution: Any floating input pin can also settle to an intermediate voltage level or switch inadvertently, as a result of external electromagnetic noise. To avoid current consumption related to floating pins, they must either be configured in analog mode, or forced internally to a definite digital value. This can be done either by using pull-up/down resistors or by configuring the pins in output mode. Не забывайте, что у кристалла есть выводы, которые не выведены на ноги корпуса. QUOTE (KnightIgor @ Apr 27 2018, 19:16) ![*](style_images/1/post_snapback.gif) По ходу обнаружил интересную вещь: у меня используется только внутренний генератор, внешние ножки OSC не используются. Так вот, потребление процессора уменьшается ощутимо, если посадить вход OSC на землю. Правда, я еще не достиг таким образом желаемых 4мкА, но всем может быть полезно: заземляйте вход OSC, если не используется! Из руководства пользователя F030, F070: QUOTE The PC13/PC14/PC15 GPIO functionality is lost when the core supply domain is powered off (when the device enters Standby mode). In this case, if their GPIO configuration is not bypassed by the RTC configuration, these pins are set in an analog input mode. For details about I/O control by the RTC, refer to Section21.4: RTC functional description on page485 А уже по ссылке написано, что в RTC есть специальные биты для задания режима этих ног в Standby.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 29 2018, 20:07
|
Знающий
![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif) ![*](style_images/1/pip.gif)
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725
![](style_images/1/spacer.gif)
|
Цитата(Сергей Борщ @ Apr 27 2018, 21:19) ![*](style_images/1/post_snapback.gif) Фу. Не в подворотне же. После дня борьбы с этими двумя платами с такими разными токами в STOP и безрезультатными попытками посадить процессоры на диету я просто явно себе представил, как эти два процессора, словно две гиены в темноте саванны, издеваются надо мной, совершенно внаглую обгладывают шину питания, срывая с нее электроны, утробно урча и злобно озираясь при этом. Мне удалось выразить мои ощучения одним словом. В любом случае, это лучше, чем "мочить в сортире" из Питерских подворотень. Касаемо замечания по RTC: моя цель - не standby, а STOP процессора F051K8 (LQFP32). RTC не используется вообще, PC13..PC15 в моем корпусе отсутствуют, но если PC13..PC15 уходят в analog input, то по цитате, "they must either be configured in analog mode" - это просто то, что нужно! Идея с имеющимися, но невыведенными ногами портов, весьма интересна. Попробую, хотя странно это. Предупреждая идеи, касаемые отдельного генератора для ADC: я его намеренно не использую, тактируя ADC в итоге от HSI, хотя генератор ADC тоже должен стоять в STOP. В итоге - пока не нащупал, где утекает.
|
|
|
|
Сообщений в этой теме
stas00n Грабли с энергосбережением STM32F0 Jan 25 2018, 09:44 KnightIgor Цитата(stas00n @ Jan 25 2018, 10:44) усып... Jan 25 2018, 11:13![|](style_images/1/to_down_pipe.gif) stas00n Цитата(KnightIgor @ Jan 25 2018, 13:13) П... Jan 25 2018, 11:45![|](style_images/1/to_down_pipe.gif) ![](style_images/1/spacer.gif) KnightIgor Цитата(stas00n @ Jan 25 2018, 12:45) При ... Jan 25 2018, 12:05![|](style_images/1/to_down_pipe.gif) ![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) ![|](style_images/1/to_down_pipe.gif) ![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) KnightIgor Цитата(aaarrr @ Apr 29 2018, 23:55) Прове... Apr 30 2018, 15:48![|](style_images/1/to_down_pipe.gif) ![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) KnightIgor Цитата(Сергей Борщ @ Apr 27 2018, 21:19) ... Sep 26 2018, 12:36 amiller А ток потребления измеряете до линейника 3V3 или п... May 1 2018, 05:16![](style_images/1/spacer.gif) k155la3 Цитата(amiller @ May 1 2018, 08:16) . . .... May 1 2018, 10:23![](style_images/1/spacer.gif) ![|](style_images/1/to_down_pipe.gif) amiller Цитата(k155la3 @ May 1 2018, 13:23) На ма... May 1 2018, 11:44![](style_images/1/spacer.gif) ![|](style_images/1/to_down_pipe.gif) ![](style_images/1/spacer.gif) k155la3 Цитата(amiller @ May 1 2018, 14:44) Может... May 1 2018, 11:51![](style_images/1/spacer.gif) KnightIgor Цитата(amiller @ May 1 2018, 06:16) А ток... May 3 2018, 10:37![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) KnightIgor Цитата(KnightIgor @ May 3 2018, 11:37) Ка... May 4 2018, 12:41![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) Baser Цитата(KnightIgor @ May 3 2018, 13:37) Ка... May 4 2018, 13:54![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) KnightIgor Цитата(Baser @ May 4 2018, 14:54) Это еще... May 7 2018, 18:40![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) zhevak Цитата(KnightIgor @ May 7 2018, 23:40) Гд... May 14 2018, 07:35![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) KnightIgor Цитата(zhevak @ May 14 2018, 08:35) 1. Не... May 15 2018, 07:35![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) zhevak Цитата(KnightIgor @ May 15 2018, 12:35) М... May 15 2018, 07:50![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) ![](style_images/1/spacer.gif) zhevak Коллеги! Двумя комментариями выше я привёл код... May 20 2018, 06:09
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|