Таймер и прерывание, используемые вместе, чтобы покинуть спящий режим

Leonardo_evaldt
Чт 14 сентября 2017 г. 6:35 утра
Привет, ребята.

Любой здесь знает сайт или ссылку, которая показывает код, чтобы поместить Maple Mini в режим сна в спящем режиме? Я хочу поместить доску в режим спящего.

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

Спасибо всем.

victor_pv
Чт 14 сентября 2017 г. 13:02
На форуме есть несколько сообщений об этом. Пожалуйста, сделайте поиск сна и в режиме ожидания.
Если у вас нет более конкретного вопроса, я заблокирую этот ветку, так как поиск ответит на него. Если у вас есть более конкретный вопрос, пожалуйста, обновите первый пост, и его заголовок после поиска того, что уже доступно.

Правила и процедуры форума

Leonardo_evaldt
Чт 14 сентября 2017 г. 18:04
Дорогой Виктор,

Есть много сообщений. Но ни один из них не отвечает на мой вопрос и не дает мне нужен ANWSER.
Как я уже сказал, я не профессиональный инженер прошивки. Я не понимаю 90% из них. Мой вопрос: если кто -то знает о готовой библиотеке, которую я могу использовать. Об этом много сообщений, но для Arduino. Я пытался скомпилировать некоторых, но мой процессор не принимает.
Так что я ценю, если вы сохраните этот пост, потому что мне действительно нужен этот ANWSER.

С наилучшими пожеланиями.

victor_pv
Чт 14 сентября 2017 г., 19:32
Леонардо, я нашел ссылку на библиотеку менее чем за 3 минуты. Вы в основном просите кого -нибудь еще провести поиск вас.

Leonardo_evaldt
Чт 14 сентября 2017 г. 9:19 вечера
Виктор,

Опять же, все темы, которые я нашел. Мне нужна тема, которая предоставляет мне библиотеку, которая дает мне возможность положить Maple Mini в спящий режим с двумя способами оставить ее: прерыванием или по таймеру. Оба в одном и том же коде.
Возможно, вы говорите об этой теме

http: // www.STM32duino.com/viewtopic.PHP ... EEP#P29094

где участник «AG123» дает ссылку на код, который (я думаю, но я не уверен) создает часы таймера, прикрепленные к системным часам, и включить прерывания (опять же, я не профессиональный инженер прошивки, поэтому я не надеваю ' T понимать весь код). Мне не помогает.

Или первые вы говорите об этой теме

http: // www.STM32duino.com/viewtopic.PHP ... ilit = сон

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

После нескольких часов охоты в Интернете я нашел этот документ на других веб -сайте форумов.

http: // www.ул.com/content/ccc/resource/ ... 228163.PDF

Этот документ очень дидактно объясняет об управлении энергопотреблением в теме 2.5.1. Я все еще читаю это. Но я все еще прошу вас не удалять и не блокировать этот пост, потому что я не знаю, действительно ли документ решит мою проблему.

Спасибо за понимание.

victor_pv
Чт 14 сентября 2017 г., 21:32
Вы видели этот?
http: // www.STM32duino.com/viewtopic.PHP ... EP+библиотека

Эта тема - одна из первых, которые я получаю в поисках «библиотеки сна».

Вам также необходимо прочитать таблицу данных STM32F103, потому что вам нужно понять, как и что может разбудить процессор. Вам не нужна библиотека, чтобы разбудить его, просто включите любое прерывание или событие, которое вы хотите использовать, чтобы разбудить его, а затем заснуть с WFI или WFE. Библиотеки об отключении определенных периферийных устройств или часов перед сном.
Пожалуйста, обновите заголовок потока и первое сообщение, чтобы быть более конкретным.
«Maple Mini - режим сна» совсем не конкретный и противоречит правилам.

Leonardo_evaldt
Чт 14 сентября 2017 г. 22:35
Да, я сделал.
Акобо использовал эту странную функцию “adc_disable_all ();” Отключить АЦП и этот SetGpiomodetoAllpins (gpio_input_analog), чтобы отключить GPIO. Я не сделал’это точно понимаю, как работают эти функции, но, в моем случае, я не могу использовать первый. Мое прерывание использует АЦП, чтобы проснуться.

После многого оборудования обсуждается, Acobo покажите список функций, чтобы отключить все блоки внутри процессора. Но прерывание АЦП тоже будет отключено. Это не решает мою проблему. Мне тоже нужно позволить прерываться, чтобы разбудить мою доску. Просто позволить ADC Enable (rcc_clk_enable (rcc_adc1)) не означает, что прерывание, прикрепленное к нему.
Адаптируя мой первоначальный вопрос к этой ситуации, это будет выглядеть так: “Как я могу использовать эту функцию wfi вместе с функцией sleepandwakeup, чтобы моя плата могла проснуться после заранее определенного времени или прерывания”?
В своем первом посте я прошу библиотеку, потому что думал, что у кого -то может быть код, который собрал WFI и SleepandWakeup.

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

victor_pv
Чт 14 сентября 2017 г., 11:00 вечера
Название теперь имеет больше смысла, «Maple and Sleep» просто очень широкий.
Я до сих пор не понимаю, как ты хочешь проснуться. Вы говорите, что хотите, чтобы прерывание булавки разбудила MCU, для меня это означает, что PIN -код, переключающий от высокого до низкого или от низкого до высокого, это прерывание Exti, но вы упоминаете АЦП. Вы хотите проснуться, когда аналоговый вход достигает определенного аналогового уровня?

Leonardo_evaldt
Чт 14 сентября 2017 г. 11:22
[victor_pv - Чт 14 сентября 2017 г. 21:00] - Название теперь имеет больше смысла, «Maple and Sleep» просто очень широкий.
Хороший : D. Спасибо за эту помощь. Я здесь новичок. Я все еще учусь.
[victor_pv - Чт 14 сентября 2017 г. 21:00] - Я до сих пор не понимаю, как ты хочешь проснуться. Вы говорите, что хотите, чтобы прерывание булавки разбудила MCU, для меня это означает, что PIN -код, переключающий от высокого до низкого или от низкого до высокого, это прерывание Exti, но вы упоминаете АЦП. Вы хотите проснуться, когда аналоговый вход достигает определенного аналогового уровня?
Что -то вроде этого. Прерывание прикреплено в цифровом штифте. Но я использую АЦП и некоторые транзисторы, чтобы сигнал запустил цифровой штифт прерывания. Итак, мой АЦП должен работать.
Я думаю, что, используя этот список «Acobo» Disable (но без RCC_CLK_DISABL. Но проблема в том, как использовать функцию SleepandWakeup с включенным прерыванием? Потому что, как я понял, SleepandWakeup просто разбудите борд, когда таймер заканчивается, а WFI разбудит доску, только когда iterrupt уводит цифровой штифт. Мне нужно оба пробуждения в одной и той же функции.

victor_pv
Пт 15 сентября 2017 г. 12:21
Прочитайте код sleepandwakeup (), потому что он показывает, что он делает, и любое включенное прерывание может разбудить доску.
Я до сих пор не понимаю, что вы делаете с АЦП...

Leonardo_evaldt
Пт 15 сентября 2017 г. 1:45 утра
Не волнуйся. АЦП сейчас не важна. Я могу проверить без этого.
Я читаю функцию sleepandwakeup. Он использует ASM ("wfi"). Итак, мне кажется, что эта функция также использует прерывания, чтобы покинуть режим сна.
Поэтому я решил проверить "stm32_periodic_stop.INO "Exemple. Я добавил тест на мигание. Проблема в том, что светодиод не мигает.
Это код:
#include #include RTClock rt(RTCSEL_LSE); long int alarmDelay = 5; void setup() { // Disable ADC to save power adc_disable_all(); pinMode(LED_BUILTIN, OUTPUT); // Set all GPIO pins to Analog input to save power (this disables pretty // much all I/O incl. Serial) setGPIOModeToAllPins(GPIO_INPUT_ANALOG); sleepAndWakeUp(STOP, &rt, alarmDelay); } void loop() { digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW delay(1000); sleepAndWakeUp(STOP, &rt, alarmDelay); }

Rogerclark
Пт 15 сентября 2017 г. 3:40
После остановки я могу услышать этот звук, когда вы отключите USB -порт от вашего ПК Операция USB требует от MCU постоянно обрабатывать запросы ISR с хост -ПК.

Сон отключит USB.

Вы можете попробовать назвать сериал.Begin () снова, когда пробуждается от сна, но нет никакой гарантии, что это работает, потому что при питании через USB не нормально спать MCU как бессмысленный, поскольку энергопотребление не будет проблемой

Leonardo_evaldt
Пт 15 сентября 2017 г. 4:43
[Rogerclark - Пт 15 сентября 2017 г. 3:40] - Сон отключит USB.
Я подозревал. Спасибо за подтверждение, Роджер.
[Rogerclark - Пт 15 сентября 2017 г. 3:40] - Вы можете попробовать назвать сериал.Begin () снова, когда пробуждается от сна, но нет никакой гарантии, что это работает, потому что при питании через USB не нормально спать MCU как бессмысленный, поскольку энергопотребление не будет проблемой
Извините, я не понимаю. Я не использую терминал. Я программирую вспышку. Как я должен назвать сериал.начинать()? Могу ли я положить сериал.begin () inside loop () {...} Так:
loop(){ ... sleepAndWakeUp(STOP, &rt, alarmDelay); Serial.begin(); ... }

Rogerclark
Пт 15 сентября 2017 г. 4:57 утра
Глядя на существующий код ...

Вам нужно было бы назвать сериал.End (), а затем вызовать серийный.начинать()

Сразу после того, как вы кодируете пробуждение от сна

И... Это может работать только на плате Maple Mini, которая имеет правильное аппаратное обеспечение сброса USB

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

Leonardo_evaldt
Пт 15 сентября 2017 г. 5:07 утра
[Rogerclark - Пт 15 сентября 2017 г. 4:57] - Глядя на существующий код ...

Вам нужно было бы назвать сериал.End (), а затем вызовать серийный.начинать()

Сразу после того, как вы кодируете пробуждение от сна
Так?
loop(){ ... Serial.end(); sleepAndWakeUp(STOP, &rt, alarmDelay); Serial.begin(); ... }

Rogerclark
Пт 15 сентября 2017 г. 5:29 утра
Нет

Больше похоже на

Вам нужно назвать сериал.End () перед сном и позвоните в сериал.начинай (), когда вы снова просыпаетесь.

Но... Это вряд ли будет работать на чертеже

Leonardo_evaldt
Пт 15 сентября 2017 г. 5:41 утра
[Rogerclark - Пт 15 сентября 2017 г. 5:29 утра] - Нет

Больше похоже на

Вам нужно назвать сериал.End () перед сном и позвоните в сериал.начинай (), когда вы снова просыпаетесь.

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


Настраивать(){...}

петля(){
...
Сериал.конец();
SleepandWakeup (остановите, &RT, AlarmDelay);
Сериал.начинать();
...
}

Я пытался, но не работает. Код заблокирован после SleepandWakeup (остановите, &rt, armerdelay).
Я также попробовал это

Настраивать(){...}

петля(){
...
Сериал.конец();
// sleepandwakeup (остановите, &RT, AlarmDelay);
Сериал.начинать();
...
}

Код работает правильно (светодиод в моем свете доски после этой части кода), но сериал не подчиняется сериалу.начинать(). Это остается отключенным.
Что я делаю не так?

Rogerclark
Пт 15 сентября 2017 г. 5:53 утра
Ядро не имеет кода, который поддерживает повторную секунду USB на досках, кроме Maple Mini.
И даже на Maple Mini я никогда не пытался этого сделать.

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

Leonardo_evaldt
Пт 15 сентября 2017 г. 6:07
[Rogerclark - Пт 15 сентября 2017 г. 5:53 утра] - Ядро не имеет кода, который поддерживает повторную секунду USB на досках, кроме Maple Mini.
И даже на Maple Mini я никогда не пытался этого сделать.

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

Но даже 'stm32_periodic_stop "Exemple не работает на моем ПК. Он останется запертым на SleepandWakeup (остановите, &RT, тревога).
Я, конечно, делаю что -то не так.

Пито
Пт 15 сентября 2017 г. 6:29 утра
«Ядро» - это «база», которую вы получаете при составлении/построении двоичного файла с помощью STM32Duino (IE Libmaple's или Generic или Daniel's Generic или другой набор используемых библиотек, также называемых здесь «ядрами»). «Ядро» включает в себя основные процедуры, которые работают в вашем коде в фоновом режиме - например, Serial, Serialusb, Systick (Millis (), Micros ()), прерываниях обработки и другие вещи (SPI, i2c, таймеры..), которые собираются в ваш код при необходимости..

Re -Enumeration - USB при подключении хоста к устройству запускает сложный процесс, где устройство (BluePill или Maplemini или другая плата) идентифицирует себя, оно готово к сотрудничеству на шине USB с хостом.
У платы Maplemini есть специальная схема, которая сообщает Host (то есть ваш компьютер), он готов к сотрудничеству, и она делает его автоматически. У других плат нет этой функции, поэтому вам нужно нажать кнопку сброса или подключить/отключить USB, например,. Вы также можете добавить схему в BluePill (2 резистора и транзистор PNP/PMOSFET).

Leonardo_evaldt
Пт 15 сентября 2017 г. 7:14 утра
Спасибо, Пито. Это проясняет много вещей. Итак, Роджер пытается помочь мне повторно размер сериала после того, как я потерял связь. Что -то в ядре могло бы это сделать. Мне просто нужно узнать, как.
Это понятно сейчас.
Но проблема отключения серийного серийного отключения не моя самая большая проблема. Я все еще пытаюсь выяснить, почему моя доска не покидает режим сна.
Я пытаюсь запустить пример отсюда

https: // github.com/chacal/stm32sleep

В Exemple STM32_Periodic_standby
#include #include RTClock rt(RTCSEL_LSE); long int alarmDelay = 5; void setup() { // We have just started or woken up from sleep! System clock is set to 72MHz HSE. delay(1000); sleepAndWakeUp(STANDBY, &rt, alarmDelay); } void loop() { } // This is never run

Rogerclark
Пт 15 сентября 2017 г. 10:32 утра
Это не поможет с пробуждением от сна, но смотрит в код..

Это то, что вызывается в предварительной инициализации - перед настройкой () вызовом в эскизе Arduino

//Reset the USB interface on generic boards - developed by Victor PV gpio_set_mode(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit, GPIO_OUTPUT_PP); gpio_write_bit(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit,0); for(volatile unsigned int i=0;i<512;i++);// Only small delay seems to be needed, and USB pins will get configured in Serial.begin gpio_set_mode(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit, GPIO_INPUT_FLOATING); Serial.begin();

victor_pv
Пт 15 сентября 2017 г. 13:35
Леонардо, этот код использует RTC, чтобы проснуться через определенное время, у вас есть какой -либо кристалл, подключенный к контактам генератора RTC? Если вы не знаете, что это такое, у вас его нет.
MCU не проснется с тревогой RTC, если RTC не работает.

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

Эта ветка сейчас длится 3 страницы и перешла от «Maple and Sleep» к тому, как разбудить MCU, до того, почему прерывание RTC не работает, затем «что такое rtc chrystal»...
В моем первом посте я связал вас с правилами форума, которые вы не прочитали, иначе вы бы знали, что публикация смутного названия против правила.
Во втором я посоветовал вам прочитать справочное руководство, которое вы не прочитали ни иначе.

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

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

Leonardo_evaldt
Пн 18 сентября 2017 г. 8:41
[victor_pv - Пт 15 сентября 2017 г. 13:35] - Если вы просто хотите проверить этот код, вы можете попробовать вместо этого использовать внешний PIN -код, на форуме есть примеры о том, чтобы заставить MCU спать и разбудить его с помощью кнопки в борту.
Спасибо, я попробую как можно скорее.

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

Я не эксперт по инженеру прошивки. Я просто инженер по разработке оборудования, который пытается немного понять разработку прошивки, чтобы заставить мою доску работать. У моего оборудования нет кристалла. Я не использую ни одного конденсатора развязки на Maple Mini или какого -либо дополнительного оборудования, чтобы помочь Maple Mini с часами. Я просто использую часы из Maple Mini. У меня есть GPS и модули GPRS, схема защиты (в электрической системе автомобиля есть много переходных процессов нагрузки), регулятор понижения переключения, некоторых ампопа и многих транзисторов (рисунки в этом посте Atacheeed). На самом деле, чтобы проверить библиотеку, я использую только Maple Mini (я отделил все свое оборудование). Я все время использую задержку (), поэтому я думаю, что часы Maple Mini работают хорошо. В своем первом посте я искал библиотеку, которая использует спящий режим. Я уже получил библиотеку. Теперь я просто пытаюсь понять, почему библиотека, которая предположительно должна работать, не работает на моем доске.
Я уже прочитал весь документ ST, связанный с этой прошивкой. Но не будучи инженером прошивки, его трудно понять без какой -либо помощи.
Мой последний пост я сказал, что библиотека (точно так же, как доступна на ссылке https: // github.com/chacal/stm32sleep) не работает. Я разоблачил все поведение моего совета во время выполнения и спросил, знает ли кто -нибудь, почему библиотека ведет себя таким образом. Если вы хотите, я могу удалить эту ветку и создать новый с этим вопросом и с соответствующим названием. Как вы думаете, это лучше?

victor_pv
Пн 18 сентября 2017 г. 13:54
Леонардо, вам не нужно читать документы прошивки, чтобы понять аппаратные возможности MCU.
Два человека уже поддали вам проверку о RTC, и я специально задал вам несколько вопросов о RTC, вернитесь ко мне в предыдущий пост и прочитайте о RTC в руководстве Refecne. Не имеет ничего общего с основными часами в MCU, работающих или не работает.

Эдогальдо
Ср 20 сентября 2017 г. 11:04
[Leonardo_evaldt - Пт 15 сентября 2017 г., 7:14 утра] - Спасибо, Пито. Это проясняет много вещей. Итак, Роджер пытается помочь мне повторно размер сериала после того, как я потерял связь. Что -то в ядре могло бы это сделать. Мне просто нужно узнать, как.
Это понятно сейчас.
Но проблема отключения серийного серийного отключения не моя самая большая проблема. Я все еще пытаюсь выяснить, почему моя доска не покидает режим сна.
Я пытаюсь запустить пример отсюда

https: // github.com/chacal/stm32sleep

В Exemple STM32_Periodic_standby
#include #include RTClock rt(RTCSEL_LSE); long int alarmDelay = 5; void setup() { // We have just started or woken up from sleep! System clock is set to 72MHz HSE. delay(1000); sleepAndWakeUp(STANDBY, &rt, alarmDelay); } void loop() { } // This is never run

Rogerclark
Ср 20 сентября 2017 г. 20:58
Спасибо e.

Мне приходилось на голову, что OP, возможно, использовал MM, и я не думал, что у него был внешний кристалл 32 кГц.

Использование LSI - это интересная работа, но я не пробовал ее, и, конечно, время для меня неточнее, если вы не примените калибровку в коде
эн.глин. Я знаю, что Nordic Semi NRF5 SDK калибрует свой сонный.
Он также кратко просыпается каждые несколько секундов для повторного калибровки, чтобы обеспечить точное хронометрирование.

Эдогальдо
Пт 22 сентября 2017 г. 8:32 утра
[Rogerclark - Ср 20 сентября 2017 г. 20:58] - Спасибо e.

Мне приходилось на голову, что OP, возможно, использовал MM, и я не думал, что у него был внешний кристалл 32 кГц.

Использование LSI - это интересная работа, но я не пробовал ее, и, конечно, время для меня неточнее, если вы не примените калибровку в коде
эн.глин. Я знаю, что Nordic Semi NRF5 SDK калибрует свой сонный.
Он также кратко просыпается каждые несколько секундов для повторного калибровки, чтобы обеспечить точное хронометрирование.
Привет, Роджер, вероятно, если необходима точность, для такого проекта синяя таблетка может быть лучшим выбором уважения к Maple Mini, поскольку он также имеет также LSE.

Ура, e.

Сильная сила в MM