Spider 0 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба Снова здарова! Научился таки усыплять проц, КРУТО! :) А вот будить не научился. Основная задача просыпаться периодически и и опрашивать разную периферию, после чего снова спать. На AVR8 было всё просто, после усыпления проца он мог просыпать по прерыванию таймера2 и продолжать с момента усыпления. Тут же я немного в замешательстве. Вроде как можно будить проц по Событиям и Прерываниям, а пот по факту не получается :( Подскажите как чего сделать то? Помогите. ПЛЗ. ЗЫ Видать основная проблема в том, что я не до конца разобрался в чём разница между прерываниями и событиями... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба Снова здарова! Научился таки усыплять проц, КРУТО! :) А вот будить не научился. Основная задача просыпаться периодически и и опрашивать разную периферию, после чего снова спать. volatile uint8_t IntWas; void SysTick_handler() { IntWas=1; } int main() { SysTick_Config(10000); while (1) { if (IntWas) { IntWas=0; } __WFI(); } } Наверное ещё надо смотреть какой sleep-режим - просто sleep или deepsleep. Также под отладчиком что-то может не работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Spider 0 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба А что проц после сна выходит в 0ой точке? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба А что проц после сна выходит в 0ой точке? После неглубокого сна не от 0, просто продолжит выполнение. Более глубокие режимы у всех производителей сделаны по разному. Какой у вас проц? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Spider 0 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба STM32F103 я вгоняю в не глубокий сон, т.е. просто wfi/wfe без DEEPSLEEP. т.е. как я понял из примера выше, достаточно "сотворить" любое прерывание? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба STM32F103 я вгоняю в не глубокий сон, т.е. просто wfi/wfe без DEEPSLEEP. т.е. как я понял из примера выше, достаточно "сотворить" любое прерывание? Да. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Spider 0 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба другими словами перед сном нужно предварительно запретить все прерывания, чтобы они, не дай бог, не потревожили чуткий сон CxM3? А есть способ глобально запретить все прерывания? Или надо шерстить по периферии и запрещать, а затем по пробуждению вертать всё назад? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба другими словами перед сном нужно предварительно запретить все прерывания, чтобы они, не дай бог, не потревожили чуткий сон CxM3? Зачем запрещать? Проснётся и опять уснёт. А есть способ глобально запретить все прерывания? __disable_irq(); Вот ещё пример на тему: void CMU_IRQHandler(void) { /* Clear interrupt flag */ CMU_IntClear(CMU_IF_LFRCORDY); /* Indicate that LFRCO is ready */ lfrcoReady = true; } /***************************************************************************//** * @brief Main function. Enables LFRCO and waits in EM1 until it is ready ******************************************************************************/ int main(void) { /* Chip revision alignment and errata fixes */ CHIP_Init(); /* Enable CMU IRQ when LFRCO is ready */ CMU_IntEnable(CMU_IF_LFRCORDY); /* Enable CMU interrupt vector in NVIC */ NVIC_EnableIRQ(CMU_IRQn); /* Enable LFRCO but do not wait until it is ready */ CMU_OscillatorEnable(cmuOsc_LFRCO, true, false); /* Wait in EM1 until LFRCO is ready. * Disable interrupts first to avoid interrupt executing between lfrcoReady * check and _WFI(); This would have caused the program to get stuck! */ __disable_irq(); while(!lfrcoReady) { __WFI(); /* Pending and enabled IRQs will wake up the CPU, but not go to ISR */ __enable_irq(); /* ISR for any pending and enabled IRQs will be executed after this */ } /* Wait here at the end */ while(1); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Spider 0 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба Ничё не понял. Если перед __WFI() отключаются прерывания, то как же оно выйдет из сна по прерыванию? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба Ничё не понял. Если перед __WFI() отключаются прерывания, то как же оно выйдет из сна по прерыванию? Почитайте по ссылке. Тут кстати у меня самого вопрос: код ИАРовский, при перекомпиляции в GCC он не заработал пока не вставил 2-3 nop-а. Почему? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Spider 0 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба Уже побывал там :) Интересная штуковина. Ну а если не пользоваться этой "фичей", то надо тупо запрещать прерывания? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба Ну а если не пользоваться этой "фичей", то надо тупо запрещать прерывания? Зачем? После возврата из прерывания ещё раз выполнится команда WFI и проц опять уснёт до следующего прерывания. Или вы хотите чтобы вообще не проснулось никогда? Тогда глубжее засыпать надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Spider 0 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба Ну смысл такой, что надо просыпаться только по определённым событиям, игнорируя другия, ибо к примеру я не один на шине и прочее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба по определённым событиям, игнорируя другия, ибо к примеру я не один на шине и прочее. Что за события и шина? PS. В посте по ссылке в сообщении 5 есть таблица, из которой следует, что можно настроить приоритеты прерываний так, чтобы пробуждение происходило только по нужным прерываниям. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 18 октября, 2012 Опубликовано 18 октября, 2012 · Жалоба Был бы у вас FreeRTOS (или другая прямая ось), то просто напросто в IdleHook поставили бы WFI и никаких больше забот не нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться