Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
COKPOWEHEU
1340 / 970 / 222
Регистрация: 09.09.2017
Сообщений: 4,040
1

Режим сна stm32l151

15.05.2019, 17:53. Просмотров 316. Ответов 20

Хочу сделать устройство с максимально экономичным режимом сна. Исходя из даташитов понял, что "стандартный" stm32f103 не подойдет, поэтому взял STM32L151RCT6, у которого заявлено потребление порядка микроампера. Логично предположив, что для контроллера, с которым никогда не работал, хорошо бы сделать отладочную плату, развел и распаял платку. Питание подается с USB через стабилизатор 78L33 и джампер PWR. Для измерения тока включаю амперметр вместо джампера (после стабилизатора!). Естественно, во время измерений к плате ничего другого не подключено, даже программатор вынимаю.
И все равно потребление около 500 мкА.
Уже даже грешил что недоотмыл что-то с платы, промыл в ацетоне так что смылась даже одна из кнопок (вторая выжила - похоже, в ней пластик получше), но это ни на что не повлияло. В порядке "да через что тут еще может быть утечка?!" выпаивал конденсатор - тоже не помогло (кто бы мог подумать...).
Используется RTC, причем источник тактирования (LSE / LSI) на потребление не влияет.
Вот код ухода в сон:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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();
}
Пробовал дополнительно включать бит PWR_CR_ULP, это чуть-чуть снижает потребление, но почти незаметно.
.
Собственно, вопрос: что я делаю не так и как сделать правильно?
0
Миниатюры
Режим сна stm32l151   Режим сна stm32l151   Режим сна stm32l151  

Вложения
Тип файла: rar L1_sleep.rar (116.3 Кб, 1 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2019, 17:53
Ответы с готовыми решениями:

PIC24FJ64. Режим сна
а подскажите как отправить pic24 в сон по изменению уровня сигнала CN а потом по его изменению...

Любимый usb 3 :) Режим сна
Доделываю вроде уже проект, последние штрихи остались.Проект - клавиатура обычная . Короче не...

USB в STM32L151
Приветствую всех кодеров. У меня вопрос к вам, кто возился с USB CDC драйвером. Мастырю девайс,...

STM32L151+SPI1
Столкнулся с проблемой работы stm32l1 +mcp3201 Инициализация #define SPI_MCP3201_CS1_LOW() ...

STM32L151 + SDIO + DMA
Имеется девайс на STM32T151RD и SD карта. Посколько у этого процессора есть SDIO, решил подключить...

20
_SayHello
671 / 391 / 125
Регистрация: 30.07.2015
Сообщений: 1,365
15.05.2019, 21:35 2
COKPOWEHEU, А тактируется в режиме сна чем? У него вроде при питании 3.3 Вольта а режиме сна потребление 100 мкА / МГц.
0
_SayHello
671 / 391 / 125
Регистрация: 30.07.2015
Сообщений: 1,365
15.05.2019, 21:44 3
Режим сна stm32l151
0
COKPOWEHEU
1340 / 970 / 222
Регистрация: 09.09.2017
Сообщений: 4,040
15.05.2019, 22:17  [ТС] 4
_SayHello, в режиме STOP тактирование должно вообще останавливаться, а потом запускаться с MSI.
0
15.05.2019, 22:17
_SayHello
671 / 391 / 125
Регистрация: 30.07.2015
Сообщений: 1,365
15.05.2019, 22:30 5
COKPOWEHEU, запутался с режимами. Вы пишите
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вот код ухода в сон:
Потом
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
в режиме STOP тактирование должно вообще останавливаться
При этом
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
очу сделать устройство с максимально экономичным
Самый экономичный вроде STANDBY режим.
Утвердите режим все таки в который хотите попасть
В сниппетах у STM есть примеры где во все режимы вгоняют контроллер. Там правда SPL, но из него несложно переделать в CMSIS
SPL + примеры для L1 серии
0
COKPOWEHEU
1340 / 970 / 222
Регистрация: 09.09.2017
Сообщений: 4,040
15.05.2019, 23:16  [ТС] 6
Возможно, я напутал с терминологией, sleep, standby и stop - различные режимы сна.
sleep оставляет часть периферии работать, но не особо снижает потребление. Не лучший вариант под мою задачу.
stop останавливает всю периферию (кроме RTC) и очень экономичный. Пока что выглядит лучшим.
standby даже не столько сон, сколько обесточивание, даже оперативка не сохраняется (хотя BKP и RTC все же сохраняются), по потреблению чуть лучше stop. Но геморроиться с сохранением-восстановлением бэкап регистров ну очень не хочется.
Так что STOP.
Цитата Сообщение от _SayHello Посмотреть сообщение
SPL + примеры для L1 серии
Предлагает залогиниться. Без крайней необходимости делать этого не хотелось бы.
0
_SayHello
671 / 391 / 125
Регистрация: 30.07.2015
Сообщений: 1,365
15.05.2019, 23:39 7
COKPOWEHEU,
Project\...Examples\PWR\CurrentConsumption
0
Вложения
Тип файла: zip en.stsw-stm32077.zip (18.28 Мб, 3 просмотров)
ValeryS
Модератор
7719 / 5731 / 742
Регистрация: 14.02.2011
Сообщений: 19,620
Завершенные тесты: 1
16.05.2019, 00:45 8
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Предлагает залогиниться.
да такая у ST политика
без регистрации ничего не даст скачать, даже даташиты
0
cerera_a1
0 / 0 / 0
Регистрация: 17.09.2018
Сообщений: 6
16.05.2019, 11:02 9
Стабилизатор тоже потребляет ток. Попробуйте без него. Только сделайте питание не от USB(5v).
0
COKPOWEHEU
1340 / 970 / 222
Регистрация: 09.09.2017
Сообщений: 4,040
16.05.2019, 21:45  [ТС] 10
_SayHello, спасибо, посмотрю. Именно сейчас навалили работы, так что не знаю когда доберусь до контроллера.
ValeryS, как раз с даташитами и прочими мануалами проблем нет. Возможно, только с теми, которые я искал, возможно ST-шники их не заметили или забыли испортить, кто знает.
cerera_a1, да пускай потребляет сколько хочет, я же меряю после него.
0
Voland_
1656 / 1045 / 98
Регистрация: 04.01.2010
Сообщений: 3,551
19.05.2019, 10:37 11
1) Для глубокого сна используется Low-Freq внутренний клок, у вас на плате два внешних кварца, и я подозреваю - вы их используете. Перед входом в сон их оба надо по-отключать. Собственно, вы осциллом можете посмотреть - есть ли на них генерация во сне.

2) Для сна нужно предварительно настроить состояния ног. По-моему, это в L-серии у ST (могу путать с NRF24) есть регистры управления ног во сне - на предмет подтяжек, предмет состояний и т.д. - для глубокого сна надо все это поотключать, оставив лишь необходимое. Имейте ввиду - учитывая половину питания 1.8В - могут жрать даже ваши светодиоды...

3) Естесно, что если контроллер не использует самый глубокий сон - существенной экономии (ожидаемые 1мкА) достичь не удастся.

Добавлено через 1 минуту
PS: иногда ноги МК не получается настроить на "полную отключку" (как, например, в CC25xx сериях от TI). И да, тогда МК может жрать банально от "соседних" подключений, через эти ноги. В итоге потребление действительно увеличивается до огроменных 2-3мкА во сне.

Добавлено через 21 минуту
...посмотрел Manual и datasheet: насчет пинов ошибся, но везде написано, что LP-mode ориентируется только "при условии всей выключенной периферии"... В Halt-mode удастся выжать 400nA (стр.88 ДШ), что вполне реально. С внешним клоком в Active Halt mode удастся выжать порядка ~1мкА (стр.87 ДШ), но тогда это не WFI, а таки Halt режим... В WFI (стр.83) на внешнем LSE кварце удастся получить ~2.5мкА, что не очень ложится под вашу цель.

Добавлено через 3 минуты
по поводу вашего случая в 500мкА - тут либо вы не "усыпляете" МК совсем (посмотрите четко сиквенс входа в режим - там есть оговорки), либо проверьте у себя на плате конденсаторы. Ваши электролиты вполне себе могут иметь такую утечку, в сотни мкА.
0
COKPOWEHEU
1340 / 970 / 222
Регистрация: 09.09.2017
Сообщений: 4,040
19.05.2019, 15:26  [ТС] 12
1. Да, стоят два кварца, HSE (8 МГц, который отключается программно функцией clock_MS(), а потом аппаратно при входе в сон, пробовал не включать его вообще - разницы, как и следовало ожидать, нет) и LSE (32 кГц). Отключать LSE нельзя, иначе часы будут убегать, да и их работа заточена именно под часовой кварц и потребление ~1 мкА. Иначе зачем вообще ставить часовой кварц.
2. см. код. Все переключается в состояние аналогового входа, даже кнопки и JTAG.
3. Предполагается использование режима STOP, в нем по даташиту, потребление порядка 1 мкА (0.8 - 3 мкА, где-то так). Возможно, алгоритм входа в этот режим у меня реализован неправильно, но я его брал из даташита и статей в инете. Где взять другой не знаю.
Цитата Сообщение от Voland_ Посмотреть сообщение
В WFI (стр.83) на внешнем LSE кварце удастся получить ~2.5мкА, что не очень ложится под вашу цель.
Не устраивают 500 мкА, которые наблюдаю сейчас. А 2,5 мкА вполне приемлемо.
Цитата Сообщение от Voland_ Посмотреть сообщение
Ваши электролиты вполне себе могут иметь такую утечку, в сотни мкА.
500 мкА при 3 В это около 6 кОм сопротивления. Не маловато для конденсаторов? Впрочем, проверить не помешает.

Добавлено через 1 час 37 минут
UPD: выпаял вообще все конденсаторы, даже керамику, разницы не видно. Конечно, есть шанс, что там 1-10 мкА утечка, но на фоне потребления остальной платы это не отловить.
0
Voland_
1656 / 1045 / 98
Регистрация: 04.01.2010
Сообщений: 3,551
19.05.2019, 16:51 13
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
UPD: выпаял вообще все конденсаторы
воот.. ну тогда остается понять, вообще происходит ли переход в спящий/ждущий режим МК. Вы можете дать номер страницы ДШ, где описан режим "STOP", о котором вы говорите?
0
COKPOWEHEU
1340 / 970 / 222
Регистрация: 09.09.2017
Сообщений: 4,040
19.05.2019, 18:23  [ТС] 14
Цитата Сообщение от Voland_ Посмотреть сообщение
UPD: выпаял вообще все конденсаторы
воот..
что "воот.."? Эта операция и не должна была ни на что повлиять. То есть никакой новой информации мы не получили.
Цитата Сообщение от Voland_ Посмотреть сообщение
воот.. ну тогда остается понять, вообще происходит ли переход в спящий/ждущий режим МК.
Какой-то переход происходит точно, потребление в рабочем режиме все-таки около 1,5 мА (на MSI, а если включать на HSE то за 10 мА уходит) и диод мигает (без диода около 1 мА). Описано примерно с 109 страницы.
0
COKPOWEHEU
1340 / 970 / 222
Регистрация: 09.09.2017
Сообщений: 4,040
19.05.2019, 22:52  [ТС] 15
Цитата Сообщение от _SayHello Посмотреть сообщение
COKPOWEHEU,
Project\...Examples\PWR\CurrentConsumption
Посмотрел, не помогло. Алгоритм сна там тот же самый.
Но результат все же есть.
Попробовал уводить контроллер в обесточивание (Standby), потребление снижается до ~1 мкА (точнее мои амперметры не позволяют). Значит, утечками по плате 100% можно пренебречь.
Если убрать пробуждение каждую секунду по таймеру, потребление также снижается. Конечно, такой режим бесполезен, поскольку контроллер не может сам проснуться, но ради теста почему бы нет.
В общем, пошаманил я с кодом. Основная проблема была в рабочем цикле. Там я включал-отключал прерывания. Когда переместил это поближе к переключению режима сна, потребление резко упало. Еще, конечно, добавил пару битов настроек периферии, но это существенно не влияло.
Первоначальная версия:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
while(1){
    if(run_mode){
      GPO_T(RLED);
      sleep(20000);
    }else{
      disable_all();
      go_sleep();
      enable_btn();
    }
 
    if(GPI_ON(LBTN)){
      while(GPI_ON(LBTN)){}
      run_mode = !run_mode;
      if(run_mode){
        enable_all();
        __enable_irq();
      }else{
        __disable_irq();
      }
    }
    
  }
Вторая версия:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
while(1){
    if(run_mode){
      GPO_T(RLED);
      sleep(20000);
    }else{
      //disable_all();
      disable_btn();
      __disable_irq();
      go_sleep();
      __enable_irq();
      enable_btn();
    }
 
    if(GPI_ON(LBTN)){
      while(GPI_ON(LBTN)){}
      run_mode = !run_mode;
      if(run_mode){
        enable_all();
      }else{
        disable_all();
      }
    }
    
  }
Теперь потребление составляет аж 23 мкА, что меня весьма радует. Для ориентира: от батарейки 18650 на 1000 мАч оно могло бы работать 5 лет, от ионистора 1 Ф - сутки. Не считая саморазряда, разумеется.
Переключение часов между LSE и LSI на потребление не влияет (возможно, опять же на фоне остального). Переключение между MSI и HSE влияет если делать каждые 100 мс, но не влияет если делать по уму (кто бы мог подумать...).
Конечно, хотелось бы еще снизить. Как-то же standby'ю удается. С другой стороны, я каждые 100 мс просыпаюсь чтобы проверить кнопку и совершаю кучу других обнулений нулевых нулей. Возможно, дальше снизить и не получится.
Еще заметил, что после прошивки по JTAG/SWD переключение в режим сна как-то не до конца проходит, остается больше 100 мкА потребления (сам шлейф отключаю, естественно). Вот если сбросить по питанию, работает нормально.
На всякий случай выложил последнюю версию кода.
Может, кто-то натолкнет на мысль, что еще можно отключить чтобы совсем снизить потребление?
0
Вложения
Тип файла: rar L1_sleep.rar (115.1 Кб, 1 просмотров)
_SayHello
671 / 391 / 125
Регистрация: 30.07.2015
Сообщений: 1,365
20.05.2019, 09:14 16
COKPOWEHEU,
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Может, кто-то натолкнет на мысль, что еще можно отключить чтобы совсем снизить потребление?
уменьшай частоту тактирования. Можно сделать просыпание по внешнему прерыванию от кнопки, чтобы не просыпаться периодически
0
COKPOWEHEU
1340 / 970 / 222
Регистрация: 09.09.2017
Сообщений: 4,040
20.05.2019, 12:51  [ТС] 17
Частоту тактирования чего?
RTC на потребление не влияет, я это уже писал.
частота контроллера в рабочем режиме тоже. Для проверки кнопки я не переключаюсь с MSI, а потребление в рабочем режиме на HSE это совсем другой случай, который сейчас не интересен.
Цитата Сообщение от _SayHello Посмотреть сообщение
Можно сделать просыпание по внешнему прерыванию от кнопки, чтобы не просыпаться периодически
Пробовал вообще не включать кнопку. Только проснулся раз в 100 - 2000 мкс, выполнил десяток инструкций - заснул обратно. На потребление не влияет. Изменение интервала, как ни странно, тоже.
Сейчас речь не идет о какой-то совсем конкретной задаче. Скорее, сморю разные варианты. Вариант, который получился сейчас, уже вполне неплох, хотя должен быть куда лучше.
0
_SayHello
671 / 391 / 125
Регистрация: 30.07.2015
Сообщений: 1,365
20.05.2019, 13:09 18
COKPOWEHEU,Я про тактирование в рабочем режиме. По апноутам ST зависимость потребления от частоты и источника тактирования в режиме бодрствования, достаточно сильная.

STшная приблуда расчитывает потребление почти 74 мкА, если каждые 100 мс просыпаться и что то делать 5 мс с частотое HSE 8 МГц.
Режим сна stm32l151


И уже 11 мкА если 5 мс работать от HSE на 1 MГц
Режим сна stm32l151
0
_SayHello
671 / 391 / 125
Регистрация: 30.07.2015
Сообщений: 1,365
20.05.2019, 13:11 19
Так что у вас где то недалеко от истины потребление
0
COKPOWEHEU
1340 / 970 / 222
Регистрация: 09.09.2017
Сообщений: 4,040
20.05.2019, 15:48  [ТС] 20
Цитата Сообщение от _SayHello Посмотреть сообщение
Я про тактирование в рабочем режиме.
Для определенности. "Рабочий режим" это этакий активный сон, когда контроллер вроде как спит, но время от времени просыпается, что-то быстренько делает и снова засыпает. А не режим постоянного бодрствования или low-power run, которые в данной теме вообще рассматривать не стоит.
Цитата Сообщение от _SayHello Посмотреть сообщение
И уже 11 мкА если 5 мс работать от HSE на 1 MГц
У меня тактирование от MSI на частоте 2 МГц, если я правильно понял даташит. Но это опять же для определенности.
Цитата Сообщение от _SayHello Посмотреть сообщение
STшная приблуда расчитывает потребление почти 74 мкА, если каждые 100 мс просыпаться и что то делать 5 мс с частотое HSE 8 МГц.
Меня смущает что почти нет зависимости от интервала пробуждения. В моем коде он задается на старте функцией auto_wakeup(), которая настраивает wakeup timer, который тикает с частотой в половину тактовой RTC. Если мне не изменяют математические навыки, среднее потребление считается по формуле (A*t + S*(T-t))/T = (A-S)t/T + S, где A-потребление в активном режиме (~1 мА), S-во сне (1 мкА по даташиту, ну пусть даже 5 мкА), t и T - времена бодрствования и период пробуждения. Время t я не замерял, но оно должно быть константой. Но вот T менял от 100 мс до ~2000 мс (максимум настроек), а разницы потребления особой не было.
0
20.05.2019, 15:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2019, 15:48

[РЕШЕНО] Не работает UART на stm32l151
Не получается заставить работать UART , хочу пересылать команды между компьютером и МК stm32L151,...

STM32L151 Keil Debug не могу запустить
Всем здрям. В моем проекте использую микроконтроллер STM32L151CBT6. Подготовил проект с помощью...

Stm32l151 dac. Минимальная частота шины для вывода голоса
Хочу вывести запись голоса с флешки на ЦАП микроконтроллера stm32l151, и появились пару вопросов ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru