Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91SAM7S64 PowerDown
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
algidim
Товарищи подскажите, пожалуйста как AT91SAM7S64 перевести в режим PowerDown с минимальным потреблением, чтобы из него только RESETom можно было пробудить. Делаю так :

// Частота работы ядра 500 кГц
pPMC->PMC_MCKR = AT91C_PMC_CSS_SLOW_CLK;
while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));

// Отключение внешнего генератора
pPMC->PMC_MOR &= (!AT91C_CKGR_MOSCEN );

// Перевод в низкопотребляемый режим встроенного линейного стабилизатора
AT91F_VREG_Enable_LowPowerMode(pSYS);

// Запрещение переферийного тактирования
AT91C_BASE_PMC->PMC_PCDR=0xFFFFFFFC;

// Запрет системного тактирования
AT91C_BASE_PMC->PMC_SCDR = AT91C_PMC_UDP|AT91C_PMC_PCK|AT91C_PMC_PCK0|AT91C_PMC_PCK1|AT91C_PMC_PCK2;

После выполнения этого кода у меня потребление 1 ma. Может чего не так или в другой последовательности нужно выполнить ? В pdf написано, что при температуре 25 градусов должен потреблять 4 до 15 мКа. Я пробую на плате OLIMEX sam7-p64 выпаял все детали, которые могли потреблять большой ток, возможно что-то упустил, пока найти не могу. Питаю от внешнего стабилизированного блока питания 3,3 вольта. На всех выводах порта лог 1. Для меня потребление мк очень важно, делаю прибор с батарейным питанием. Решил попробовать его, потому что нужен USB и его цена не высока, а так высокой производительности от него мне не требуется.
aaarrr
Цитата(algidim @ May 22 2009, 12:06) *
// Перевод в низкопотребляемый режим встроенного линейного стабилизатора
AT91F_VREG_Enable_LowPowerMode(pSYS);

// Запрещение переферийного тактирования
AT91C_BASE_PMC->PMC_PCDR=0xFFFFFFFC;

Будет логичнее поменять эти два пункта местами.

Цитата(algidim @ May 22 2009, 12:06) *
Я пробую на плате OLIMEX sam7-p64 выпаял все детали, которые могли потреблять большой ток, возможно что-то упустил, пока найти не могу.

Errata на PIO смотрели? Нет ли у Вас пинов, настроенных на вход, и подтянутых встроенным pull-up'ом?
alexvm
Вот вариант который я делал для усыпления AT91SAM7S256:

// перевод свободных пинов на выход в 0, к примеру PA5, PA10, PA22 и т.д. (один "неправильный" вывод на ток потребления влияет очень сильно)
AT91F_PIO_CfgOutput (AT91C_BASE_PIOA, AT91C_PIO_PA5|AT91C_PIO_PA10|AT91C_PIO_PA22);
*AT91C_PIOA_CODR = (AT91C_PIO_PA5|AT91C_PIO_PA10|AT91C_PIO_PA22);

// USB transceiver disabled (enabled by default):
// если USB не используется, DDM и DDP - на землю.
*AT91C_PMC_PCER = ((unsigned int) 1 << AT91C_ID_UDP); // enable clock UDP for USB transceiver disabled
AT91F_UDP_DisableTransceiver(AT91C_BASE_UDP);
*AT91C_PMC_PCDR = ((unsigned int) 1 << AT91C_ID_UDP); // disable clock UDP

// Disable All Interrupt
AT91F_AIC_DisableIt(AT91C_BASE_AIC, 0xFFFFFFFF);

// Analog-to-Digital Converter de-activated.
AT91F_ADC_CfgModeReg(AT91C_BASE_ADC, AT91C_ADC_SLEEP_MODE);

// Other System Clock Disable.
AT91F_PMC_CfgSysClkDisableReg(AT91C_BASE_PMC, AT91C_PMC_UDP | AT91C_PMC_PCK0 | AT91C_PMC_PCK1);

// All peripheral clocks de-activated.
AT91F_PMC_DisablePeriphClock (AT91C_BASE_PMC, 0xFFFFFFFB); // кроме PIOA (для клавиатуры нужно было)

// Selection Slow Clock~32kHz for Master Clock ~32kHz/2 (Master Clock Prescaler=2) --> (~ -7.4mA_3.3v относительно MCK~45MHz)
AT91F_PMC_CfgMCKReg (AT91C_BASE_PMC, AT91C_PMC_CSS_SLOW_CLK);
while(!(AT91F_PMC_GetStatus(AT91C_BASE_PMC) & AT91C_PMC_MCKRDY));

// Disable PLL (MUL=0) (~ -2mA_3.3v)
AT91F_CKGR_CfgPLLReg(AT91C_BASE_CKGR, 0);

// Disable Main Oscillator (~ -0.3mA_3.3v)
AT91F_CKGR_DisableMainOscillator(AT91C_BASE_CKGR);

// Enable PIOA interrupt
*AT91C_AIC_IECR = ((unsigned int) 1 << AT91C_ID_PIOA); (для клавиатуры)

// Voltage regulator is in Low-power mode.
*AT91C_VREG_MR|= AT91C_VREG_PSTDBY; // 1.65V (~ -30uA_3.3v)

// Go the Processor in IDLE (DEEP) MODE --> STOP Command. (во время отладки лучше закомментировать....)
// The Processor Idle Mode is achieved by disabling the Processor Clock, which is automatically re-enabled by any enabled fast or normal interrupt, or by the reset.
*AT91C_PMC_SCDR = AT91C_PMC_PCK; // disable Processor Clock (Idle Mode) (~ -2.3mA_3.3v_относительно MCK=RC/2~32kHz/2)

В общем всё что можно выжать для Ultra low power: onto 3.3V_AMP1 =34.3uA и onto 1.8V_AMP2 = 4.0uA, см. стр. 553 AT91SAM7S Series Preliminary.pdf
У меня получалось чуть более 40uA на AT91SAM7S256 с тактированием порта для обработки прерывания от клавиатуры (прерывания тактирование на порт не отключал).
Причём при 500Hz реакция на клавиатуру была тормознутая поэтому делитель оставил равным 2 для Slow Clock.
А разница в токе потребления при работе PIOA практически незаметна при Slow Clock / 64 или на 2 (I_PIO Controller =12uA/MHz).
Пробовал ещё вариант с __ramfunc PowerDownAbsolute, но в RAM по энергопотреблению разницы не заметил на пониженной частоте, да и
в обработке прерываний приходилось вызываемые функции в RAM переносить, а она то не резиновая smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.