nameless
Aug 25 2006, 11:39
Ну, с периферией все ясно....почти, а как быть с System Peripherals (как понял FLASH и RAM) есть ли проверенные приемы отключения и т.п.
Вот таким кодом я "глушил" Кит до очень маленького потребления. Естественно, после этого разбудить его не удается, поэтому так глубоко усыплять его не стоит.
__ramfunc void PowerDownAbsolute(void)
{
//Flash is in standby mode (__ramfunc)
while (1) ;
}
void PowerDown(void)
{
// Disable Interrupts
AT91F_AIC_DisableIt(AT91C_BASE_AIC, 0xFFFFFFFF );
//Analog-to-Digital Converter de-activated.
AT91F_ADC_CfgModeReg(AT91C_BASE_ADC, AT91C_ADC_SLEEP_MODE);
//USB transceiver disabled.
AT91F_UDP_DisableTransceiver(AT91C_BASE_UDP);
//ARM Core in idle mode.
AT91F_PMC_CfgSysClkDisableReg(AT91C_BASE_PMC, AT91C_PMC_UDP | AT91C_PMC_PCK | AT91C_PMC_PCK0 | AT91C_PMC_PCK1 | AT91C_PMC_PCK2);
// Pull-Up off
AT91F_PIO_CfgPullup(AT91C_BASE_PIOA,0xFFFFFFFF);
//AT91F_PIO_CfgPullup(AT91C_BASE_PIOA,0);
//Tri-state
//AT91F_PIO_CfgOpendrain(AT91C_BASE_PIOA,0xFFFFFFFF);
//AT91F_PIO_CfgOpendrain(AT91C_BASE_PIOA,0);
// Все на вход
//AT91F_PIO_CfgInput(AT91C_BASE_PIOA,0xFFFFFFFF);
//All peripheral clocks de-activated.
AT91F_PMC_DisablePeriphClock ( AT91C_BASE_PMC, 0xFFFFFFFF );
//MCK @ 500Hz.
AT91F_PMC_CfgMCKReg (AT91C_BASE_PMC,AT91C_PMC_CSS_SLOW_CLK | AT91C_PMC_PRES_CLK_4);
while(!(AT91F_PMC_GetStatus(AT91C_BASE_PMC) & AT91C_PMC_MCKRDY));
AT91F_CKGR_CfgPLLReg(AT91C_BASE_CKGR,0);
// Disable Main Oscillator
AT91F_CKGR_DisableMainOscillator(AT91C_BASE_CKGR);
while(!(AT91F_PMC_GetStatus(AT91C_BASE_PMC) & AT91C_PMC_MOSCS));
//Voltage regulator is in Low-power mode.
AT91F_VREG_Enable_LowPowerMode(AT91C_BASE_VREG);
//ARM Core in idle mode.
PowerDownAbsolute();
while (1) ;
}
nameless
Aug 30 2006, 07:14
Большое спасибо. Я именно в таком русле и начал самостоятельно.
Теперь другой вопрос - по какому именно прерыванию от UDP можно проснуться. Как я поня SOFINT не подходит, так как комп все время обращается к USB (наверное ищет вновь подключаемые устройства)
либо AT91C_UDP_ENDBUSRES, либо AT91C_UDP_RXRSM
В cfgDescriptor на всякий случай прописать, что устройство умеет WAKEUP