Jump to content
Sign in to follow this  
COKPOWEHEU

минимизация потребления stm32l151rct6

Recommended Posts

Захотелось сделать устройство с минимальным потреблением. Первоначально хотел попробовать на f103, но глянул в даташит и ужаснулся: в любом режиме сна у него потребление больше, чем у AVR-ок. Ну хорошо, в standby сравнимо, но этот режим мне не подходит. Поискал аналоги, вроде бы серия L1 больше подходит для автономных устройств. Да еще там есть вкусности вроде сенсорных кнопок и управления ЖКИ (не то чтобы необходимо, но поиграться стоит).

Собрал макетную плату с высокочастотным (8 МГц) и низкочастотным (32768) кварцами, стабилизатором, кнопками и светодиодами (из кода понятно что где висит). Запускаю RTC с пробуждением раз в секунду (в финальном устройстве просыпаться будет еще чаще) и пытаюсь увести в режим stop. Но вместо потребления в единицы микроампер получаю пол-миллиампера. Либо я какую-то периферию не отключил (да я их и не включал вроде...), либо как-то неправильно увожу в сон (вроде все по даташиту...), либо лыжи не едут.

Вот ключевые моменты кода (остальное во вложении):

void enable_btn(){
  RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
  GPIO_config(JBTN); //настройка на вход с минимальной скоростью, без подтяжке
}

void disable_all(){
  GPIOA->MODER = 0xFFFFFFFF; //all to analog in
  GPIOB->MODER = 0xFFFFFFFF; //all to analog in
  GPIOC->MODER = 0xFFFFFFFF; //all to analog in
  GPIOD->MODER = 0xFFFFFFFF; //all to analog in
  
  GPIOA->OSPEEDR = 0; //all to low speed (наверное, неважно)
  GPIOB->OSPEEDR = 0; //all to low speed (наверное, неважно)
  GPIOC->OSPEEDR = 0; //all to low speed (наверное, неважно)
  GPIOD->OSPEEDR = 0; //all to low speed (наверное, неважно)
  
  GPIOA->OTYPER &=~ 0x0000FFFF;
  GPIOB->OTYPER &=~ 0x0000FFFF;
  GPIOC->OTYPER &=~ 0x0000FFFF;
  GPIOD->OTYPER &=~ 0x0000FFFF;
  
  RCC->AHBENR &=~ (RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN | RCC_AHBENR_GPIODEN);
  clock_MS();
}

void go_sleep(){
  RCC->APB1ENR |= RCC_APB1ENR_PWREN;//вкл тактирование PWR
  SCB->SCR |= SCB_SCR_SLEEPDEEP; //для M3 разрешаем sleepdeep
  PWR->CR &=~PWR_CR_PDDS;//выбираем режим Power Down Deepsleep
  PWR->CR &=~PWR_CR_CWUF ; //очищаем wakeup flag
  PWR->CR |= PWR_CR_LPSDSR; //уменьшаем voltage regulator
  __WFI();
}
...
//когда нужно заснуть
disable_all();
go_sleep();
enable_btn();

Пробовал совсем не переключаться с MSI на HSE, это влияет только на рабочий режим, во сне как было 500 мкА так и остается.

L1_sleep.rar

Share this post


Link to post
Share on other sites
21 минуту назад, COKPOWEHEU сказал:

стабилизатором

Это стабилизатор жрёт 500мкА.

Share this post


Link to post
Share on other sites
56 минут назад, Yurkin2015 сказал:

Это стабилизатор жрёт 500мкА.

Если бы все было так просто. Ток-то я меряю после него

Share this post


Link to post
Share on other sites

Вебинар STM32G0 – новый лидер бюджетных 32-битных микроконтроллеров от STMicroelectronics

Компания Компэл приглашает вас 25 сентября принять участие в вебинаре, который посвящен новому семейству микроконтроллеров STM32G0. Вебинар рассчитан на технических специалистов и тех, кто хорошо знаком с семейством STM32. На вебинаре будут освоены современные методы тестирования производительности микроконтроллеров на примере самых бюджетных 32-битных семейств общего назначения STM32G0 и STM32F0 и проведено их подробное сравнение.

Подробнее

Код я привел. Все выводы настраиваются как аналоговые входы, даже те, что под JTAG используются. Внешней обвязки тоже нет, максимум проводки сантиметров по 5 от силы.

Share this post


Link to post
Share on other sites
                     

Литиевые батарейки Fanso в беспроводных датчиках пожарно-охранной сигнализации

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

Подробнее...

F-ки никак не подходят для малопотребляющих устройств. В сторону L-ек мысль была совершенно правильная

Share this post


Link to post
Share on other sites

Читал и раньше.

Попробовал еще несколько комбинаций:

- переключение выводов в Digital input + pull-up вместо analog input: потребление растет

- запуск часов от LSI вместо LSE: потребление практически не меняется. Возможно, только на фоне общего потребления в пол-миллиампера, а в абсолютных величинах будет заметнее.

- бит PWR_CR_ULP (внутренняя опора для аналоговых блоков?) : потребление немного снижается.

Последняя надежда что недостаточно очистил плату и идут утечки по налипшей гадости. Я ее, конечно, отмывал в спирте, но мало ли. Попробую еще в керосине, ацетоне и прочих растворителях.

Кстати, кто-нибудь знает чем можно удалить остатки цианакрилата? В инете пишут что ацетоном, диметилсульфоксидом и теплой водой (wtf?). Пока лучше тонких проволочек и бритвенного лезвия лучшего способа не нашел.

Share this post


Link to post
Share on other sites
Guest Trespasser

Какие ресурсы и сколько нужны в проекте? Какая периферия будет в обвязке? Бюджет платы?

Потому как помимо устаревшей STM32L152 у того же STM есть и другие LP серии, включая STM32L0 и STM8L0, а есть еще и TI со своей MSP430.

На STM8 делал проект газового счётчика, на измерении вихрей Кармана, со средним потреблением 8мкА, по 3.3В. И это с измерительным обвесом и LCD индикатором.

 

Share this post


Link to post
Share on other sites

Никаких чудес. В основном цель - потыкать режим сна в ARMах длинной палочкой. 5 мкА потребления бы вполне устроили. Внешняя периферия это отдельный вопрос, ее стоит рассматривать индивидуально.

Пока что удалось выжать 20-30 мкА, но это просыпаясь каждые 100 мс. В принципе, уже неплохо, хотя могло бы быть лучше. Оказалось, косяк в цикле main. Сейчас под рукой нет рабочего варианта чтобы выложить. Да вроде никому он тут и не нужен кроме меня.

В 11.05.2019 в 23:27, COKPOWEHEU сказал:

Кстати, кто-нибудь знает чем можно удалить остатки цианакрилата? В инете пишут что ацетоном

не врут! Ацетон полностью удалил следы клея, да еще и кнопку в придачу. Справедливости ради, все остальные компоненты уцелели, даже пластиковые разделители для гребенок.

Share this post


Link to post
Share on other sites

Ацетон это жёстко. Тогда уж и толуол можно было опробовать. Читал, что раствор димексида (есть в аптеках и в его составе диметилсульфоксид ) размягчает почти все цианакрилаты.

 

Share this post


Link to post
Share on other sites

димексид тоже пробовал, не так впечатлил. Даже нашел "удалитель клея", но уж больно густой оказался, для удаления клея из-под микросхемы бесполезно. А что "жестко"? Оно сработало, разве что кнопка пострадала, но не жалко. Не так много на плате нежных компонентов, которым ацетон повредит.

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Similar Content

    • By n_angelo
      Привет. Хочу узнать ваше мнение. Я новичок в embedded. Можно сказать, что пришел с веба. Малость Python, JS, C. Меня, конечно, предупреждали начать с AVR, но я уверенный в себе решил сразу залезть на STM32. Вынашивая идею для проекта, параллельно курив Reference Manual и Data Sheet по STM32, я понял что его будет слишком жирно для проекта. Я перескочил на STM8L. И тут меня начал огорчать мир embedded. При переходе между stm8 и stm32 нужно менять IDE (TrueStudio на STVD). Во избежание таких курьёзов я пересаживаюсь на IAR. В процессе подключения родной библиотеки от ST, понимаю что библиотека от IAR для того же самого STM8L152C6T6 дико отличается (макросы, структуры). Привет веб-разработка. Как такое могло произойти, что под один и тот же контроллер ST даёт одну библиотеку, а IAR другую. И нигде в уроках тебя не предупредят об этом. Ну, ребят, у меня всего одна жизнь. Вы уже договоритесь там между собой? Придите к единому стандарту. Или они так решили новичков завендерлочить? Моё мнение (не претендует на правильное): пробираясь сквозь тернии популярной архитектуры ARM, инфраструктуры, инструментария, забываешь про бизнес-логику устройств. А еще просто пропасть между "я ничего не понимаю" и "господи, я зажег светодиод". Речь не о копипастерах с уроков, а действительно понимая что ты делаешь, в каком регистре, что меняешь. Это путь в 2000 (а то и больше) страниц на английском перечитанных по несколько раз, чтобы отоложилось. И в конце тебя ждут разные версии одной и той же библиотки в разных IDE. И сидишь вдупляешь... ну почему... я же в правильный регистр кладу правильную маску... ох, наболело. Такое ощущение что не для людей это всё делали, не для людей.
      Ваше мнение?
    • By Sofia Vin
      Предлагаем проектную работу в Москве:
      Микроконтроллер STM32F103.
        
      Есть встроенный код с использованием функций библиотеки FreeRTOS, код имеет описанный протокол для связи с внешним миром.
        
      Необходимо проводить доработку кода под задачи программиста верхнего уровня и его тестирование в составе оборудования. 
      Работа в лаборатории (м.Университет) и удаленно. 
      Оплата по договоренности.
      Если Вы обладаете опытом схемотехнического проектирования и программирования микроконтроллеров, и Вас заинтересовала данная возможность, ждем Ваши отклики по контактным данным:
      8 (925) 023-60-02   Алексей
      E-mail: nassa@marathon.ru
       
    • By KVAnton
      Всем привет, начал недавно STM32 осваивать (до этого были pic12-18/arduino/raspberry) и столкнулся с интересной проблемой:
      Настроил GPIO как Input Pull-Up но при считывании получаю 0.
      Условия:
      Несколько других также настроенных портов (Input Pull-Up) при этом посажены на землю (на один порт Output Open-Drain), а непосредственно перед считыванием переключаю другой порт Output Open-Drain Pull-Up с 1 на 0.
      При этом, если поставить задержку (пробовал 1мс) после переключения OutPut и считыванием Input получаю - 1, как и должно быть. Порты по схеме ни как не связанны - пробовал вообще отключать input порт от схемы (матрица кнопок) ситуация не меняется.
      Работаю с китайской платой на stm32f103c8t6 (ардуино подобная) и библиотекой LL. Скорость порта пробовал разную - результат один.
      Сможет кто-то объяснить или хотя бы намекнуть (куда копать, что почитать) почему такой эффект возможен?
      Во всяких даташитах/аппликейшн ноте вроде ни чего интересного, зацепила только аббревиатура  SSO ( simultaneous switching output) в разделе Adapt GPIO speed (в AN на GPIO) - но понять глубину этой фразы и контекста с ходу не получилось (возможно из-за непонимания каких-то базовых моментов)
      Хотя и проблема в принципе решена (задержка допустима) - но хотелось бы разобраться в причинах.
      Буду благодарен любым вариантам, может что-то натолкнет на правильные мысли.
    • By Falconist
      Вместо вышедшей из строя проводной мыши поставил беспроводную мышь "Rapoo-1620" и получил на ровном месте проблему: при нажатии на клавиатуре Genius KB-06SE (фото в Интернете найти не смог - старенькая уже, но я к ней приспособился) кнопки "Sleep" (с полумесяцем на ней) компьютер пытается выключиться, но через примерно минуту снова загружается. С проводной мышью такого не было.

      Взял беспроводную мышку у жены - то же самое. Взял у неё клавиатуру (но тоже с кнопкой "Sleep" ) - всё равно перезагружается. Получается, что USB приемник беспроводным мышек всё время обменивается информацией с компьютером, даже в спящем режиме и "будит" его. 

      В принципе, эту проблему как-то обхожу, вынимая приемник из USB разъема перед "усыплением", но гнездо-то разбалтывается да и неудобно - бывает, надо срочно "усыпить" аппарат.

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

      Если простого решения не найдется - фиг с ним, буду действовать, как уже приспособился (вынимать приемник). Но, а вдруг есть таковое?
    • By katet
      Добрый день. Может быть,кто-нибудь уже сталкивался с таким. 
      Занимаюсь доработкой чужого проекта в среде STM32CubeMX, первый раз работаю с библиотекой HAL.
      В этом проекте осуществлялся прием байт по USART1 из ComMon. Проект был открыт в STM32CubeMX, где мной дополнительно были активированы новые модули - RTC, SD, USART2. Настройки USART1 не менялись. 
      Часы реального времени RTC: питание от батарейки, тактирование – от LSE. 
      При приеме байт по USART1 в новом проекте (активны  USART1, RTC, SD, USART2) было выявлено, что после приема 2 байт по USART1 перестает инкрементироваться значение переменной uwTick, отвечающей за прерывания Systick, в результате чего дальнейшая отладка невозможна. Не удается выяснить, в каком месте и почему перестает увеличиваться значение uwTick. При работе со старым проектом (где активен только USART1) uwTick инкрементируется после приема 2 байт.
      Смены приоритета прерываний не происходит, в  функцию HAL_Delay() отладчик не попадает. При вызове функции HAL_ResumeTick(), возобновляющей прерывания Systick, ничего не меняется, значение uwTick остается неизменным.
      Остановка прерываний была обнаружена при попадании в функцию:
      static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout)
      {
        /* Wait until flag is set */
        while((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status) 
        {
          /* Check for the Timeout */
          if(Timeout != HAL_MAX_DELAY)
          {            
            if((Timeout == 0U)||((HAL_GetTick() - Tickstart ) > Timeout))
            {
              /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */
              CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE));
              CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
              
              huart->gState  = HAL_UART_STATE_READY;
              huart->RxState = HAL_UART_STATE_READY;
              
              /* Process Unlocked */
              __HAL_UNLOCK(huart);
              
              return HAL_TIMEOUT;
            }
          }
        }
        
        return HAL_OK;
      }
      В новом проекте текущее значение uwTick, возвращаемое функцией HAL_GetTick(), всегда равно значению Tickstart. В старом проекте сначала также, но затем uwTick начинает увеличиваться. Выяснить, в каком именно месте кода значение uwTick должно начать увеличиваться, не удается.
      Может быть, у кого-нибудь есть хоть какие-то идеи, с чем может быть связана остановка увеличения значений uwTick, помогите пожалуйста)
      Распиновка и конфигурация обоих проектов: верхняя часть рисунков - первоначальный, работающий вариант,  нижняя - сбой прерываний Systick.


×
×
  • Create New...