|
Как будить проц CxM3 переодически из Sleep? |
|
|
|
Oct 17 2012, 13:30
|

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

|
Снова здарова! Научился таки усыплять проц, КРУТО!  А вот будить не научился. Основная задача просыпаться периодически и и опрашивать разную периферию, после чего снова спать. На AVR8 было всё просто, после усыпления проца он мог просыпать по прерыванию таймера2 и продолжать с момента усыпления. Тут же я немного в замешательстве. Вроде как можно будить проц по Событиям и Прерываниям, а пот по факту не получается  Подскажите как чего сделать то? Помогите. ПЛЗ. ЗЫ Видать основная проблема в том, что я не до конца разобрался в чём разница между прерываниями и событиями...
|
|
|
|
|
Oct 17 2012, 13:38
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Alexey Belyaev @ Oct 17 2012, 16:30)  Снова здарова! Научился таки усыплять проц, КРУТО!  А вот будить не научился. Основная задача просыпаться периодически и и опрашивать разную периферию, после чего снова спать. Код volatile uint8_t IntWas; void SysTick_handler() { IntWas=1; } int main() { SysTick_Config(10000); while (1) { if (IntWas) { IntWas=0; } __WFI(); } } Наверное ещё надо смотреть какой sleep-режим - просто sleep или deepsleep. Также под отладчиком что-то может не работать.
|
|
|
|
|
Oct 17 2012, 14:46
|
Гуру
     
Группа: Свой
Сообщений: 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); }
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|