Перейти к содержанию
    

Как будить проц CxM3 переодически из Sleep?

Снова здарова!

 

Научился таки усыплять проц, КРУТО! :) А вот будить не научился.

Основная задача просыпаться периодически и и опрашивать разную периферию, после чего снова спать. На AVR8 было всё просто, после усыпления проца он мог просыпать по прерыванию таймера2 и продолжать с момента усыпления. Тут же я немного в замешательстве. Вроде как можно будить проц по Событиям и Прерываниям, а пот по факту не получается :(

Подскажите как чего сделать то?

 

Помогите. ПЛЗ.

 

ЗЫ Видать основная проблема в том, что я не до конца разобрался в чём разница между прерываниями и событиями...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Снова здарова!

 

Научился таки усыплять проц, КРУТО! :) А вот будить не научился.

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

 

volatile uint8_t IntWas;
void SysTick_handler()
{
IntWas=1;
}
int main() {
SysTick_Config(10000);
while (1) {
  if (IntWas) {
    IntWas=0;
}
__WFI();
}
}

 

Наверное ещё надо смотреть какой sleep-режим - просто sleep или deepsleep. Также под отладчиком что-то может не работать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что проц после сна выходит в 0ой точке?

После неглубокого сна не от 0, просто продолжит выполнение.

Более глубокие режимы у всех производителей сделаны по разному.

Какой у вас проц?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

STM32F103 я вгоняю в не глубокий сон, т.е. просто wfi/wfe без DEEPSLEEP.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

STM32F103 я вгоняю в не глубокий сон, т.е. просто wfi/wfe без DEEPSLEEP.

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

 

Да.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

другими словами перед сном нужно предварительно запретить все прерывания, чтобы они, не дай бог, не потревожили чуткий сон CxM3?

А есть способ глобально запретить все прерывания? Или надо шерстить по периферии и запрещать, а затем по пробуждению вертать всё назад?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

другими словами перед сном нужно предварительно запретить все прерывания, чтобы они, не дай бог, не потревожили чуткий сон 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);     
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ничё не понял. Если перед __WFI() отключаются прерывания, то как же оно выйдет из сна по прерыванию?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ничё не понял. Если перед __WFI() отключаются прерывания, то как же оно выйдет из сна по прерыванию?

Почитайте по ссылке.

 

Тут кстати у меня самого вопрос: код ИАРовский, при перекомпиляции в GCC он не заработал пока не вставил 2-3 nop-а. Почему?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уже побывал там :) Интересная штуковина. Ну а если не пользоваться этой "фичей", то надо тупо запрещать прерывания?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну а если не пользоваться этой "фичей", то надо тупо запрещать прерывания?

Зачем? После возврата из прерывания ещё раз выполнится команда WFI и проц опять уснёт до следующего прерывания.

 

Или вы хотите чтобы вообще не проснулось никогда? Тогда глубжее засыпать надо.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну смысл такой, что надо просыпаться только по определённым событиям, игнорируя другия, ибо к примеру я не один на шине и прочее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

по определённым событиям, игнорируя другия, ибо к примеру я не один на шине и прочее.

Что за события и шина?

 

PS. В посте по ссылке в сообщении 5 есть таблица, из которой следует, что можно настроить приоритеты прерываний так, чтобы пробуждение происходило только по нужным прерываниям.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Был бы у вас FreeRTOS (или другая прямая ось), то просто напросто в IdleHook поставили бы WFI и никаких больше забот не нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...