Низкий режим питания и пробуждение от сна.

Ахулл
Солнце 18 октября 2015 г. 13:29
Для запуска камеры Sunrise я хотел бы спать STM32 в течение длительного времени и проснуться на тревоге. Что я не могу получить свой адденный мозг, так это то, как прикрепить источник прерывания RTC, так что он просыпается от сна или просыпается на тревоге. В результате я могу пойти, так что спать, но не проснуться снова. Теперь я знаю, что ответ - RTFM, и я сделал это, с небольшим успехом. Поэтому мне было интересно, справился ли кто -нибудь еще этот трюк.
РЕДАКТИРОВАТЬ: У меня есть сон и Deepsleep, см. Поздние посты в этой теме. Что мне еще нужно сделать, так это привлечь код и создать чистую, прокомментированную, простую для чтения версию.

Для вашего развлечения здесь - эскиз, который прикрепляет прерывание секунд, чтобы моргнуть светодиод и отправить точку в серийную консиоле и запускает тревоги каждые 10 секунд. Это работает нормально, пока вы не засыпаете зверя. Это просто грубое руководство, не что -то прочное. SPIClass SPI_1(1);

victor_pv
Солнце 18 октября 2015 г., 16:30
Из того, что я помню, у нас есть 3 режима низкой мощности, сон, резервный режим, и я забыл другое имя.
Режим ожидания экономит питание, полностью выключив MCU. Он выключен почти все часы, поэтому вам нужно убедиться, что 1 -е место - это RTC, используя правильный источник часов? 2 -й, режим резервного режима требует чего -то другого, чтобы пробудить с RTC?

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

Я не помню имена режимов и детали на каждом из головы, но я надеюсь, что приведенные выше идеи помогут.

Ахулл
Солнце 18 октября 2015 г., 22:22
Из того, что я могу собрать, мы можем либо спать, либо Deepsleep, с последним закрытием процессора, это, кажется, переключено с битами в SCB

Видеть http: // static.Leaflabs.com/pub/lefflabs ... I/SCB.HTML Для клена принять это расположение. #include void setup() { // put your setup code here, to run once: Serial.begin(9600); delay(100); } void loop() { // put your main code here, to run repeatedly: }

Ахулл
Солнце 18 октября 2015 г. 11:12 вечера
Еще одно наблюдение, если я настрою...

Scb_base->Scr | = scb_scr_sleepdeep;

Текущий падает до более полезного 4.7ma, примерно текущий, нарисованный мощным светодиодом, я подозреваю (но, поскольку у меня нет эскиза, просыпается правильно, это не очень много используется.. еще...)

4.7ma выглядит как цель, чтобы прицелиться здесь. Это позволило бы мне запустить доску в течение 25 дней на одном липо 2500 мАч. Все еще дольше, если я удалю светодиод питания. Со сном, в отличие от Deep_sleep, мы можем запустить доску около 4 дней, и без сна, она будет работать около 2.5 дней. Уменьшение тактовой скорости также поможет здесь, поскольку применение, которое я имею в виду. задача, которую нужно выполнять только один раз в день. Конечно, если у меня есть дисплей, это также будет рисовать ток, с дисплеями в стиле Nokia 5110 и некоторыми другими, это может быть в однозначной диапазоне MA, поэтому процессор является основным свинцом Power Power.

Ахулл
Солнце 18 октября 2015 г. 11:43
Еще немного успеха. : D
Я добавил... #include void setup() { // put your setup code here, to run once: Serial.begin(9600); delay(100); } void loop() { // put your main code here, to run repeatedly: }

Ахулл
Пн 19 октября 2015 г., 10:52
Немного больше прогресса. Обновленный эскиз выше начинается, начинается, дважды моргает светодиод (нарисован 42 мА).. спит (ток 4MA, нарисованный), промойте, повторить. Так что я просыпаюсь при прерывании тревоги, а затем иду ко всему, а затем просыпаюсь и т. Д. Код по -прежнему немного грубые по краям, но как рабочий прототип, я доволен этим.

Кажется, что если вы спите на идее, вдохновение часто поражает... : D

Это означает, что 20+ дней между пополнениями одного липо 2600 мАч может быть реалистичным.

Поскольку мой пакет Lipo на самом деле 4х2600 мАч, это дает мне около 100 дней в режиме ожидания.

Я сомневаюсь, что когда -нибудь оставлю камеру, сидящую без присмотра в течение 3 месяцев, кроме того, когда камера снимается, она, вероятно, проведет пик около 1 ампер при запуске, немного меньше при съемке, поэтому она будет съесть батарею намного быстрее, чем что. В практическом плане.

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

Еще предстоит долгий путь, прежде чем у меня есть в полезном формате... Но я делаю прогресс. : D

РЕДАКТИРОВАТЬ: Интересный эффект кода заключается в том, что каждый раз, когда он просыпается, он повторно вырабатывает USB-устройство.. Стоимость системного журнала ниже... typedef enum rcc_pll_multiplier { RCC_PLLMUL_1 = (0x0 << 18)+(0x1<<17), RCC_PLLMUL_2 = (0x0 << 18),

Ахулл
Пн 19 октября 2015 г., 11:37
Еще один трюк... Если у меня будет шанс, я думаю, что я сведу силу, приведенный с уродливой доски или одного из моих чертепов, и проверю с этим, прямо прикреплено к липо. Я хотел бы посмотреть, действительно ли мы увидим Sub MA текущее потребление ST в их таблице данных (таблица данных - страница 45 претензий <370UA), но в настоящее время замаскируется потерей от светодиода и регулятора напряжения.
Если у нас будет резервный ток в <370UA, который представляет собой потенциально 1171+ дней в режиме ожидания или превышает 3 года. Если мы находимся на уровне 4UA, то мы смотрим на большее равно 300 лет :ржу не могу: может ли мой дешевый DMM с его заявленным диапазоном 200UA фактически измерить это, еще неизвестно.

Низкая мощность
Изображение

Высокая мощность
Изображение

Ахулл
Пн 19 октября 2015 г., 20:09
Интересный (C) Ray) результат.

Моя уродливая доска не запускает эскиз.

Я подозреваю, что это связано с тем, что он неправильно повторно размер USB-порт, как мы видели в прошлом. Он начинается, моргает светодиод, затем дуется.

У меня есть синяя таблетка, которую я могу снять светодиод, но у них есть разъем Micro USB, а не мини -разъем, поэтому измерение измерения тока USB -тока потребует операции, чтобы добавить разъем Micro USB.. Если я не найду конвертера в моем Большой тайник случайного мусора в коробках хорошо заказанный семинар, конечно.. : D

victor_pv
Пн, 19 октября 2015 г., 22:40
Отличный прогресс, Энди!
Я думаю, что у вас была идея, прежде чем делать библиотеку с низкой мощностью, мы, вероятно, должны работать над этим один день или, по крайней мере, составить различные потоки с низкими тестами мощности, чтобы мы могли вернуться назад. Этот будет действительно полезен для тех, кто пытается использовать RTC, чтобы проснуться.

Я считаю, что ядро ​​теперь работает нормально на 48 МГц, если вы хотите попробовать, по крайней мере, USB делает, потому что я проверил это. Вам нужно изменить USB, чтобы использовать Div1 и PLL для использования x6 вместо x9, я считаю, что файл является досками.cpp или board_setup.CPP. Детали в ветке о GD.
Роджер изменил большинство, если не все основные функции, которые зависят от частоты, поэтому большинство должно работать нормально при 48 МГц. Я считаю, что я проверил USB и TFT, но я не полностью помню.

Я был занят завершением гитары и не играл с досками STM за месяц, так что в моей голове больше ничего свежего...

Ахулл
Пн, 19 октября 2015 г., 11:35 вечера
victor_pv написал:Отличный прогресс, Энди!
Я думаю, что у вас была идея, прежде чем делать библиотеку с низкой мощностью, мы, вероятно, должны работать над этим один день или, по крайней мере, составить различные потоки с низкими тестами мощности, чтобы мы могли вернуться назад. Этот будет действительно полезен для тех, кто пытается использовать RTC, чтобы проснуться.

Я считаю, что ядро ​​теперь работает нормально на 48 МГц, если вы хотите попробовать, по крайней мере, USB делает, потому что я проверил это. Вам нужно изменить USB, чтобы использовать Div1 и PLL для использования x6 вместо x9, я считаю, что файл является досками.cpp или board_setup.CPP. Детали в ветке о GD.
Роджер изменил большинство, если не все основные функции, которые зависят от частоты, поэтому большинство должно работать нормально при 48 МГц. Я считаю, что я проверил USB и TFT, но я не полностью помню.

Я был занят завершением гитары и не играл с досками STM за месяц, так что в моей голове больше ничего свежего...

victor_pv
Вт 20 октября 2015 г. 1:07
Ахулл написал:victor_pv написал:Отличный прогресс, Энди!
Я думаю, что у вас была идея, прежде чем делать библиотеку с низкой мощностью, мы, вероятно, должны работать над этим один день или, по крайней мере, составить различные потоки с низкими тестами мощности, чтобы мы могли вернуться назад. Этот будет действительно полезен для тех, кто пытается использовать RTC, чтобы проснуться.

Я считаю, что ядро ​​теперь работает нормально на 48 МГц, если вы хотите попробовать, по крайней мере, USB делает, потому что я проверил это. Вам нужно изменить USB, чтобы использовать Div1 и PLL для использования x6 вместо x9, я считаю, что файл является досками.cpp или board_setup.CPP. Детали в ветке о GD.
Роджер изменил большинство, если не все основные функции, которые зависят от частоты, поэтому большинство должно работать нормально при 48 МГц. Я считаю, что я проверил USB и TFT, но я не полностью помню.

Я был занят завершением гитары и не играл с досками STM за месяц, так что в моей голове больше ничего свежего...

Ахулл
Вт 20 октября 2015 г. 1:31
victor_pv написал: В MCU есть флаг, чтобы сигнализировать о том, проснулся ли он от сброса или из режима сохранения питания. Это может сделать трюк для государственной машины, так как, если я правильно помню, он работает даже для режима резервного режима, когда оперативная операция очищена.
Если вам нужно удерживать переменные в режиме ожидания, но не от сброса, вы могли бы получить переменные сохранения кода в I2C EEPROM или Flash, затем перейдите в режим ожидания, и когда код начинает проверить, был ли этот флаг, чтобы решить, является ли это просениться или сброс, чтобы действовать так или иначе. Информация о флаге находится в таблице данных в разделе «Режимы низкой мощности», если я помню прямо в конце раздела. Я не помню, как думал, есть ли флаг для каждого режима сохранения питания или только для резервного режима, но в других режимах запускается именно там, где он ушел, так что вы точно знаете, что выполняет перед пробуждением, не нужно иметь флаг Для тех, я думаю.

Ахулл
Вт 20 октября 2015 г. 5:11
Я снова обновил эскиз. Я понял, что функции сна работали надежно, поэтому эскиз сейчас проходит через разные режимы, мигая по мере его поступления (см. Комментарии в коде, чтобы выяснить, что он делает)... Это все еще нужно немного больше работы, чтобы сделать его удобным для пользователя.

У меня также была игра с изменением RCC_CLKSRC_HSI, RCC_PLLSRC_HSE, RCC_PLLMUL_X Параметры источника часов в подпрограмме службы прерывания тревоги.
Я могу успешно изменить часы (только в этой рутине) на лету... Так что я могу перемещаться по скорости 16 МГц или Zip вдоль 128 МГц (нет дыма.. еще)... if(Serial.available()) { while(Serial.available()) { char c = Serial.read(); ........... } }

Ахулл
Вт 20 октября 2015 г., 16:53
У меня не было много времени, чтобы поиграть с этим сегодня, но я добавил еще несколько экспериментальных результатов и подбрасывал код и комментарии. Я снова опубликовал код в первом сообщении этой ветки.

Сводка результатов ниже. Они согласны с таблица данных (стр. 42 и 43), в разумном крае. 8ma (не включая светодиод и т. Д.) для процессора Arm 8 МГц подойдет для меня : D
// Initialize at the highest speed supported by the board that is // not over 50 MHz. Try a lower speed if SPI errors occur. if (!sd.begin(chipSelect, SD_SCK_MHZ(50))) { sd.initErrorHalt(); }

victor_pv
Ср 21 октября 2015 г. 12:18
Еще один трюк с сохранением мощности, ядро ​​Libmaple по умолчанию запускает часы во всех периферийных устройствах (порты SPI, USARTS, GPIO, таймеры и т. Д.).
Мы добавили функцию, которая может отключить часы на любом периферийном. Нам нужно было, чтобы изменить скорость USB -порта в GD, так как часы должны быть отключены перед изменением разделителя, и я не проверял его во что -либо еще, но функция на 99% такая же, как и та, которая использовалась для включения всех Часы, поэтому я довольно уверен, что это работает, чтобы отключить часы на любом периферийном устройстве. Таблица данных где -то показывает, сколько находится разница между всеми периферийными устройствами и всеми отключенными, и это несколько ма. Если вам не нужно периферийное устройство, я бы отключил часы их в начале эскиза. Даже периферийные устройства, которые вы используете, вы можете отключить их часы по умолчанию и включить их снова, когда они вам нужны, их регистры остаются действительными с отключенными часами в соответствии с таблицей данных. Это может вернуть вам еще несколько мат.
Я забыл имя функции, но используется прямо в файле, который устанавливает мультипликатор PLL, всего на несколько строк, он отключает USB -часы, затем меняет разделитель и включает его снова.

ZMEMW16
Ср 21 октября 2015 г. 12:42
Вам может быть интересно эта ветка
http: // www.STM32duino.com/viewtopic.PHP?F = 45&t = 667

Выводы интересны

Стивен

Mrburnette
Ср 21 октября 2015 г. 12:52
Ахулл написал:У меня не было много времени, чтобы поиграть с этим сегодня, но я добавил еще несколько экспериментальных результатов и подбрасывал код и комментарии. Я снова опубликовал код в первом сообщении этой ветки.

Ахулл
Ср 21 октября 2015 г. 14:01
Больше прогресса. Изменения часов на лету (почти).

Добавлено несколько грубых функций, чтобы обмениваться между 48 МГц и 72 МГц, единственные периферические часы, которые регулируются, - это USB -часы, поэтому используйте с осторожностью.
При 48 МГц Миллис () и т. Д. Все будут замедлены, любые другие времена вполне также могут быть застрелены.

Более надежный подход будет включать в себя снимок текущих периферийных часов и соответствующим образом настройка их для новой тактовой скорости PLL -адреса PLL.
Я также должен проверить, устроились ли часы перед обменом, чтобы эти простые функции могли сбоевать и оставить вас на неправильной тактовой скорости.

Я иду в правильном направлении, однако. Эскиз теперь сапоги, замедляется до 48 МГц (текущие падения до 20 мкм), мигает и пишет Blink48! 100 раз до USB -сериала, скорость обратно до 72 МГц (ток достигает 45 мА), мигает и пишет Blink72! 100 раз до USB, затем ложится спать. Просыпается, работает на скорости 128 МГц в петле тревоги (больше миганий, токовые пики при 65 мА), переходит на DeepSleep, перезапуска (USB -капли) и повторяется.

Примечание: это работа в процессе, поэтому может быть ненадежным.

Ахулл
Ср 21 октября 2015 г., 18:17
Больше веселья с часами и тревогами.

Так как теперь у меня есть контроль над портом USB на двух разных тактовых скоростях, я могу сделать немного больше отладки.
// Initialize at the highest speed supported by the board that is // not over 50 MHz. Try a lower speed if SPI errors occur. if (!sd.begin(chipSelect, SD_SCK_MHZ(50))) { sd.initErrorHalt(); }

Rogerclark
Ср 21 октября 2015 г., 8:01 вечера
Как бипродук, если работа, которую я проделал для GD32, я думаю, что вы сможете изменить настройку часов на досках.TXT, или, возможно, он на платформе.TXT на STM32 и установите его на 48 МГц, и все должно работать хорошо.

Ахулл
Ср 21 октября 2015 г. 8:14 вечера
Rogerclark написал:Как бипродук, если работа, которую я проделал для GD32, я думаю, что вы сможете изменить настройку часов на досках.TXT, или, возможно, он на платформе.TXT на STM32 и установите его на 48 МГц, и все должно работать хорошо.

ZMEMW16
Ср 21 октября 2015 г., 22:18
Существует старый аргумент, что вы должны делать что -то как можно быстрее, а затем спать как можно больше, чтобы быть энергоэффективным. (Не уверен, что это всегда относится к реальной жизни, хотя : D ) Я знаю кошек, который согласился бы со второй частью этого, только время, когда она ускоряется, предназначен для еды : D

SRP

Ахулл
Ср 21 октября 2015 г. 11:43
ZMEMW16 написал:Существует старый аргумент, что вы должны делать что -то как можно быстрее, а затем спать как можно больше, чтобы быть энергоэффективным. (Не уверен, что это всегда относится к реальной жизни, хотя : D ) Я знаю кошек, который согласился бы со второй частью этого, только время, когда она ускоряется, предназначен для еды : D

SRP

ZMEMW16
Чт 22 октября 2015 г. 12:50
Пуди Кэт делает регулярные кормления, нет шансов. Кормите меня, корми меня, ......

Стивен

Ахулл
Чт 22 октября 2015 г., 16:42
Ахулл написал:victor_pv написал: В MCU есть флаг, чтобы сигнализировать о том, проснулся ли он от сброса или из режима сохранения питания. Это может сделать трюк для государственной машины, так как, если я правильно помню, он работает даже для режима резервного режима, когда оперативная операция очищена.
Если вам нужно удерживать переменные в режиме ожидания, но не от сброса, вы могли бы получить переменные сохранения кода в I2C EEPROM или Flash, затем перейдите в режим ожидания, и когда код начинает проверить, был ли этот флаг, чтобы решить, является ли это просениться или сброс, чтобы действовать так или иначе. Информация о флаге находится в таблице данных в разделе «Режимы низкой мощности», если я помню прямо в конце раздела. Я не помню, как думал, есть ли флаг для каждого режима сохранения питания или только для резервного режима, но в других режимах запускается именно там, где он ушел, так что вы точно знаете, что выполняет перед пробуждением, не нужно иметь флаг Для тех, я думаю.

Ахулл
Пт 23 октября 2015 г. 12:13
Вопрос: Как я могу чисто вспомнить USB-последовательное устройство?

Приведенный ниже код * почти * делает все, что вам нужно сделать, чтобы изменить тактовые скорости, DeepSleep (который вызывает перезапуск, который обнаруживает код) и сна и спят. Единственная проблема заключается в том, что когда я сплю (в отличие от Deepsleep), я не могу затем повторно вытереть USB чисто, поэтому мне нужно знать, если это.
ПРИМЕЧАНИЕ: Deepsleep Triggers в результате перезагрузки, так что USB повторно вытекает чисто.

А) Необходимо (может быть возможным, чтобы сохранить старый экземпляр) сохранить USB в живых будет лучшим решением.
или b) выполнимые в рамках существующей базы кода Libmaple/STM32DUINO.

Код, как он в настоящее время стоит, будет спать, но потом я получаю...
wordlist.o : section size addr .text 0 0 .data 0 0 .bss 0 0 .rodata 18856 0 .comment 45 0 .note.GNU-stack 0 0 Total 18901

victor_pv
Пт 23 октября 2015 г. 2:40
Энди пытается использовать тот же код, который у нас есть в ядре для перечисления USB в общих платах: ~/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/4.8.3-2014q1/

Rogerclark
Пт 23 октября 2015 г., 6:43
Виктор и Энди

Я не уверен, что вы можете просто заставить USB повторный размер, и USB будет работать.

Я подозреваю, что USB-код будет в режиме, где он думает, что он связан, и вам нужно сначала переунировать его (прежде чем вынудить повторную деятельность)

Я думаю, что я попытался вручную принудить реэналера с помощью резистора и кнопки, и она не волшебным образом снова начала работать после перечисления.

Но я думаю, что стоит попробовать..

Ахулл
Пт 23 октября 2015 г. 8:52
victor_pv написал:Энди пытается использовать тот же код, который у нас есть в ядре для перечисления USB в общих платах: / ******************** (C) COPYRIGHT 2007 STMicroelectronics ******************** * File Name : main.c * Author : MCD Application Team * Version : V1.0 * Date : 10/08/2007 * Description : Main program body ******************************************************************************** * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE * CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. *******************************************************************************/ /* Includes ------------------------------------------------------------------*/ #include "stm32f10x_lib.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ GPIO_InitTypeDef GPIO_InitStructure; ErrorStatus HSEStartUpStatus; /* Private function prototypes -----------------------------------------------*/ void RCC_Configuration(void); void NVIC_Configuration(void); void Delay(vu32 nCount); /* Private functions ---------------------------------------------------------*/ /******************************************************************************* * Function Name : main * Description : Main program. * Input : None * Output : None * Return : None *******************************************************************************/ int main(void) { #ifdef DEBUG debug(); #endif /* Configure the system clocks */ RCC_Configuration(); /* NVIC Configuration */ NVIC_Configuration(); /* Enable GPIOC clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); /* Configure PC.13 as Output Open Drain Output */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_Init(GPIOC, &GPIO_InitStructure); while (1) { /* Turn on led connected to PC.13 pin */ GPIO_SetBits(GPIOC, GPIO_Pin_13); /* Insert delay */ Delay(0xAFFFF); /* Turn off led connected to PC.13 pin */ GPIO_ResetBits(GPIOC, GPIO_Pin_13); /* Insert delay */ Delay(0xAFFFF); } } /******************************************************************************* * Function Name : RCC_Configuration * Description : Configures the different system clocks. * Input : None * Output : None * Return : None *******************************************************************************/ void RCC_Configuration(void) { /* RCC system reset(for debug purpose) */ RCC_DeInit(); /* Enable HSE */ RCC_HSEConfig(RCC_HSE_ON); /* Wait till HSE is ready */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { /* Enable Prefetch Buffer */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /* Flash 2 wait state */ FLASH_SetLatency(FLASH_Latency_2); /* HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* PCLK2 = HCLK */ RCC_PCLK2Config(RCC_HCLK_Div1); /* PCLK1 = HCLK/2 */ RCC_PCLK1Config(RCC_HCLK_Div2); /* PLLCLK = 8MHz * 9 = 72 MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* Enable PLL */ RCC_PLLCmd(ENABLE); /* Wait till PLL is ready */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } /* Select PLL as system clock source */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* Wait till PLL is used as system clock source */ while(RCC_GetSYSCLKSource() != 0x08) { } } } /******************************************************************************* * Function Name : NVIC_Configuration * Description : Configures Vector Table base location. * Input : None * Output : None * Return : None *******************************************************************************/ void NVIC_Configuration(void) { #ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif } /******************************************************************************* * Function Name : Delay * Description : Inserts a delay time. * Input : nCount: specifies the delay time length. * Output : None * Return : None *******************************************************************************/ void Delay(vu32 nCount) { for(; nCount != 0; nCount--); } #ifdef DEBUG /******************************************************************************* * Function Name : assert_failed * Description : Reports the name of the source file and the source line number * where the assert_param error has occurred. * Input : - file: pointer to the source file name * - line: assert_param error line source number * Output : None * Return : None *******************************************************************************/ void assert_failed(u8* file, u32 line) { /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* Infinite loop */ while (1) { } } #endif /******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/

ZMEMW16
Пт 23 октября 2015 г. 10:33
WokenfromDeepsLeePflag
Enum WokenfromsLeePflag (сброс, Паутон, теплый, глубокий) имена догадались!

SRP

Mrburnette
Пт 23 октября 2015 г. 12:16
ZMEMW16 написал:WokenfromDeepsLeePflag
Enum WokenfromsLeePflag (сброс, Паутон, теплый, глубокий) имена догадались!

SRP

victor_pv
Пт 23 октября 2015 г. 13:10
Есть ли еще один флаг, чтобы отметить, когда произошел сброс?
Если это так, то с обоими флагами вы могли бы различить, когда был каждый случай.
Если флаг не очищается автоматически, я не вижу проблемы с его чтением напрямую, а не использую переменную, но если переменная помогает вам сохранить все организованное, то почему бы и нет. Мне просто было интересно, было ли в этом необходимость.

Ахулл
Солнце 25 октября 2015 г., 8:18 вечера
victor_pv написал:Есть ли еще один флаг, чтобы отметить, когда произошел сброс?
Если это так, то с обоими флагами вы могли бы различить, когда был каждый случай.
Если флаг не очищается автоматически, я не вижу проблемы с его чтением напрямую, а не использую переменную, но если переменная помогает вам сохранить все организованное, то почему бы и нет. Мне просто было интересно, было ли в этом необходимость.

Ахулл
Солнце 25 октября 2015 г. 11:06 вечера
После того, как я еще больше испортил (назовите это исследование, и я буду платить целое состояние), у меня есть доска в 9.6ma, и все еще способен контролировать PIR (и другая кнопка с моего дисплея). В сочетании со способностью использовать RTC для планирования задач и периодических пробуждений, я думаю, что я очень счастлив.
Если регулятор напряжения считается около 4 мА, то 5.6ma - это светодиод Processor+Power.

9.6ma позволяет моим липосам 4 x 2400 мА для питания проекта примерно в 40 дней резервного режима/мониторинга и 5.6 мА => около 71 дня . Это сделает для меня. Если мне это нужно, чтобы продлиться дольше, я добавлю больше батарей ;)

В сочетании с кодом пробуждения RTC (где эффективно дренаж аккумулятора довольно близок к нулю во время сна, если мы питаемся прямо из липоса, без регулятора), я думаю, что я провел все «исследования», которые мне нужно на время.

Последний фрагмент кода ниже.
#include void prtf(char *fmt, ... ){ char buf[128]; // resulting string limited to 128 chars va_list args; va_start (args, fmt ); vsnprintf(buf, 128, fmt, args); va_end (args); Serial.print(buf); }

Rogerclark
Солнце 25 октября 2015 г. 11:32
Прохладный

Я думаю, что @markm также делает проект с низкой мощностью, поэтому я уверен, что он должен найти ваше неоплачиваемое «исследование» очень интересно.

Возможно, вы должны были пожертвовать через кнопку PayPal в вашей публикации ;-)

Ахулл
Пн 26 октября 2015 г. 10:31
Rogerclark написал:Прохладный
Я думаю, что @markm также делает проект с низкой мощностью, поэтому я уверен, что он должен найти ваше неоплачиваемое «исследование» очень интересно.

Jimpx225
Ср. 02 марта 2016 г., 19:28
У меня есть вопрос

Я следовал примерам, снял светодиод REG и PWR, и просыпался глубокий сон до 150UA и 45MA на RTC, но я не могу шесть, чтобы сделать прерывание. Если я прошел последний пример, ток сна составляет 2 мА, а прерывание работает, что мне не хватает?

Просто чтобы подтвердить в STM32F103 в DeepSleep 150UA, он проснется от прерывания?

Ахулл
Ср. 02 марта 2016 г., 8:54 вечера
Jimpx225 написал:У меня есть вопрос

Я следовал примерам, снял светодиод REG и PWR, и просыпался глубокий сон до 150UA и 45MA на RTC, но я не могу шесть, чтобы сделать прерывание. Если я прошел последний пример, ток сна составляет 2 мА, а прерывание работает, что мне не хватает?

Просто чтобы подтвердить в STM32F103 в DeepSleep 150UA, он проснется от прерывания?

Jimpx225
Чт, 3 марта 2016 г., 7:01
Ахулл написал:Jimpx225 написал:У меня есть вопрос

Я следовал примерам, снял светодиод REG и PWR, и просыпался глубокий сон до 150UA и 45MA на RTC, но я не могу шесть, чтобы сделать прерывание. Если я прошел последний пример, ток сна составляет 2 мА, а прерывание работает, что мне не хватает?

Просто чтобы подтвердить в STM32F103 в DeepSleep 150UA, он проснется от прерывания?

Зарубонд
Вт, март 08, 2016, 22:02
Привет, я играл с примерами кодов в этой теме, и я хотел бы создать программу, которая останавливается на 5 с, а затем что -то напечатает на последовательную сериал, а затем снова переходит на режим остановки для 5 с (пример кода ниже). Режим остановки/пробуждение на таймере работает OK (тестируется с помощью светодиода), но серийный останавливается сразу после первого пробуждения из режима остановки. Все, что я пытаюсь распечатать в нем, просто показывает белые пространства в серийном мониторе (в другой программе она показала значение нуля). Кто -нибудь знает, как исправить сериал, пожалуйста? Я предполагаю, что у него есть какая -то связь с таймерами, которые выключаются в режиме остановки и не поднимаются после пробуждения, но я только начинающий с STM32.
asm volatile ("nop");

Ахулл
Ср. 09 марта 2016 г. 12:06
При пробуждении я подозреваю, что вам нужно будет убедиться, что часы и периферийные устройства будут правильно настроены. К сожалению, я не могу быть более конкретным, чем это, так как у меня нет доски, чтобы проверить с. Тот факт, что вы видите ноль на серийном выводе, предполагает, что источник часов UART может быть неверным, но я подозреваю, что это больше, чем это.

Чакал
Ср 13 апреля 2016 г. 8:51 вечера
Просто быстро поделиться своими выводами о низкой мощности с моей общей синей таблеткой STM32F103C8 от AliexPress.

Я взял код из первого поста и снял его до этого:
// accurate micro second pin toggle .. // DWT defines from Pito's post // * note, I made CpuGetTicks volatile #define DWTEn() (*((uint32_t*)0xE000EDFC)) |= (1<<24) #define CpuTicksEn() (*((uint32_t*)0xE0001000)) = 0x40000001 #define CpuTicksDis() (*((uint32_t*)0xE0001000)) = 0x40000000 #define CpuGetTicks() (*((volatile uint32_t*)0xE0001004)) void setup() { DWTEn(); CpuTicksEn(); pinMode(LED_BUILTIN,OUTPUT); // for blue pill this is the PC13 } const uint32_t usec_delay = 5; // 5usecs == 100kHz toggle const unsigned usecs_in_cycles = 72*usec_delay; // 72 cycles in 1 usec with 72MHz system clock void loop() { static unsigned toggle; static uint32_t prev; while(1) { uint32_t curr = CpuGetTicks(); // toggle LED pin every usec_delay if ( (curr-prev) >= usecs_in_cycles ) { prev = prev + usecs_in_cycles; toggle^=1; GPIOC->regs->BSRR = ((1 << 13 ) << 16) | (toggle << 13); } } }

Rogerclark
Ср 13 апреля 2016 г., 21:03
Интересный...

Проблема загрузчика, время для запуска или что -то еще, E.глин. USB -сериал ?

(Поскольку загрузчик не работает в фоновом режиме, поскольку он полностью передает управление на эскиз после завершения - я.e Код просто прыгает на начальный адрес эскиза, когда загрузчик закончен)

Ахулл
Ср 13 апреля 2016 г., 21:12
Отличная работа! Мне нужно вернуться к низкому питанию. У меня есть несколько проектов, работающих на батареи, я хотел бы завершить.

Удаление регулятора является жизнеспособным вариантом при запуске из пары клеток AAA, один липо на 4.2V полностью заряжено может быть немного опасным, но есть только один способ узнать. Что может пойти не так. :ржу не могу:

В качестве альтернативы может быть лучший вариант регулятора напряжения LDO), возможно, что -то вроде XC6203E332PR

Чакал
Ср 13 апреля 2016 г., 21:17
Rogerclark написал: Проблема загрузчика, время для запуска или что -то еще, E.глин. USB -сериал ?

Чакал
Ср 13 апреля 2016 г., 21:30
Ахулл написал:В качестве альтернативы может быть лучший вариант регулятора напряжения LDO), возможно, что -то вроде XC6203E332PR

Ахулл
Ср 13 апреля 2016 г., 21:45
Чакал написал:Ахулл написал:В качестве альтернативы может быть лучший вариант регулятора напряжения LDO), возможно, что -то вроде XC6203E332PR

Чакал
Чт 14 апреля 2016 г., 4:22 утра
Ахулл написал:Если вы работаете с CR2032 или одной ячейки AAA или хотите надежности микрочипа, MCP выиграет, но если ваш источник питания - пара восстановленных ноутбуков 18650, дешевые победы. : D

Мадиас
Чт 14 апреля 2016 г. 8:19
Ахулл написал: Если вы работаете с CR2032 или одной ячейки AAA или хотите надежности микрочипа, MCP выиграет, но если ваш источник питания - пара восстановленных ноутбуков 18650, дешевые победы. : D

Чакал
Пн 18 апреля 2016 г. 10:38 утра
У меня было еще немного времени, чтобы играть с низкой мощностью в выходные дни, и мне удалось добиться некоторого прогресса.

Теперь я могу использовать оба остановки & Режимы резервного режима и смог выжать немного больше экономии мощности, особенно в режиме остановки.

Ситуация в моменты:
- Режим ожидания использует 3 мкА во время сна
- Устройство просыпается с помощью RTC (поддержано часами LSE)
- Все работает при запуске, когда устройство полностью сброшено & Инициализируется на каждом пробуждении

- Режим остановки использует 13 мкА во время сна
- Чтобы добраться до этого, ADC должен быть отключен, а все контакты GPIO устанавливаются в режим аналогового ввода
- Устройство просыпается с помощью RTC (поддержано часами LSE)
- После пробуждения устройство работает на 8 МГц на часах HSI, почти все отключен ввод/вывод

Я также создал (очень, очень) простую библиотеку, чтобы помочь использовать эти режимы низкой мощности: https: // github.com/chacal/stm32sleep

Не стесняйтесь попробовать это, если хотите! (И да, это очень экспериментально :))

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

Вот примеры кодов, копируемых из чтения библиотеки:

Режим ожидания:
void setup() { // put your setup code here, to run once: pinMode(PA5,OUTPUT); //GPIOA.regs->BSRRL = 0x0005; //GPIOA.regs->BSRRL = 0x0500; asm volatile ("mov r0,#0x0018"); asm volatile ("movt r0,#0x4002"); asm volatile ("mov r1,#0x0005"); asm volatile ("mov r2,#0x0500"); asm volatile ("myloop: strh r1, [r0]"); asm volatile ("strh r2, [r0]"); asm volatile ("strh r1, [r0]"); asm volatile ("strh r2, [r0]"); asm volatile ("strh r1, [r0]"); asm volatile ("strh r2, [r0]"); asm volatile ("strh r1, [r0]"); asm volatile ("strh r2, [r0]"); asm volatile ("strh r1, [r0]"); asm volatile ("strh r2, [r0]"); asm volatile ("strh r1, [r0]"); asm volatile ("strh r2, [r0]"); asm volatile ("strh r1, [r0]"); asm volatile ("strh r2, [r0]"); asm volatile ("strh r1, [r0]"); asm volatile ("strh r2, [r0]"); asm volatile ("strh r1, [r0]"); asm volatile ("strh r2, [r0]"); asm volatile ("b.n myloop"); } void loop() { // put your main code here, to run repeatedly: }

Martinayotte
Пн 18 апреля 2016 г. 14:05
Спасибо, Чакал, за то, что поделились с нами нам !

Mrburnette
Пн 18 апреля 2016 г., 17:54
Чакал написал: <...>
Я также создал (очень, очень) простую библиотеку, чтобы помочь использовать эти режимы низкой мощности: https: // github.com/chacal/stm32sleep
<...>

Ахулл
Пн 18 апреля 2016 г., 21:24
Очень полезен. Одна из идей, с которыми я играл (кратко), была спасение текущего состояния часов и других регистров перед сном, а затем их восстановление.

К сожалению, я не очень далеко с этой идеей. @Chacal, если у вас есть время (и склонность), возможно, стоит изучить эту возможность.

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

Чакал
Вторник 19 апреля 2016 г., 19:28
Mrburnette написал: Я рекомендую поместить примеры в GitHub в папке с названием «Примеры» ... Это помогает людям, когда они загружают Zip.

Чакал
Вторник 19 апреля 2016 г., 19:45
Ахулл написал:Очень полезен. Одна из идей, с которыми я играл (кратко), была спасение текущего состояния часов и других регистров перед сном, а затем их восстановление.

michael_l
Пн 27 марта 2017 г., 19:23
Спасибо за код, приятно видеть, что мы можем проснуться от сна с RTC. Но мне просто было интересно, есть ли у нас код, который просыпается от определенного PIN -кода I.эн. При подъеме или падении ? Мне не обязательно нужен самый глубокий сон, но просто умеренный ток холостого хода во сне.. Около 10-20 мА.

РЕДАКТИРОВАТЬ:

Чтение кода .. Я нашел это:

// включить бит для пробуждения.
Pwr_base - > Cr | = pwr_csr_ewup;

Так что PA0 _is_ Pin Pin ?

Нагисса
Вт 28 марта 2017 г. 9:50 утра
Запрос на вытягивание, созданный для адаптации библиотеки к 1.5 Формат и иметь возможность отправить его в библиотеки Arduino.

Нагисса
Вторник 28 марта 2017 г. 20:22
Ахулл написал:Отличная работа! Мне нужно вернуться к низкому питанию. У меня есть несколько проектов, работающих на батареи, я хотел бы завершить.

Удаление регулятора является жизнеспособным вариантом при запуске из пары клеток AAA, один липо на 4.2V полностью заряжено может быть немного опасным, но есть только один способ узнать. Что может пойти не так. :ржу не могу:

В качестве альтернативы может быть лучший вариант регулятора напряжения LDO), возможно, что -то вроде XC6203E332PR

Пито
Ср 29 марта 2017 г. 8:21
Мне не обязательно нужен самый глубокий сон, но просто умеренный ток холостого хода во сне.. Около 10-20 мА. Хм, вы, конечно, хотите 10-20UA.. :)

PS: Я видел эскиз (от Ahull) в первом посте - есть ли у нас такие функции для переключения часов MCU на лету?
Что я скучаю по рутине Ахулла, так это корректировка с Millis (), Micros () и серийным Baudrate.

michael_l
Ср 29 марта 2017 г. 8:36 утра
Пито написал:Мне не обязательно нужен самый глубокий сон, но просто умеренный ток холостого хода во сне.. Около 10-20 мА. Хм, вы, конечно, хотите 10-20UA.. :)

Рекснанет
Ср 29 марта 2017 г. 8:40
Вы можете сделать это с помощью простого Op-AMP... например : http: // www.Электроника-поставки.ws/opa ... чертовски.HTML
Но вы можете использовать подход «Hi-Tech» и использовать STM32 :)
readanalog, digitalwrite и mosfet или что -то в зависимости от вашего нанесения.

Пито
Ср 29 марта 2017 г. 8:41
Ага! На самом деле мне нужна схема, которая обнаруживает напряжение и переключается на высокое/заземление на основе этого, если напряжение выше 13 В, а затем переключитесь на высокий, если ниже, чем переключатель на низкий.

Вы бы поняли, как это сделать?
Единственное чрезвычайно низкое измерение напряжения мощности, которое я знаю, подробно описано здесь:
ViewTopic.PHP?F = 18&T = 1697&hilit = напряжение ... = 10#p22424

michael_l
Ср 29 марта 2017 г. 8:46
Спасибо !

Моя цель в том, что я хочу питать всю свою схему, когда начинается машина. Схема содержит STM32 с дисплеями, подключенными к +5 В и т. Д. Когда напряжение батареи >= 13 В (когда запускается автомобиль и генератор обеспечивает большую голосование) и выключите, когда ниже.

От разъема OBD2 я могу получить штифт напряжения батареи

Нагисса
Ср 29 марта 2017 г. 8:49
michael_l написал:Спасибо !

Моя цель в том, что я хочу питать всю свою схему, когда начинается машина. Схема содержит STM32 с дисплеями, подключенными к +5 В и т. Д. Когда напряжение батареи >= 13 В (когда запускается автомобиль и генератор обеспечивает большую голосование) и выключите, когда ниже.

michael_l
Ср 29 марта 2017 г. 8:51
Нагисса написала:michael_l написал:Спасибо !

Моя цель в том, что я хочу питать всю свою схему, когда начинается машина. Схема содержит STM32 с дисплеями, подключенными к +5 В и т. Д. Когда напряжение батареи >= 13 В (когда запускается автомобиль и генератор обеспечивает большую голосование) и выключите, когда ниже.

Пито
Ср 29 марта 2017 г. 15:03
Может быть, вам нужно запустить новую ветку, когда не связано с режимами с низкой мощностью и просыпается от сна..

ZMEMW16
Пн, 03 апреля 2017 г., 6:32
Что делает чтение батареи, когда вы поворачиваете стартер?
Является ли изменение достаточно, чтобы повлиять на «предложенную» схему обнаружения I.эн. Отключите его, а затем снова включает генератор
Стивен

AG123
Чт 13 декабря 2018 г. 13:04
[Ахулл - Пн 19 октября 2015 г. 10:52] - Немного больше прогресса. Обновленный эскиз выше начинается, начинается, дважды моргает светодиод (нарисован 42 мА).. спит (ток 4MA, нарисованный), промойте, повторить. Так что я просыпаюсь при прерывании тревоги, а затем иду ко всему, а затем просыпаюсь и т. Д. Код по -прежнему немного грубые по краям, но как рабочий прототип, я доволен этим.

Кажется, что если вы спите на идее, вдохновение часто поражает... : D

Это означает, что 20+ дней между пополнениями одного липо 2600 мАч может быть реалистичным.

Поскольку мой пакет Lipo на самом деле 4х2600 мАч, это дает мне около 100 дней в режиме ожидания.

Я сомневаюсь, что когда -нибудь оставлю камеру, сидящую без присмотра в течение 3 месяцев, кроме того, когда камера снимается, она, вероятно, проведет пик около 1 ампер при запуске, немного меньше при съемке, поэтому она будет съесть батарею намного быстрее, чем что. В практическом плане.

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

Еще предстоит долгий путь, прежде чем у меня есть в полезном формате... Но я делаю прогресс. : D

РЕДАКТИРОВАТЬ: Интересный эффект кода заключается в том, что каждый раз, когда он просыпается, он повторно вырабатывает USB-устройство.. Стоимость системного журнала ниже...
Откажитесь от этой супер старой ветки, вы знаете что -то, я думаю, вы могли бы буквально снять бобовые ростки
это дает мне жал, чтобы возиться с низкой мощностью :ржу не могу:

https: // www.ул.com/resource/en/applicat ... 171691.PDF
Тем не менее, я бы, вероятно, остановился в режиме остановки, а не в режиме ожидания
Казалось, что в режиме остановки SRAM и регистры сохраняются, но часы выключаются в соответствии с документами
Что мне довольно любопытно, так это то, что даже если SRAM и регистры сохраняются после остановки часов, USB отключение
И я не уверен, что еще может быть даже периферийные устройства, такие как ADC, SPI и т. Д
Какое -то состояние должно быть потеряно, вполне возможно продолжать бегать после WFI/WFE?
Мне показалось бы, что после пробуждения от остановки (или, конечно, в режиме ожидания) было бы необходимо начать с нуля, как после сброса

На самом деле есть еще один способ сделать низкую мощность, которая состоит в том, чтобы связываться с часами E.глин. между HSE и HSI, как вы пробовали
Это интересно, так как «современные» процессоры, кажется, делают это почти «без усилий», то, что менее известно, является в мгновением частотного переключателя, что все остается стабильным? Я предполагаю, что много работы ушло в «современное» оборудование, которое «автоматически» делает динамическое масштабирование частоты
И я предполагаю, что аппаратные дизайнеры в основном настраивают частоты процессора, сохраняя основную часть iO на одних и тех же частотах, в противном случае слишком много зависимостей, таких как STM32 USB, ADC, SPI, UART, автобусы и т. Д. синхронизации. Даже тогда я бы рассматривал это как нелегкий подвиг

AG123
Чт 13 декабря 2018 г. 14:35
Использование таких статей, как мощность масштабирования частоты динамического напряжения
https: // www.eetimes.com/автор.аспирант?секта ... ID = 1327469
В качестве руководства уравнение: void setup() { // put your setup code here, to run once: pinMode(PA5,OUTPUT); //GPIOA.regs->BSRR = 0x0020; // set PA5 //GPIOA.regs->BSRR = 0x00200000; // clear PA5 asm volatile ("ldr r0,#0x40020018"); // r0 -> GPIOA.regs->BSRR asm volatile ("mov r1,#0x0020"); // r1 -> mask to set PA5 HIGH in BSRR asm volatile ("lsl r2,r1,#0x10"); // r2 -> mask to set PA5 LOW in BSRR for(;;) { asm volatile ("str r2, [r0]"); asm volatile ("str r1, [r0]"); asm volatile ("str r2, [r0]"); asm volatile ("str r1, [r0]"); asm volatile ("str r2, [r0]"); asm volatile ("str r1, [r0]"); asm volatile ("str r2, [r0]"); asm volatile ("str r1, [r0]"); asm volatile ("str r2, [r0]"); asm volatile ("str r1, [r0]"); asm volatile ("str r2, [r0]"); asm volatile ("str r1, [r0]"); asm volatile ("str r2, [r0]"); asm volatile ("str r1, [r0]"); asm volatile ("str r2, [r0]"); asm volatile ("str r1, [r0]"); } } void loop() { // put your main code here, to run repeatedly: }

Ахулл
Чт 13 декабря 2018 г. 15:52
Один трюк, о котором я думал, - это перейти в режим низкой мощности, затем, когда вы проснетесь, просто перезагрузитесь. Таким образом, все ваши периферийные устройства возвращаются в рабочее состояние. Конечно, это может или не может работать, но вы не будете знать, пока не переключите свет ;)

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

AG123
Чт 13 декабря 2018 г., 16:02
Да, я думаю и в том же духе, другой «более сложный», возможно, прыгнуть в начальное местоположение эскиза / приложения.
Возможно, можно прыгнуть прямо и обойти загрузочный загрузчик. Улов здесь в том, что нужно было бы проверить и увидеть, что все H/w & после этого S/W

Ахулл
Пт 14 декабря 2018 г., 13:42
Существует риск в простой DC, соединяющем линию сброса к штифту ввода -вывода, так как вы можете войти в заблокированное состояние, где состояние штифта ввода -вывода остается низким. Я подозреваю, что вам действительно нужно подключить ее через крышку и подтянуть резистор, чтобы он получил только импульс, независимо от того, как долго булавка остается низкой.

Однако, поскольку я нахожусь в отпуске в нескольких тысячах миль от любых досок, с которыми я могу проверить эту теорию, вам нужно будет попробовать этот эксперимент без меня.

AG123
Пт 14 декабря 2018 г. 13:55
На самом деле для STM32 есть регистр для сброса программного обеспечения, RM0008 7.1.1 система сброса
Сброс программного обеспечения
Бит sysresetReq в Cortex®-M3 приложения прерывания и сброса управления управлением
Должен быть установлен для сброса программного обеспечения на устройстве. Обратитесь к STM32F10XXX Cortex®-M3
Руководство по программированию (см. Связанные документы) для более подробной информации.
Следовательно, сброс легко. Но обычно при пробуждении из режима остановки, возможно, не захотеть буквально делать полный сброс
И если я прочитаю различные посты, по -видимому, часы возвращаются в состояние после сброса E.глин. что STM32F1 работает на 8 МГц HSI

Следовательно, прыгнул в начало прошивки E.глин. 0x8003000 - один из возможных способов пропустить полный сброс
Тогда только то, что нужно было бы настроить все часы и периферийные устройства, которые нуждаются в E.глин. ADC, SPI, USB и т. Д., чтобы они работали, как можно ожидать

Я бы подумал о использовании низкоэтапной остановки и режимов резервных режимов «расширенных» вариантов использования, и, вероятно, новички с STM32 противостояли стене крутой кривой обучения, если они решит перейти на «глубокий конец» бассейна.

Более простым вариантом использования «резервного режима» является использование режима «ожидания» в качестве программного обеспечения, e, e.глин. Можно сделать тактильную кнопку для «питания» и нажатия этого «выключить» STM32. Тогда это имеет смысл просто запустить сброс программного обеспечения при пробуждении, так как не нужно сохранять состояние между до и после состояния низкой мощности

В то же время хорошо провести отпуск и не беспокойтесь о STM32, он находится в режиме ожидания, так что просто оставьте его там, пусть он игнорирует все прерывания и сон
:ржу не могу:

ТИМОТЕО
Вт 18 декабря 2018 г., 18:55
Всем здравствуйте,

Прежде всего позвольте мне поздравить вас с инициативой создания этой ветки!
В проекте, который я в настоящее время работаю над низкой мощностью, обязательна...
Но все равно нужно следовать этому длинному пути, чтобы понять все возможности и варианты.
Чтобы начать этот подход, просто скопируйте код в первом посте, но получите ошибку и не компилируется:
Неверное преобразование из 'tm*' в 'time_t {aka long int}' [-fpermissive]
У кого -нибудь есть идеи, почему?

И Чакал спасибо за то, что поделились с нами своим кодом.
Подход без загрузчика кажется мне очень хорошей ставкой!

Единственная проблема заключается в том, что мне нужно 2 SPI Bus для работы после каждого пробуждения.
Как вы упоминаете, сброс перезагрузит все остальные периферийные и часы, и для этого USB в порядке
Спасибо.

Всего наилучшего,
Тим

AG123
Ср 19 декабря 2018 г. 8:41
Я пытался возиться с низкой мощностью, чтобы увидеть, как это работает

В идеале следует обратиться к соответствующим документам при установлении регистров E.глин.
https: // www.ул.com/content/ccc/resource ... 171691.PDF
или справочные руководства
devcon.exe restart *1EAF*

AG123
Ср 19 декабря 2018 12:53
В другом примечании для тех, кто хочет использовать режим остановки (SRAM сохранился, сброс часов, низкое напряжение), а не в режиме ожидания (почти все выключено, SRAM проиграл)

Я отметил, что «инициализация системы» начинается с init ()
https: // github.com/rogerclarkmelbourne/ ... дюймовый.CPP#165
и init Calls setup_clocks (); Мне интересно, не пробуждается от этого ASM («WFI»); Если бы можно было просто вызвать setup_clocks (). Может быть, просто сделать это в одиночку, восстановит функции.

Или, возможно, это проще, я.эн. Все подсистемные предварительные сборы и т. Д.

Другие вещи, если необходимо удалить часы с периферийных устройств отдельно, если кто -то хочет уменьшить питание. Это немного странно, так как казалось бы, когда основные HSI, часы HSE останавливаются в режиме остановки, периферические часы должны быть автоматически остановлены, поскольку все они получены из HSI, HSE или PLL, которые будут принимать измерительные токи, чтобы рассказать. Представление состоит в том, что если «ничего не изменилось» и все предварительные масштабы сохраняются и что только HSE, HSI или PLL останавливаются. Тогда «все» вернется к бизнесу как обычно, как только настройка HSI, HSE или PLL,

Но, учитывая промежуток времени, состояния индивидуальных периферийных устройств и даже коды «драйвера» все равно должны быть «сброшенными», так как они могут сохранить состояние до WFI. Продолжение оттуда после пробуждения может вызвать проблемы, так как государства могут быть непоследовательными

Я не проверял, что из -за всех этих осложнений сбрасывают часы, состояния и периферийные устройства после пробуждения от WFI / WFE, я попробовал «короткий сокращение» только после перезагрузки после пробуждения :ржу не могу:

ТИМОТЕО
Пт 21 декабря 2018 г., 17:26
Продолжая свой проект, я хотел бы знать, как уменьшить питание на лету.
Поскольку мое приложение использует только HSE и LSE для RTC, SPI0 и SPI1.
Постарайтесь использовать функции отключения для АЦП или USART, но ни один, кажется, не уменьшает энергопотребление.
Любой совет хорошо пришел.
Спасибо.
Тим

AG123
Сб 22 декабря 2018 г. 1:37
Для тех пинга, которого вы не используете, установите их в качестве режима ввода, другие вещи, которые вы можете сделать, включает в себя отключение часов на периферийные устройства, которые вы не используете, взгляните на библиотеку Чакала, он сделал часть этого
Обратите внимание, что оставление вывода в качестве вывода может потреблять токи / мощность, особенно он питает некоторые схемы, тонитные или токи для поиска, которые имеют тенденцию оказывать большее влияние, поскольку энергопотребление составляет v^2 / r и 3.3V - это квадратный термин, в то время как внутреннее ядро ​​STM работает только в 1.8 В

Если есть другие компоненты схемы, кроме самого MCU, просмотрите те компоненты схемы, они могут быть теми, кто потребляет питание E.G LCD,. светодиоды, резисторы, транзисторы и т. Д

ТИМОТЕО
Сб 22 декабря 2018 г. 10:43
Привет, AG123,

Это любопытно на самом деле, во время разработки я обнаружил, что изменяет один вывод с ввода на вывод, сохраните мне некоторую мощность 0,2MA ...
Но наоборот не сработал. Возможно ли изменить состояние во время цикла цикла, или оно должно быть в настройке?
Если я не объявляю PIN -код в начале эскиза, это означает, что это будет вход, вывод или в состоянии струйки?
Вовлеченные периферийные устройства являются потребителями U.
Часы в LIB Chacal были очень хорошей идеей и попытайтесь с успехом, чтобы использовать, чтобы уменьшить силу на лету.
Может я снова что -то делаю не так :).
Постарается методично ввести изменения и посмотреть, как они меняются, если они вообще меняются...
Спасибо за ваш безотправный.

Тим

AG123
Сб 22 декабря 2018 г., 17:14
Я не проверял в руководствах перед публикацией, но казалось, что когда вывод установлен в качестве входного.
Если вы установите булавку в качестве выходного сигнала, и есть подтягивание, вытяните резистор, я предполагаю, что некоторые текущие потоки, поэтому я подумал, что установить их в качестве входного переключения на высокий импеданс может помочь. Я думаю, что есть также аналоговый режим ввода, не уверен, что это имеет какое -либо значение.
Я также не знаю наверняка, есть ли все контакты в режиме ввода по умолчанию при сбросе, это нужно искать в руководствах
Есть также шанс в том, что после периферийных устройств (e.глин. SPI, UART и т. Д.) Инициализируются (I.эн. такта), некоторые из этих контактов могут быть установлены в выходной режим из -за этой вспомогательной функции (E.глин. SPI, UART и т. Д
Эти вещи включают в себя как обзор ручных разделов, так и измерение токов и тестов, которые я не пробовал сам

Если вы на самом деле измеряете токи, попробуйте установить режим ожидания, как я предлагаю. Я не уверен, что это сделает это «отключить» периферийные устройства, но если это произойдет, то течения (следовательно, мощность) могут существенно уменьшить, я на самом деле не измерял их и, следовательно, не смогу рассказать вам о это. Самая сложная часть - после того, как вы восстановитесь после резервного периода, я решил просто перезагрузить, что работает для некоторых сценариев/вариантов использования

и, как упомянуто, компонент голода с мощностью может не быть самим STM32, если он уже находится в резервном состоянии, а часы удалены из GPIO, а выводы, установленные на высокий Z (E.глин. режим ввода), следовательно, нужно будет также проверить другие части компонентов

ТИМОТЕО
Солнце 23 декабря 2018 г. 12:13
Изменение ввода, вывода или аналога не сильно меняется :( в конечном итоге используйте аналоговую опцию на всех неиспользованных булавках, таких как: rem: Using the open source texane-stlink instead of the proprietary STM stlink exe texane-stlink\st-flash.exe write %str% 0x8000000 sleep 1 devconX64.exe restart *1eaf*

AG123
Солнце 23 декабря 2018 г. 9:22 утра
Я немного подозрительно, если первое заявление в вашем коде для резервного режима, в конце концов, должен прочитать как Search "Assert" (360 hits in 59 files) D:\Documents\Arduino\hardware\arduino_stm32\STM32F1\cores\maple\ext_interrupts.cpp (1 hit) Line 88: ASSERT(0); D:\Documents\Arduino\hardware\arduino_stm32\STM32F1\cores\maple\HardwareSerial.cpp (2 hits) Line 133: // ASSERT(baud <= this->usart_device->max_baud);// Roger Clark. Assert doesn't do anything useful, we may as well save the space in flash and ram etc Line 133: // ASSERT(baud <= this->usart_device->max_baud);// Roger Clark. Assert doesn't do anything useful, we may as well save the space in flash and ram etc D:\Documents\Arduino\hardware\arduino_stm32\STM32F1\cores\maple\HardwareTimer.cpp (1 hit) Line 67: ASSERT(this->dev != NULL); D:\Documents\Arduino\hardware\arduino_stm32\STM32F1\cores\maple\libmaple\bkp_f1.c (2 hits) Line 83: ASSERT(0); /* nonexistent register */ Line 102: ASSERT(0); /* nonexistent register */ D:\Documents\Arduino\hardware\arduino_stm32\STM32F1\cores\maple\libmaple\dma.c (1 hit) Line 79: ASSERT(0); /* Can't happen */ D:\Documents\Arduino\hardware\arduino_stm32\STM32F1\cores\maple\libmaple\dma_f1.c (9 hits) Line 142: ASSERT(_dma_addr_type(cfg->tube_src) == DMA_ATYPE_MEM); Line 204: ASSERT(0); Line 220: ASSERT_FAULT(!dma_is_channel_enabled(dev, channel)); Line 234: ASSERT_FAULT(!dma_is_channel_enabled(dev, channel)); Line 269: ASSERT(status_bits & 0x1); Line 273: ASSERT(status_bits != 0x1); Line 289: * the debug level is too low for the above ASSERTs() to have had Line 299: ASSERT_FAULT(!dma_is_channel_enabled(dev, channel)); Line 308: ASSERT_FAULT(!dma_is_channel_enabled(dev, channel)); D:\Documents\Arduino\hardware\arduino_stm32\STM32F1\cores\maple\libmaple\exti.c (1 hit) Line 119: ASSERT(handler); D:\Documents\Arduino\hardware\arduino_stm32\STM32F1\cores\maple\libmaple\i2c.c (3 hits) Line 179: ASSERT(!(dev->regs->CR1 & I2C_CR1_PE)); Line 229: ASSERT(dev->state == I2C_STATE_IDLE); Line 389: ASSERT(0); D:\Documents\Arduino\hardware\arduino_stm32\STM32F1\cores\maple\libmaple\rcc_f1.c (2 hits) Line 104: ASSERT(sysclk_src == RCC_CLKSRC_PLL && Line 129: ASSERT_FAULT(!rcc_is_clk_on(RCC_CLK_PLL)); D:\Documents\Arduino\hardware\arduino_stm32\STM32F1\cores\maple\libmaple\timer.c (5 hits) Line 218: ASSERT_FAULT(channel > 0 && channel <= 4); Line 221: ASSERT(dev->type != TIMER_BASIC); Line 259: ASSERT((1 <= channel) && (channel <= 4)); Line 399: ASSERT(0); Line 447: ASSERT_FAULT(0); D:\Documents\Arduino\hardware\arduino_stm32\STM32F1\cores\maple\libmaple\usart_f1.c (1 hit) Line 174: ASSERT(clock_speed); D:\Documents\Arduino\hardware\arduino_stm32\STM32F1\cores\maple\libmaple\usb\stm32f1\usb.c (1 hit) Line 316: ASSERT_FAULT(epr & USB_EP_CTR_TX); D:\Documents\Arduino\hardware\arduino_stm32\STM32F1\cores\maple\libmaple\util.c (10 hits) Line 43: * ASSERT() will also throb() an LED connected to that port and pin. Line 60: * Print an error message on a UART upon a failed assertion (if one is Line 63: * @param file Source file of failed assertion Line 64: * @param line Source line of failed assertion Line 65: * @param exp String representation of failed assertion Line 73: /* Print failed assert message */ Line 74: usart_putstr(err_usart, "ERROR: FAILED ASSERT("); Line 88: * Provide an __assert_func handler to libc so that calls to assert() Line 88: * Provide an __assert_func handler to libc so that calls to assert() Line 91: void __assert_func(const char* file, int line, const char* method, D:\Documents\Arduino\hardware\arduino_stm32\STM32F1\cores\maple\pwm.cpp (1 hit) Line 47: ASSERT(dev && cc_channel); D:\Documents\Arduino\hardware\arduino_stm32\STM32F1\cores\maple\stm32f1\util_hooks.c (1 hit) Line 42: /* Failed ASSERT()s send out a message using this USART config. */ D:\Documents\Arduino\hardware\arduino_stm32\STM32F1\cores\maple\stm32f1\wirish_digital_f1.cpp (1 hit) Line 76: ASSERT(0); D:\Documents\Arduino\hardware\arduino_stm32\STM32F1\cores\maple\usb_serial.cpp (2 hits) Line 60: ASSERT(0); Line 354: ASSERT_FAULT(0);

ТИМОТЕО
Вт 25 декабря 2018 г., 8:25 вечера
Привет, AG123,

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

Тим

Peekay123
Пн, 07 января 2019 г. 14:55
Timoteo, у меня есть аналогичные проблемы с получением самой низкой мощности в режиме ожидания, и они, кажется, связаны с мигающим кодом с использованием последовательного (без загрузки) по сравнению с USB (с загрузчиком). Смотрите здесь:

ViewTopic.PHP?F = 28&t = 4485

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

Ахулл
Пн, 07 января 2019 г., 16:23
Что стоит, любые тесты с низкой мощностью, которые я делал в прошлом.

Я не рядом с ни одной из моих тестовых досок, и я не буду на утих, поэтому я не могу помочь, боюсь.

Jipolie01
Пт. 01 февраля 2019 г. 16:56
Я не уверен, что это место, чтобы опубликовать это, но я не мог понять это после прочтения форума.
Я пытаюсь использовать конкретный вывод (PB12) для пробуждения из этого режима. Я не понимаю, как я могу проснуться?

У меня уже есть код для перехода на спящий режим: // // Example of sleep and deepsleep modes // // #define BOARD_LED_PIN PB0 //#define BOARD_LED_PIN PC13 // Strictly speaking only the RTC crystal is necessary for this code to work. #define BOARD_HAS_WORKING_RTC_CRYSTAL true #define BOARD_HAS_WORKING_RTC_BATTERY true // Define the Base address of the RTC registers (battery backed up CMOS Ram), so we can use them for config of touch screen or whatever. // See http://stm32duino.com/viewtopic.php?f=15&t=132&hilit=rtc&start=40 for a more details about the RTC NVRam // 10x 16 bit registers are available on the STM32F103CXXX more on the higher density device. #define BKP_REG_BASE (uint32_t *)(0x40006C00 +0x04) // Defined for power and sleep functions pwr.h and scb.h #include #include // These are possibly defined somewhere but I couldn't find them. // System Control Register Bits. See... // http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0497a/Cihhjgdh.html #define SCB_SCR_SLEEPDEEP 4 // This register bit controls deepsleep(1) or sleep(0) #define SCB_SCR_SLEEPONEXIT 2 // This register bit controls sleeponexit. i.e. do we go back to sleep immediately after serviceing the interrupt, or go back to the main loop. #define SCB_SCR_SEVONPEND 16 // Controls Send Event on Pending bit: // Set up RTC and choose one of the available clocks. // The HSE/128 works in all boards // Boards with a 32kHz RTC crystal fitted can choose any clock (but I suggest using LSE as this is the 32kHz clock). // #include #ifdef BOARD_HAS_WORKING_RTC_CRYSTAL true RTClock rt(RTCSEL_LSE); #else RTClock rt(RTCSEL_HSE); // Alternatives... // RTClock rt(RTCSEL_LSI); // RTClock rt; // this starts HSE clock as a default. #endif bool ledOff = true; bool alarmTriggeredFlag = false; bool secInterruptFlag = false; bool deepSleepFlag = false; long int globSecCnt = 0; // Number of secondsInterrupts this session. // NOTE: globSecCnt is *not* preserved in deepsleep as the system restarts (ram contents are lost) after deepsleep. // The RTC of course does keep an accurate count of seconds. // Caveat, RTC time, and the RTC battery backed registers are preserved in deepsleep only if there is a voltage source (generally a battery) connected to vBat. // Some boards have vBat connected to VDD,the main STM32FXX 3V3 power supply so their RTC will keep working so long as the main power is preserved. // Flash is always preserved in deepsleeep, so writing to flash would be the best way to preserve config in excess of the // 14 bytes offered by the RTC when in deepsleep. long int alarmDelay = 15; // Seconds between restarts if using deepsleep, or time of first alarm if using sleep (subsequent sleeps can be set in the loop() section. struct tm time_tm, *tm_ptr; // This is a structure with date and time fields, used to set the time if BOARD_HAS_WORKING_RTC_CRYSTAL is false. int numFlashes = 1; // Create USB serial_debug port USBSerial serial_debug; void setup() { // This may be needed if we find the sys clock is incorrect after wakeup // Set up clock, PLL an multiplier // Chose RCC_PLLMUL_9 and RCC_PRESCALER_USB, 1.5 for 72MHz fom 8MHz crystal (standard STM32F103 speeds on most clone boards). // Chose RCC_PLLMUL_6 and RCC_PRESCALER_USB, 1 for 48MHz lower power from 8MHz crystal (standard STM32F103 speeds on most clone boards) // rcc_clk_init(rcc_sysclk_src sysclk_src, rcc_pllsrc pll_src, rcc_pll_multiplier pll_mul) // rcc_clk_init(RCC_CLKSRC_HSI, RCC_PLLSRC_HSE , RCC_PLLMUL_9); // rcc_switch_sysclk(rcc_sysclk_src sysclk_src) // DANGER - here be dragons. // Switch to external 8MHz clock, set multipler, switch back to internal // rcc_switch_sysclk(RCC_CLKSRC_HSE); // rcc_clk_init(RCC_CLKSRC_HSI, RCC_PLLSRC_HSE , RCC_PLLMUL_2); // rcc_clk_init(RCC_CLKSRC_HSI, RCC_PLLSRC_HSE , RCC_PLLMUL_16); // rcc_switch_sysclk(RCC_CLKSRC_HSI); // // rcc_clk_init(RCC_CLKSRC_HSE, RCC_PLLSRC_HSE , RCC_PLLMUL_16); // rcc_switch_sysclk(RCC_CLKSRC_HSE); // Likewise for the USB prescaler // rcc_set_prescaler(rcc_prescaler prescaler, uint32 divider) // rcc_set_prescaler(RCC_PRESCALER_USB, 1.5); // rcc_set_prescaler(RCC_PRESCALER_USB, 1.5); pinMode(BOARD_LED_PIN, OUTPUT);//setup our alive pin. digitalWrite(BOARD_LED_PIN, ledOff); // If we have a working RTC crystal, we do nothing, this will simply preserve the current time, otherwise with no working RTC crystam we set something sane in the RTC instead. if (!BOARD_HAS_WORKING_RTC_CRYSTAL) { setSaneRTC(); } // Attempt to set up 48MHz and 1x USB clock clockARM48(); numFlashes = 1; for ( int x = 0; x < 10; x++ ) { serial_debug.println("Flash48!"); flashLED(numFlashes); } // Back to 72MHz and 1.5x USB clock clockARM72(); ; numFlashes = 1; for ( int x = 0; x < 10; x++ ) { serial_debug.println("Flash72!"); flashLED(numFlashes); } delay(5000); // If not using deepsleep, you can enable the secondsInterrupt ISR, and wakeup every second. This is less energy efficent obviously. // It has an effect on deepsleep in this sketch, so can not be left configured. // rt.attachSecondsInterrupt(&serviceSecondsInterrupt); //Set the SecondsInterrupt ISR to fire (every second obviously). // Set the inital alarm timer to wakeup now + alarmDelay seconds time_t nextAlarm = (rt.getTime() + alarmDelay); // Calculate from time now. rt.createAlarm(&AlarmFunction, nextAlarm); // Set the alarm to trigger (alarmDelay) later... } void loop() { // Set loop alarm delay (seconds). alarmDelay = 20; //Note: If we use deepsleep, the rest of this code will do nothing since we never actually get the alarmTriggeredFlag set. // The perhaps less than obvious reason for this is that deepsleep restarts the CPU on wakeup, so the flag is cleared. // Check Alarm triggered flag if (alarmTriggeredFlag) { // 3 flashes.. we came back from low power mode without restarting. numFlashes = 3; flashLED(numFlashes); delay(2000); } else { // 8 quick flashes to prove we got here, either at power on or deepsleep power on. numFlashes = 8; flashLED(numFlashes); delay(1000); } // Check seconds interrupt flag if (secInterruptFlag) { // We dont have much time here.. the next interrup is due in 1 second // Do *something* to prove we were here. numFlashes = 1; flashLED(numFlashes); } // rcc_switch_sysclk(RCC_CLKSRC_HSE); // delay(1); // Sleep mode - save some power while we wait for the next alarm. // if deepSleepFlag=true we deepsleep, otherwise, we just sleep sleepMode(deepSleepFlag); deepSleepFlag = !deepSleepFlag; delay(1000); } void serviceSecondsInterrupt() { if (rtc_is_second()) { globSecCnt++; secInterruptFlag = true; toggleLED(); } } void AlarmFunction () { // This appears to be needed here, We find the sys clock is incorrect (slow) after wakeup. // Set up clock, PLL and multiplier anything from RCC_PLLMUL_2..RCC_PLLMUL_16 // Chose RCC_PLLMUL_9 and RCC_PRESCALER_USB, 1.5 for 72MHz fom 8MHz crystal (standard STM32F103 speeds on most clone boards). // Chose RCC_PLLMUL_6 and RCC_PRESCALER_USB, 1 for 48MHz lower power from 8MHz crystal (standard STM32F103 speeds on most clone boards) // rcc_clk_init(rcc_sysclk_src sysclk_src, rcc_pllsrc pll_src, rcc_pll_multiplier pll_mul) // Experimental current draw results typical valuse with a power and blink LEDs lit subtract approx 4mA for the LED, 2mA for the regulator, and say 1mA for the resistance of the leads. . // The halted CPU should be drawing <300uA With the processor halted, the meter was reading 7.9mA, so allowing for the quality of the meter, and other environmental issues. // the results below look pretty accurate.. to within 1mA. Close enough for government work :¬) // These look similar to the ST datasheet http://www.st.com/web/en/resource/technical/document/datasheet/CD00161566.pdf // (Page 42 & 43) // External (RCC_CLKSRC_HSE) 8MHz, no multiplier. // rcc_switch_sysclk(RCC_CLKSRC_HSE); // 8MHz => 16mA -- datasheet value @20 deg. C => between 5.5 and 6mA // Internal (RCC_CLKSRC_HSI) 8MHz x RCC_PLLMUL_x multiplier. // rcc_clk_init(RCC_CLKSRC_HSI, RCC_PLLSRC_HSE , RCC_PLLMUL_2); // 16MHz => 21 mA -- datasheet value => between 10 and 11mA // Default configuration 72MHz // rcc_clk_init(RCC_CLKSRC_HSI, RCC_PLLSRC_HSE , RCC_PLLMUL_9); // 72MHz => 48 mA -- datasheet value => between 40 and 41mA // rcc_clk_init(RCC_CLKSRC_HSI, RCC_PLLSRC_HSE , RCC_PLLMUL_16); // 128MHz => 69 mA -- no data. // rcc_switch_sysclk(RCC_CLKSRC_HSE); rcc_clk_init(RCC_CLKSRC_HSI, RCC_PLLSRC_HSE , RCC_PLLMUL_16); // 128MHz => 69 mA -- Overclocked no STM data available. //rcc_clk_init(RCC_CLKSRC_HSE, RCC_PLLSRC_HSE , RCC_PLLMUL_2); // //rcc_switch_sysclk(RCC_CLKSRC_HSI); // Likewise for the USB prescaler // rcc_set_prescaler(rcc_prescaler prescaler, uint32 divider) // rcc_set_prescaler(RCC_PRESCALER_USB, 1.5); // rcc_set_prescaler(RCC_PRESCALER_USB, 1.5); alarmTriggeredFlag = true; // We get here when the alarm triggers. // We have all the time in the world in here, till we set the next alarm and exit. numFlashes = 4; flashLED(numFlashes); //Note: these flashes are at whichever clock speed we chose above, The milis() will therefore only be millis() if the clock is 72 mHz delay(3000); // Wait long enough to see the current reading on the multimeter. At 128MHz this will be pretty brief, but at 8MHz it will take forever :¬) //Reset alarm to trigger another interrupt in alarmDelay seconds... time_t now = rt.getTime(); rt.setAlarmTime(now + alarmDelay); } void toggleLED () { ledOff = !ledOff; digitalWrite(BOARD_LED_PIN, ledOff); } // Set a relatively sane RTC time to work from if there is no battery or RTC crystal fitted. void setSaneRTC() { // Set the RTC time to 12:45:00 18th Oct 2015 using a tm struct. // see http://www.cplusplus.com/reference/ctime/tm/ time_tm.tm_hour = 12; time_tm.tm_min = 45; time_tm.tm_sec = 0; time_tm.tm_mday = 18; time_tm.tm_mon = 10; time_tm.tm_year = 115;// Per standard C "struct tm" ... years since 1900 rt.setTime(&time_tm); } // Quick (N times) flashes on the LED // Timing will be in mS *only* if the processor clock is running at the correct rate. void flashLED(int numFlashes) { int flashLen = 80; //mS ? ledOff = true; if (numFlashes > 0) { for (int i = 0 ; i < numFlashes; i++ ) { for (int j = 0; j < 2; j++) { toggleLED(); delay(flashLen); } } } } void sleepMode(bool deepSleepFlag) { // Clear PDDS and LPDS bits PWR_BASE->CR &= PWR_CR_LPDS | PWR_CR_PDDS | PWR_CR_CWUF; // Set PDDS and LPDS bits for standby mode, and set Clear WUF flag (required per datasheet): PWR_BASE->CR |= PWR_CR_CWUF; PWR_BASE->CR |= PWR_CR_PDDS; // Enable wakeup pin bit. PWR_BASE->CR |= PWR_CSR_EWUP; // Low-power deepsleep bit. // PWR_BASE->CR |= PWR_CR_LPDS; // System Control Register Bits. See... // http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0497a/Cihhjgdh.html if (deepSleepFlag) { // Experimental // Set Power down deepsleep bit. PWR_BASE->CR |= PWR_CR_PDDS; // Unset Low-power deepsleep. PWR_BASE->CR &= ~PWR_CR_LPDS; // Set sleepdeep in the system control register - if set, we deepsleep and coldstart from RTC or pin interrupts. SCB_BASE->SCR |= SCB_SCR_SLEEPDEEP; } else { // Unset Power down deepsleep bit. PWR_BASE->CR &= ~PWR_CR_PDDS; // set Low-power deepsleep. PWR_BASE->CR |= PWR_CR_LPDS; /* * PWR_CR_PDDS Power down deepsleep. PWR_CR_LPDS Low-power deepsleep. */ // Unset sleepdeep in the system control register - if not set then we only sleep and can wake from RTC or pin interrupts. SCB_BASE->SCR |= SCB_SCR_SLEEPDEEP; // Low-power deepsleep bit. } // Set end Event on Pending bit: - enabled events and all interrupts, including disabled interrupts, can wakeup the processor. // SCB_BASE->SCR |= SCB_SCR_SEVONPEND; // Set SLEEPONEXIT -Indicates sleep-on-exit when returning from Handler mode to Thread mode - // if enabled, we will effectively sleep from the end of one interrupt till the start of the next. // SCB_BASE->SCR |= SCB_SCR_SLEEPONEXIT; // Now go into stop mode, wake up on interrupt asm(" wfi"); } void clockARM48() { // Attempt to set up 48MHz and 1x USB clock rcc_switch_sysclk(RCC_CLKSRC_HSE); rcc_set_prescaler(RCC_PRESCALER_USB, 1); rcc_clk_init(RCC_CLKSRC_HSI, RCC_PLLSRC_HSE , RCC_PLLMUL_6); rcc_clk_init(RCC_CLKSRC_HSI, RCC_PLLSRC_HSE , RCC_PLLMUL_6); rcc_switch_sysclk(RCC_CLKSRC_HSI); //rcc_switch_sysclk(RCC_CLKSRC_PLL); } void clockARM72() { // Attempt to set up 72MHz and 1x USB clock rcc_switch_sysclk(RCC_CLKSRC_HSE); rcc_set_prescaler(RCC_PRESCALER_USB, 1.5); rcc_clk_init(RCC_CLKSRC_HSI, RCC_PLLSRC_HSE , RCC_PLLMUL_9); // rcc_switch_sysclk(RCC_CLKSRC_HSI); rcc_switch_sysclk(RCC_CLKSRC_PLL); }

AG123
Солнце 03 февраля 2019 г., 21:08
Я на самом деле не много анализировал в коде, поэтому я не уверен, что идет не так.
Но обратите внимание, что существует прерывание Systick (), которое запускает каждую миллисекунду. на самом деле используется функцией Dolement ().
Systick () прерывание проснется, что /* System control register (SCB_SCR) */ #define SCB_SCR_SEVONPEND (1U << 4) #define SCB_SCR_SLEEPDEEP (1U << 2) #define SCB_SCR_SLEEPONEXIT (1U << 1)

Купить доску