реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как будить проц CxM3 переодически из Sleep?
Spider
сообщение Oct 17 2012, 13:30
Сообщение #1


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



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

Научился таки усыплять проц, КРУТО! sm.gif А вот будить не научился.
Основная задача просыпаться периодически и и опрашивать разную периферию, после чего снова спать. На AVR8 было всё просто, после усыпления проца он мог просыпать по прерыванию таймера2 и продолжать с момента усыпления. Тут же я немного в замешательстве. Вроде как можно будить проц по Событиям и Прерываниям, а пот по факту не получается sad.gif
Подскажите как чего сделать то?

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

ЗЫ Видать основная проблема в том, что я не до конца разобрался в чём разница между прерываниями и событиями...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 17 2012, 13:38
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Alexey Belyaev @ Oct 17 2012, 16:30) *
Снова здарова!

Научился таки усыплять проц, КРУТО! sm.gif А вот будить не научился.
Основная задача просыпаться периодически и и опрашивать разную периферию, после чего снова спать.


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


Наверное ещё надо смотреть какой sleep-режим - просто sleep или deepsleep. Также под отладчиком что-то может не работать.
Go to the top of the page
 
+Quote Post
Spider
сообщение Oct 17 2012, 13:59
Сообщение #3


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



А что проц после сна выходит в 0ой точке?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 17 2012, 14:11
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Alexey Belyaev @ Oct 17 2012, 16:59) *
А что проц после сна выходит в 0ой точке?

После неглубокого сна не от 0, просто продолжит выполнение.
Более глубокие режимы у всех производителей сделаны по разному.
Какой у вас проц?
Go to the top of the page
 
+Quote Post
Spider
сообщение Oct 17 2012, 14:17
Сообщение #5


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



STM32F103 я вгоняю в не глубокий сон, т.е. просто wfi/wfe без DEEPSLEEP.
т.е. как я понял из примера выше, достаточно "сотворить" любое прерывание?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 17 2012, 14:21
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Alexey Belyaev @ Oct 17 2012, 17:17) *
STM32F103 я вгоняю в не глубокий сон, т.е. просто wfi/wfe без DEEPSLEEP.
т.е. как я понял из примера выше, достаточно "сотворить" любое прерывание?


Да.
Go to the top of the page
 
+Quote Post
Spider
сообщение Oct 17 2012, 14:28
Сообщение #7


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



другими словами перед сном нужно предварительно запретить все прерывания, чтобы они, не дай бог, не потревожили чуткий сон CxM3?
А есть способ глобально запретить все прерывания? Или надо шерстить по периферии и запрещать, а затем по пробуждению вертать всё назад?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 17 2012, 14:46
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Alexey Belyaev @ Oct 17 2012, 17:28) *
другими словами перед сном нужно предварительно запретить все прерывания, чтобы они, не дай бог, не потревожили чуткий сон CxM3?

Зачем запрещать? Проснётся и опять уснёт.

Цитата(Alexey Belyaev @ Oct 17 2012, 17:28) *
А есть способ глобально запретить все прерывания?

__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);    
}
Go to the top of the page
 
+Quote Post
Spider
сообщение Oct 17 2012, 15:07
Сообщение #9


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Ничё не понял. Если перед __WFI() отключаются прерывания, то как же оно выйдет из сна по прерыванию?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 17 2012, 15:54
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Alexey Belyaev @ Oct 17 2012, 18:07) *
Ничё не понял. Если перед __WFI() отключаются прерывания, то как же оно выйдет из сна по прерыванию?

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

Тут кстати у меня самого вопрос: код ИАРовский, при перекомпиляции в GCC он не заработал пока не вставил 2-3 nop-а. Почему?
Go to the top of the page
 
+Quote Post
Spider
сообщение Oct 17 2012, 16:00
Сообщение #11


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Уже побывал там sm.gif Интересная штуковина. Ну а если не пользоваться этой "фичей", то надо тупо запрещать прерывания?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 17 2012, 16:06
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Alexey Belyaev @ Oct 17 2012, 19:00) *
Ну а если не пользоваться этой "фичей", то надо тупо запрещать прерывания?

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

Или вы хотите чтобы вообще не проснулось никогда? Тогда глубжее засыпать надо.
Go to the top of the page
 
+Quote Post
Spider
сообщение Oct 17 2012, 16:37
Сообщение #13


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



Ну смысл такой, что надо просыпаться только по определённым событиям, игнорируя другия, ибо к примеру я не один на шине и прочее.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 17 2012, 17:20
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Alexey Belyaev @ Oct 17 2012, 19:37) *
по определённым событиям, игнорируя другия, ибо к примеру я не один на шине и прочее.

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

PS. В посте по ссылке в сообщении 5 есть таблица, из которой следует, что можно настроить приоритеты прерываний так, чтобы пробуждение происходило только по нужным прерываниям.
Go to the top of the page
 
+Quote Post
kan35
сообщение Oct 18 2012, 15:37
Сообщение #15


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Был бы у вас FreeRTOS (или другая прямая ось), то просто напросто в IdleHook поставили бы WFI и никаких больше забот не нужно.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 10:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01477 секунд с 7
ELECTRONIX ©2004-2016