Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Спящий режим.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Jenya7
Я никогда не пользовался спящим режимом. Но теперь хочу сделать приборчик на батарейке и возник вопрос как правильно пользоваться спящим режимом.
CODE
void main(void)
{
while(1)
{

//interrupt from timer capture compare
if(timer_comp0)
{
timer_comp0 = 0;
ADC_Start(ADC0, adcStartSingle);
//ADC_Start(ADC0, adcStartScan);
}

//interrupt from ADC
if(adc_transfer_complete)
{
adc_transfer_complete = 0;

//do something
}

//interrupt from timer overflow
if(timer_uf)
{
//do something

//EMU_EnterEM1();
//EMU_EnterEM2(false);
}

if (sysFlags&MEAS_MODE)
{

if (sysFlags&PULSE100)
{
//do somrthing
}

if (sysFlags&PULSE1000)
{
//do something
}
}


if (sysFlags&UPDATE_MAIN_COUNTER)
{
//do something
}

//interrupt from LEUART-RX
if( rx_packet_recieved)
{
//do something
}

EMU_EnterEM2(true);

} //while

/* Never going to reach this statement. */
return 0;
}


Если я в конце вхожу в спящий режим то программа перестает правильно работать хотя прерывания от таймера должны выводить из спящего режима.
Golikov A.
часто после выхода из режимов энергосбережения необходимо повторно проинициализировать некоторые модули...
Jenya7
Цитата(Golikov A. @ Dec 4 2014, 15:24) *
часто после выхода из режимов энергосбережения необходимо повторно проинициализировать некоторые модули...

ничего такого в тех документации не написано.
Golikov A.
тоды ой...
я могу еще пару гаданий изобразить, но если вы укажете что за процессор, дело возможно пойдет быстрееsm.gif
Jenya7
Цитата(Golikov A. @ Dec 4 2014, 18:46) *
тоды ой...
я могу еще пару гаданий изобразить, но если вы укажете что за процессор, дело возможно пойдет быстрееsm.gif

процессор не очень ходовой EFM32TG842 но грозятся малым потреблением
_Артём_
Цитата(Jenya7 @ Dec 4 2014, 10:54) *
Если я в конце вхожу в спящий режим то программа перестает правильно работать хотя прерывания от таймера должны выводить из спящего режима.

Смотря какого таймера. LETIMER используете или RTC? Другие вывести не смогут.

Цитата(Jenya7 @ Dec 4 2014, 16:14) *
ничего такого в тех документации не написано.

Как же не написано? При входе в EM2 выключается кварц (если был включен). На выходе МК работает от внутреннего RC.
Jenya7
Цитата(_Артём_ @ Dec 4 2014, 19:39) *
Смотря какого таймера. LETIMER используете или RTC? Другие вывести не смогут.


Как же не написано? При входе в EM2 выключается кварц (если был включен). На выходе МК работает от внутреннего RC.

У меня прерывания от LETIMER. Да но в ЕМ2 низкочастотный кварц работает а у меня LETIMER подключен к внешнему часовому кварцу.
_Артём_
Цитата(Jenya7 @ Dec 4 2014, 18:02) *
У меня прерывания от LETIMER.

По вашему коду этого не скажешь.

Цитата(Jenya7 @ Dec 4 2014, 18:02) *
Да но в ЕМ2 низкочастотный кварц работает а у меня LETIMER подключен к внешнему часовому кварцу.

А в EM0/EM1 прерывания от LETIMER-а происходят? Они вообще разрешены?
Jenya7
Цитата(_Артём_ @ Dec 4 2014, 20:26) *
По вашему коду этого не скажешь.


А в EM0/EM1 прерывания от LETIMER-а происходят? Они вообще разрешены?

1. в коде нет конфигурции таймера но вообще это так
Код
void LETIMER_Setup(void)
{
  /* Enable necessary clocks */
    CMU_ClockSelectSet(cmuClock_LETIMER0, cmuSelect_LFXO);
   CMU_ClockEnable(cmuClock_LETIMER0, true);

  LETIMER_CompareSet(LETIMER0, 0, LOAD0);


  /* Set configurations for LETIMER 0 */
  const LETIMER_Init_TypeDef letimerInit =
  {
  .enable         = true,                   /* Start counting when init completed. */
  .debugRun       = false,                  /* Counter shall not keep running during debug halt. - false */
  .rtcComp0Enable = false,                  /* Don't start counting on RTC COMP0 match. */
  .rtcComp1Enable = false,                  /* Don't start counting on RTC COMP1 match. */
  .comp0Top       = false,                  /* Load COMP0 register into CNT when counter underflows. COMP0 is used as TOP else TOP = 0xFFFF */
  .bufTop         = false,                  /* Don't load COMP1 into COMP0 when REP0 reaches 0. */
  .out0Pol        = 0,                      /* Idle value for output 0. */
  .out1Pol        = 0,                      /* Idle value for output 1. */
  .ufoa0          = letimerUFOANone,         /* PWM output on output 0 */
  .ufoa1          = letimerUFOANone,       /* Pulse output on output 1*/
  .repMode        = letimerRepeatFree       /* Count until stopped */
  };

    /* Initialize LETIMER */
    LETIMER_Init(LETIMER0, &letimerInit);

     /* Enable underflow interrupt */
    LETIMER_IntEnable(LETIMER0, LETIMER_IF_COMP0 | LETIMER_IF_UF);

    /* Enable LETIMER0 interrupt vector in NVIC*/
    NVIC_EnableIRQ(LETIMER0_IRQn);
}


2. разрешены до ЕМ2 включительно.
KnightIgor
Цитата(Jenya7 @ Dec 4 2014, 17:41) *
1. в коде нет конфигурции таймера но вообще это так
Код
void LETIMER_Setup(void)
{
  /* Enable necessary clocks */
    CMU_ClockSelectSet(cmuClock_LETIMER0, cmuSelect_LFXO);
   CMU_ClockEnable(cmuClock_LETIMER0, true);

  LETIMER_CompareSet(LETIMER0, 0, LOAD0);
.....
}


2. разрешены до ЕМ2 включительно.

Если указаный код это все, что есть, и Вы больше ничего не утаили, то явно не хватает в самом начале:
CMU_OscillatorEnable(cmuOsc_LFXO, true, true);
Jenya7
Цитата(KnightIgor @ Dec 6 2014, 14:54) *
Если указаный код это все, что есть, и Вы больше ничего не утаили, то явно не хватает в самом начале:
CMU_OscillatorEnable(cmuOsc_LFXO, true, true);

я конфигурирую клоки в другом файле. 20 кило кода я не могу втиснуть в пост.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.