Перейти к содержанию
    

STM32L082 в спячке ест больше, чем на всем скаку

Алгоритм примерно следующий:

  1. 5 секунд находимся в Stop, просыпаемся по будильнику RTC
  2. разгоняем тактовую до максимально возможных 32 МГц через PLL от HCI
  3. Заряжаем I2C на опрос датчика. I2C работает с ПДП (DMA) по прерываниям, после отработки транзакции выставляется флаг.
  4. В основном цикле в цикле ожидаем выставления флага. Цикл состоит из проверки флага, WFI, проверки таймера таймаута.
  5. делаем немного вычислений
  6. повторяем п.3-5 для второго датчика
  7. переходим к п.1

код цикла ожидания:

    while(!Non_empty)
    {
        ON(TEST2);
        __WFI();
        OFF(TEST2);

        if(TIM6->SR & TIM_SR_UIF)
            // no need to stop timer because of one-pulse mode
            return false;
    }
    TIM6->CR1 = 0;
    return true;

диаграмма работы п.3-6:

image.thumb.png.909239f92d4207aaa3290da3d13d52ec.png

Каналы 0,1 - работа по I2C, канал 2 в высоком уровне во время отработки обработчика прерывания I2C, канал 3 в высоком уровне во время выполнения WFI (выход TEST2). Как видно, вся работа занимает 1.22 мс каждые 5 секунд, причем примерно 1.07 мс из этого времени ядро спит (Sleep mode). Усредненное потребление платы 28 мкА (плата питается через микроамперметр, на входе платы стоит большой конденсатор, стрелка колеблется 27-28 мкА).

 

Чудо происходит, если закомментировать __WFI - усредненное потребление падает до 11 мкА. Ядро при этом молотит - сигнал на выходе TEST2 исправно скачет 0-1-0-1. Errat-у перечитал, там ничего подобного не описано. Отладчик отключен. Что я мог еще не учесть?

Пункты 1-2 выполняются средствами куба (тяжелое наследство), но вроде бы влиять не должны.

Увеличивал паузу в п.1 до 10 сек - без WFI среднее потребление падает до 7 мкА, с WFI - до 22 мкА.

 

P.S. вообще-то сначала п.3-6 тоже выполнялись кубовым кодом, без ПДП, прерываний и WFI, но после того, как куб забыл в какой-то момент вычитать регистр приема, выдал ошибку превышения timeout и все данные пошли сдвинутые на один байт, было решено заменить весь кубовый I2C на свой. Заодно ожидалось уменьшение потребления за счет использования WFI, но потребление неожиданно возросло. День поиска вывел на инструкцию WFI. Еще один потраченный день не принес решения. Прошу помощи коллективного разума.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, Сергей Борщ said:

разума.

Только без обид - ноги на выход в спячке сконфигурировать все не забыл?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, DASM сказал:

Только без обид - ноги на выход в спячке сконфигурировать все не забыл?

Это влияет на отработку WFI? Нет, ноги согласно рекомендациям того же ST пока что настроены в режим аналогового входа и это цель дальнейших исследований. И вроде как в глубоком сне (Stop) с потреблением все хорошо. Проблемы с неглубокими (Sleep) кратковременными засыпаниями ядра 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, Сергей Борщ said:

Это влияет на отработку WFI? Нет, ноги согласно рекомендациям того же ST пока что настроены в режим аналогового входа и это цель дальнейших исследований. И вроде как в глубоком сне (Stop) с потреблением все хорошо. Проблемы с неглубокими (Sleep) кратковременными засыпаниями ядра 

Это влияет на пожиралово тока в спячке, когда висячие ногие в третьем состоянии. И там то ли шмитты входные срабатывают периодически, то ли что еще..  Если руку например к плате поднести и потребление еще больше возрастет  - то однозначно в этом дело, очень характерный симптом

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 minutes ago, DASM said:

Это влияет на пожиралово тока в спячке

А не в спячке вдруг не влияет? :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, aaarrr said:

А не в спячке вдруг не влияет? :)

не в спячке не шибко заметно )) кушает себе 2А, вентилятор крутится, тишь да благодать..

И кстати я тоже Idle в М0 не победил, удовлетворился просто deep sleep. Там отличий в моем проце было только хранение всей ОЗУ или только части регистров, оказалось проще обойтись меньшим злом. (большее - долгие переговоры с китайцами, их процик)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32 минуты назад, DASM сказал:

Если руку например к плате поднести и потребление еще больше возрастет  - то однозначно в этом дело, очень характерный симптом

Не, на руку не реагирует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 minutes ago, DASM said:

не в спячке не шибко заметно )) кушает себе 2А, вентилятор крутится, тишь да благодать..

Так тут он без спячки жрет меньше, чем с ней.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, aaarrr said:

Так тут он без спячки жрет меньше, чем с ней.

а, не шибко внимательно прочел. Ну на всякий не мешает ноги проверить все равно. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Режим Stop? Бит SLEEPDEEP в регистрах CPU установлен?

Хотя, вроде как, при Stop невозможно выходить из спячки по событиям RTC.

Или Sleep? Как-то в кучу всего накидали, а это разные режимы...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 часов назад, Arlleex сказал:

Режим Stop? Бит SLEEPDEEP в регистрах CPU установлен?

Хотя, вроде как, при Stop невозможно выходить из спячки по событиям RTC.

5 секунд в режиме stop, sleepdeep установлен, выход из stop возможен по EXTI и по событиям RTC, который заведен на EXTI. В этом режиме с потреблением все красиво.

Далее просыпаемся и работаем с I2C, во время ожидания прерываний от I2C переходим в sleep, sleepdeep сброшен. И вот в это время потребление больше, чем когда вместо перехода в sleep тупо в цикле опрашиваем переменную.

12 часов назад, Arlleex сказал:

Как-то в кучу всего накидали, а это разные режимы...

Старался описать максимально подробно, чтобы было больше информации к размышлению. Может вы невнимательно прочитали?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 hours ago, Сергей Борщ said:

без WFI среднее потребление падает до 7 мкА, с WFI - до 22 мкА

Это потребление только MCU или всей схемы с датчиками?


Без WFI и пин TEST2 не дергается? Там случайно нет каких подтяжек которые могут чтото потреблять?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...