Jerry AC692X - Sleep Wake (перевод Гугл)
Пробуждение Джерри от сна отличается от некоторых других микросхем. После того, как IC Джерри просыпается, указатель ПК указывает на начальный адрес кода вместо инструкции перед сном, аналогичной reset, поэтому некоторые важные переменные должны быть сохранены. Он должен быть записан в виртуальную машину перед переходом в спящий режим, а затем считан обратно при сбросе.
//include_lib\common\flash_api.h
//------Please add a new VM item under the secondary dividing line-----//
//++++++Users apply for flash
user_VM_XM_rtc_task,
user_VM_XM_system_status_flag,
VM_MAX_INDEX,
s32 vm_write(u8 hdl, const void *data_buf, u16 len);
s32 vm_read(u8 hdl, void *data_buf, u16 len);
vm_write(user_VM_XM_system_status_flag,user_system_status_flag_buffer,11);
vm_read(user_VM_XM_system_status_flag,user_system_status_flag_buffer,11);
Существует два типа пробуждения покоя Джерри: один-пробуждение PR-порта, другой-пробуждение общего IO-порта, два разных спящих режима имеют разные функции входа в спящий режим и не могут использоваться взаимно.
PR порт
//Initialize to wake up on falling edge
void PR2_configure_wakeUP(void)
{
//PR2 io output
PORTR_PU (PR2, 1);
PORTR_PD (PR2, 0);
PORTR_DIR(PR2, 1);
PORTR_DIE(PR2, 1);
RTC_SFR_SET(RTC_CON_ADDR04, 0, 8, 0x22);//Allow PR2 port falling edge to wake up
IRTC_WKIE(1);
}
//Sleep function, as long as the PR2 port is pulled down to wake up
void user_task_enter_power_off_status(void)
{
printf("user_task_enter_power_off_status\n");
vm_write(user_VM_XM_system_status_flag,user_system_status_flag_buffer,11);
adc_mux_ch_set(0); //Close the ad function of the PR port to prevent the crystal oscillator from not working
set_lowpower_keep_32K_osc_flag(1); //The 32k crystal oscillator must be kept working before entering rtc sleep
enter_sys_soft_poweroff();// Shut down, power down can only be awakened through PR port rtc
}
Обычный порт ввода-вывода Возьмите PA0 в качестве примера, вы можете изменить его в соответствии с руководством
//Interrupt function
static void user_wakeup_isr(void)
{
JL_WAKEUP->CON2 |= BIT(0);
if (!read_wakeup){//Read io port level
printf("prot A0 input intrrupt trigger\n");
}
}
IRQ_REGISTER(IRQ_PORT_IDX, user_wakeup_isr);
void wakeup_init(void)
{
// PA0 configuration input The only difference between the sdk configuration and its own configuration is that I configure the pull-up input, which is configured with high resistance
JL_SYSTEM->LDO_CON1 = 0;
JL_WAKEUP->CON0 = 0; //wakeup enbale
JL_WAKEUP->CON1 = 0; //wakeup edge
JL_WAKEUP->CON2 |= BIT(0);
wakeup_INIT_EN();
JL_PORTA->DIE |= BIT(0);
JL_IOMAP->CON2 &= ~0x1F;
// JL_IOMAP->CON2 |= BIT(0); //Map PA1 port to wake up IO corresponding to IOMAP2[5:0] 000001
JL_WAKEUP->CON1 |= BIT(0); //Falling edge
JL_WAKEUP->CON0 |= BIT(0); //Enable
IRQ_REQUEST(IRQ_PORT_IDX, user_wakeup_isr); //Interrupt
printf("PA0 is confingured the wake up interrupt port\n");
}
void enter_sleep_mode_set(void)
{
close_wdt();
dac_toggle(0); //close dac mudule
while (!(BIT(7) & JL_ADC->CON));
JL_ADC->CON = 0;
JL_AUDIO->LADC_CON = 0;
JL_AUDIO->ADA_CON0 = 0;
JL_AUDIO->ADA_CON1 = 0;
JL_AUDIO->DAA_CON0 = 0;
JL_AUDIO->DAA_CON1 = 0;
JL_AUDIO->DAA_CON2 = 0;
JL_AUDIO->DAA_CON3 = 0;
/* JL_SYSTEM->LVD_CON = 0; */
JL_SYSTEM->LDO_CON1 = 0;
JL_WAKEUP->CON0 = 0; //wakeup enbale
JL_WAKEUP->CON1 = 0; //wakeup edge
JL_WAKEUP->CON2 = 0xffff; //wakeup pending(clear)
JL_WAKEUP->CON2 |= BIT(0);
JL_PORTA->DIR |= BIT(0);
JL_PORTA->DIE |= BIT(0);
JL_PORTA->PU |= BIT(0);
JL_PORTA->PD &= ~BIT(0);
JL_IOMAP->CON2 &= ~0x1F;
//Map PA0 port to wake up IO
JL_WAKEUP->CON1 |= BIT(0);
JL_WAKEUP->CON0 |= BIT(0);
adc_mux_ch_set(0); //Close the ad function of the PR port to prevent the crystal oscillator from not working
set_lowpower_keep_32K_osc_flag(1); //The 32k crystal oscillator must be kept working before entering rtc sleep
extern void set_sys_freq(u32 out_freq);
#define IDLE_Hz 120000000L
set_sys_freq(IDLE_Hz);
enter_sys_sleep_mode();
}