MiklPolikov
May 21 2012, 19:36
Коллеги, нет ли тут уже открытой темы про то как добится от STM32L151 потребления 10мкА при идущих часах RTC и прерывании от кнопки ?
Информации много, и некоторых вещей я совсем не понимаю. Например как переписать функцию из FLASH в RAM , и как затем выключить FLASH ,
и сколько после этог перестанет потреблять FLASH ?
Подсткажите , с чего начать ?
Спасибо.
Цитата(MiklPolikov @ May 22 2012, 01:36)

Информации много, и некоторых вещей я совсем не понимаю. Например как переписать функцию из FLASH в RAM , и как затем выключить FLASH ,
и сколько после этог перестанет потреблять FLASH ?
Если у вас IAR, то просто добавьте функции модификатор __ramfunc и компилятор скомпилит её для работы в ОЗУ, а стартап-код скопирует её в ОЗУ.
spasbyspas
May 22 2012, 08:00
Потребления STM32L151 при идущих часах RTC в "STANDBY mode" если включен "internal reference voltage" составляет около 4uA, а если выключен - 1,3uA. Я не понимал, для какой режим вашего запроса, но я могу помочь с кодом.
_Артём_
May 22 2012, 08:44
Цитата(spasbyspas @ May 22 2012, 11:00)

Потребления STM32L151 при идущих часах RTC в "STANDBY mode" если включен "internal reference voltage" составляет около 4uA, а если выключен - 1,3uA. Я не понимал, для какой режим вашего запроса, но я могу помочь с кодом.
A после выхода из Stanby он может продолжать работу с того же места без переинициализации?
spasbyspas
May 22 2012, 09:10
Нет, из "STANDBY mode" работа начинается с "Reset_Handler" т.е. сначала. Сохранени только состояние регистров RTC и PWM. Также "All registers are reset after wakeup from Standby except for PWR power control/status register (PWR_CSR)."
_Артём_
May 22 2012, 09:19
Спасибо за информацию.
Цитата(spasbyspas @ May 22 2012, 12:10)

Нет, из "STANDBY mode" работа начинается с "Reset_Handler" т.е. сначала. Сохранени только состояние регистров RTC и PWM. Также "All registers are reset after wakeup from Standby except for PWR power control/status register (PWR_CSR)."
Не густо с sleep-ом.
MiklPolikov
May 22 2012, 09:52
Цитата(spasbyspas @ May 22 2012, 11:00)

Потребления STM32L151 при идущих часах RTC в "STANDBY mode" если включен "internal reference voltage" составляет около 4uA, а если выключен - 1,3uA. Я не понимал, для какой режим вашего запроса, но я могу помочь с кодом.
Мне нужно, что бы процессор мог выйти из спящего режима по кнопке и по RTC, желательно начал с того же места где остановился.
Какой это режим ? Пытаюсь сделать Low power sleep вот таким образом . Получаю ток 1.6мА. Как я понимаю, после запуска вся периферия отключена, и в коде её отключать не надо.
Код
int main(void)
{
RCC->CFGR &=~RCC_CFGR_SW; //Выбрали System clock MSI
RCC->CR &= ~RCC_CR_HSION; //вЫключили генератор HSI
RCC->ICSCR&=~RCC_ICSCR_MSIRANGE;
RCC->ICSCR|=RCC_ICSCR_MSIRANGE_64KHz; //MSI 64 KHz
PWR->CR |= PWR_CR_LPSDSR; //при входе в спящий режим переводим встроеный стабилизатор в режим малого портебления
PWR->CR |= PWR_CR_LPRUN; //Voltage regulator in low power mode in Low power run mode
PWR->CR |= PWR_CR_ULP; //Внутренний источник опорного напряжения отключен в спящем режиме
SCB->SCR&=~SCB_SCR_SLEEPONEXIT; // не дожидаемся окончания выхода из прерывания перед входом в спящий режим
__WFI(); //заснули
while(1){}
}
_Артём_
May 22 2012, 09:56
Цитата(MiklPolikov @ May 22 2012, 12:52)

Мне нужно, что бы процессор мог выйти из спящего режима по кнопке и по RTC, желательно начал с того же места где остановился.
Тогда вам EFM32 - самое то.
MiklPolikov
May 22 2012, 10:04
Цитата(_Артём_ @ May 22 2012, 12:56)

Тогда вам EFM32 - самое то.
У меня уже STM32L151
_Артём_
May 22 2012, 10:16
Цитата(MiklPolikov @ May 22 2012, 13:04)

У меня уже STM32L151
Я вам про EFM. а не STM.
Но если выбор сделан ...то дело ваше.
spasbyspas
May 22 2012, 10:21
Цитата
Мне нужно, что бы процессор мог выйти из спящего режима по кнопке и по RTC, желательно начал с того же места где остановился.
Какой это режим ? Пытаюсь сделать Low power sleep вот таким образом . Получаю ток 1.6мА. Как я понимаю, после запуска вся периферия отключена, и в коде её отключать не надо.
Да, тогда вы можете успешно использовать "STOP Mode" в конфигурация "Regulator in LP mode", "VREFINT OFF".
Как правило, вы можете посмотреть "AN3413 STM32L-DISCOVERY: current consumption measurement and touch sensing demonstration" и пример PWR->CurrentConsumption из "StdPeriph_Lib" для STM32L.
И, чтобы напомнить вам, как дополнительное правило для снижение енергопотребление:
"Configure all GPIO as analog to reduce current consumption on non used IOs"
А после запука какая периферия отключена?!
MiklPolikov
May 22 2012, 11:20
Цитата(spasbyspas @ May 22 2012, 13:21)

А после запука какая периферия отключена?!

В регистрах RCC_AHBENR RCC_APB2ENR RCC_APB1ENR почти везде нули, т.е. периферия не тактируется.
И все биты включения в регистрах периферии то же сброшены .
Это значит , что периферия выключена и потребляет так мало как это возможно.
Я не правильно рассуждаю ?
spasbyspas
May 22 2012, 11:40
Да, так точно после "RESET HANDLER" , я не понял этот абзац из сообщения.
MiklPolikov
May 22 2012, 12:39
Цитата(spasbyspas @ May 22 2012, 13:21)

И, чтобы напомнить вам, как дополнительное правило для снижение енергопотребление:
"Configure all GPIO as analog to reduce current consumption on non used IOs"
Не понимаю :
делаю
GPIOB->MODER=0xFFFFFFFF; //сделали порт аналоговым
GPIOB->PUPDR=0; // отключили pull-up pull-doun
и на одной из ног появляется + и зажигается светодиод. А другой светодиод не зажигается.
Судя по напряжению на ноге она снановится подтянут к+ через резистор несколько К
Разъве порт не должен стать высокоимпедансным ?
Ещё перестаёт работать JTAG , хотя вроде бы он к этим ногам отношения не имеет.
На блок-схеме порта не вижу никакого отключения выходных транзиторов, а вижу отдельную линию ANALOG которая сама по себе и ни с чем не связана.
spasbyspas
May 22 2012, 13:44
Цитата
Разъве порт не должен стать высокоимпедансным ?
Да, должен но и я наблюдаю подобные явления(но факт, что потребление снижается).
Стадии разработке JTAG контакты должны бы не следует менять и специально в токой режиме.
В общем, то есть проблема с программированием новой версии программа через JTAG и в частности SWD в "STANDBY mode".
MiklPolikov
May 26 2012, 14:10
Цитата(spasbyspas @ May 22 2012, 16:44)

Стадии разработке JTAG контакты должны бы не следует менять и специально в токой режиме.
В общем, то есть проблема с программированием новой версии программа через JTAG и в частности SWD в "STANDBY mode".
Эти два предложения совсем не понял...
В общем, делаю вот так, сразу после запуска , т.е. периферия выключена.
__WFI(); можно и не в цикле , т.к. никаких прерываний нет , проверял.
На двух подтягивающих резисторах 10К jtag обнаружил напряжение 0.17в и отпаял их. Без резисторов напряжение стало 0.54.
При делителе AHB=1
С __WFI(); получаю ток 19мкА
Если __WFI(); вообще нет , и программа крутится в while(1){}, получаю ток 32мкА
При делителе AHB=512
С __WFI(); 19мкА
Без __WFI(); 25мкА
При этом всём нога VDDA потребляет ~1 мкА
Вопрос : как ещё снизить ток ? Чего я ещё забыл выключить ?
Код
RCC->CFGR &=~RCC_CFGR_SW; //Выбрали System clock MSI
RCC->CR &= ~RCC_CR_HSION; //вЫключили генератор HSI
RCC->ICSCR&=~RCC_ICSCR_MSIRANGE;
RCC->ICSCR|=RCC_ICSCR_MSIRANGE_64KHz; //частота MSI 64 KHZ
RCC->CR &=~RCC_CR_HSEON; //выключили генератор HSE , сразу после включения МК он почеу-то портебляет 1.5мА
PWR->CR |= PWR_CR_LPSDSR; //при входе в спящий режим переводим встроеный стабилизатор в режим малого портебления
PWR->CR |= PWR_CR_LPRUN; //Voltage regulator in low power mode in Low power run mode
PWR->CR |= PWR_CR_ULP; //Внутренний источник опорного напряжения отключен в спящем режиме
/////////////// RCC->CFGR |=RCC_CFGR_HPRE_DIV512; //делитель AHB 512
SCB->SCR&=~SCB_SCR_SLEEPONEXIT; // не дожидаемся окончания выхода из прерывания перед входом в спящий режим
RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN |RCC_AHBENR_GPIOHEN; //включили тактирование портов
GPIOA->PUPDR=0;
GPIOB->PUPDR=0;
GPIOC->PUPDR=0;
GPIOH->PUPDR=0; //выключили подтягивающие резисторы
GPIOA->MODER=0xFFFFFFFF;
GPIOB->MODER=0xFFFFFFFF;
GPIOC->MODER=0xFFFFFFFF;
GPIOH->MODER=0xFFFFFFFF; //сделали все порты аналоговыми
RCC->AHBENR &= ~(RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN |RCC_AHBENR_GPIOHEN); //вЫключили тактирование портов
while(1)
{
__WFI(); //заснули
}
spasbyspas
May 26 2012, 19:12
У вас с код все в порядке!
Но.. с __WFI(); получаю ток около 15мкА,
с while(1){}, получаю ток 23мкА.
без никаких периферийных устройств на пинах.
Т.е. это связано с утечки светодиода или другие периферийные устройства при конфигурации "all GPIO as analog".
Обычно ток в этом режиме - около 18мкА - STM32L151xx, STM32L152xx User Manual "Electrical characteristics"
Table 17. Current consumption in Low power sleep mode
MSI clock, 65 kHz, fHCLK= 64 kHz, Flash ON.
MiklPolikov
Aug 29 2012, 11:31
Хочу перейти в режим STOP с RTC , в которм потребление судя по документации 1.6мкА
Следующий вопрос :
Где почитать про переход в STOP и выход из него ?
При выходе программа начинает выполнятся с того места где остановилась, или с начала ?
Если с начала, то как понять что это был выход из STOP а не reset ?
Как войти в STOP , если я не пользуюсь чужими библиотеками, а пользуюсь только тем что поставляется вместе с KEIL ?
Спасибо !
Цитата
Где почитать про переход в STOP и выход из него ?
В документации на микроконтроллер, в данном случае смотрите
RM0038: STM32L151xx, STM32L152xx and STM32L162xx advanced ARM-based 32-bit MCUs
AN3193: STM32L15x ultralow power features overview
и рекомендую глянуть стандартную либу STM32L1xx standard peripherals library
Цитата
При выходе программа начинает выполнятся с того места где остановилась, или с начала ?
Выход эквивалентен программному сбросу мк,
Цитата
Если с начала, то как понять что это был выход из STOP а не reset ?
проконтролировать можно анализируя регистр статуса PWR_CSR, там есть битик SBF
Цитата
Как войти в STOP , если я не пользуюсь чужими библиотеками, а пользуюсь только тем что поставляется вместе с KEIL ?
Используйте документацию которую я указал выше и настоятельно рекомендую просмотреть примеры.
MiklPolikov
Sep 3 2012, 03:59
ZIB, большое спасибо !
Ещё вопрос :
Когда перехожу в STANDBY, ноги процессора оказываются в 3ем состоянии.
В LOW POWER SLEEP и STOP с ногами всё в порядке , остаются в тех уровнях что и были.
В STANDBY так и должно быть, или это у меня ошибка ?
MiklPolikov
Sep 4 2012, 09:59
Нашёл ответ сам в RM0038 Reference manual
I/O states in Standby mode
In Standby mode, all I/O pins are high impedance except for:
● Reset pad (still available)
● RTC_AF1 pin (PC13) if configured for Wakeup pin 2 (WKUP2), tamper, time-stamp,
RTC Alarm out, or RTC clock calibration out.
● WKUP pin 1 (PA0) and WKUP pin 3 (PE6), if enabled.
MiklPolikov
Feb 8 2013, 09:51
Кто-нибудь знает, почему вот в этой таблице из документа STM32L15x ultralow power features overview
встречаются значения YES NO ON OFF ? Чем YES отличается от ON а NO от OFF ?
spasbyspas
Feb 8 2013, 23:16
Для CPU, когда есть "NO", тогда только такт к CPU выключено, аналогично соответно "YES". А когда "ОFF", тогда питание CPU модуле выключено.
MiklPolikov
Feb 9 2013, 05:23
Цитата(spasbyspas @ Feb 9 2013, 03:16)

Для CPU, когда есть "NO", тогда только такт к CPU выключено, аналогично соответно "YES". А когда "ОFF", тогда питание CPU модуле выключено.
Спасибо.
Я так понимаю, что нет никакого режима что бы одновременно:
- Отключить CPU, FLASH
- Оставить включенной Периферию, DMA, HSI для работы АЦП , MSI 4МГц для перифении и DMA ?
В LOW POWER SLEEP выполняются все условия, за исключением того что системная частота не должна превышать 128КГц
spasbyspas
Feb 9 2013, 10:19
Действительно нет ситуация, у котороя исключенный из питание только CPU и FLASH.
В режиме "SLEEP" можно оставить включенный все периферии.
В режиме "Low power run" и "Low power sleep" действительно есть ограничение системная частота.
MiklPolikov
Feb 9 2013, 11:08
Цитата(spasbyspas @ Feb 9 2013, 14:19)

Действительно нет ситуация, у котороя исключенный из питание только CPU и FLASH.
В режиме "SLEEP" можно оставить включенный все периферии.
В режиме "Low power run" и "Low power sleep" действительно есть ограничение системная частота.
На будующее, у каких аналогичных процессоров такое есть ? Может у каких-то других из этой же серии STM32 ?
spasbyspas
Feb 9 2013, 11:37
Я не уверен, что понял ваш вопрос, но я бы сказал - я не знаю.
Цитата(MiklPolikov @ Feb 9 2013, 08:23)

Я так понимаю, что нет никакого режима что бы одновременно:
- Отключить CPU, FLASH
- Оставить включенной Периферию, ...
Цитата(MiklPolikov @ Feb 9 2013, 14:08)

На будующее, у каких аналогичных процессоров такое есть ?
Возможно вот (
источник):
EFM32 is a mixed-signal microcontroller focusing on supporting ultra low power battery operated solutions. To run from small cell batteries, EFM32 MCUs incorporates low power peripheral technology, fast response time, low latency, and autonomous operation (i.e.
the CPU does not run while the peripherals communicate).
Только это совсем не STM32, хотя тоже ARM Cortex.
Цитата(KiV @ Feb 11 2013, 10:46)

Возможно вот (
источник):
EFM32 is a mixed-signal microcontroller focusing on supporting ultra low power battery operated solutions. To run from small cell batteries, EFM32 MCUs incorporates low power peripheral technology, fast response time, low latency, and autonomous operation (i.e.
the CPU does not run while the peripherals communicate).
Только это совсем не STM32, хотя тоже ARM Cortex.
На STM32L151CB меньше чем 3uA никак у меня не получается (LSE + MSI)
C EFM32 - с LFXO легко 1uA получается.
MiklPolikov
Feb 24 2013, 15:38
Цитата(x893 @ Feb 24 2013, 19:13)

На STM32L151CB меньше чем 3uA никак у меня не получается (LSE + MSI)
C EFM32 - с LFXO легко 1uA получается.
Посмотрел EFM , там вроде бы периферия беднее.
Если у меня сейчас в STM32L151 задействованы 7 DMA каналов, все таймеры , смогу ли я этот алгоритм перетащить на
EFM ? Это вопрос к тем кто использовал и STM32 и EFM32.
_Артём_
Feb 24 2013, 16:37
Цитата(MiklPolikov @ Feb 24 2013, 17:38)

Если у меня сейчас в STM32L151 задействованы 7 DMA каналов, все таймеры , смогу ли я этот алгоритм перетащить на
EFM ?
Интересно как можно ответить на ваш вопрос не зная какой функционал реализует ваша программа?
Каналов в efm 8-12, таймеров - по разному, где как. И неизвестно какие функции таймеров вам нужны.
MiklPolikov
Feb 24 2013, 17:32
Цитата(_Артём_ @ Feb 24 2013, 20:37)

Интересно как можно ответить на ваш вопрос не зная какой функционал реализует ваша программа?
Каналов в efm 8-12, таймеров - по разному, где как. И неизвестно какие функции таймеров вам нужны.
Я в общем спрашиваю, сильно заметно то что в EFM периферия беднее или не сильно. Дать оценку по собственным ощущениям прощу.
Цитата(MiklPolikov @ Feb 24 2013, 21:38)

Если у меня сейчас в STM32L151 задействованы 7 DMA каналов, все таймеры , смогу ли я этот алгоритм перетащить на
EFM ?
Просто интересно - зачем нужно так много таймеров? Сколько делал разных проектов - везде хватало 1-2 аппаратных таймеров....
MiklPolikov
Feb 25 2013, 03:17
Цитата(jcxz @ Feb 25 2013, 06:23)

Просто интересно - зачем нужно так много таймеров? Сколько делал разных проектов - везде хватало 1-2 аппаратных таймеров....
Для сокращения потребления все задачи завязаны на периферию и таймеры, что бы процессор больше времени проводил в спящем режиме :
светодиоды индикации мигают по прерыванию одного таймера, ДМА каналы запускают таймеры или периферия, функция задержки сделана на отдельном таймере что бы процессор мог заснуть пока в ней сидит и т.д.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.