// =============================================================================================== void Pump_now(FunctionalState pump) { if(pump==ENABLE && !Power.Pump_deny) { Power.Pump_active=ENABLE; dac_on(); // Включаем ЦАП TIM9->EGR |= 0x0001; // Устанавливаем бит UG для принудительного сброса счетчика TIM_ClearITPendingBit(TIM9, TIM_IT_Update); TIM_CCxCmd(TIM9, TIM_Channel_1, TIM_CCx_Enable); // разрешить накачку TIM_ITConfig(TIM9, TIM_IT_Update, ENABLE); comp_on(); // Включаем компаратор } else { TIM_CCxCmd(TIM9, TIM_Channel_1, TIM_CCx_Disable); // запретить накачку TIM_ITConfig(TIM9, TIM_IT_Update, DISABLE); pump_counter_avg_impulse_by_1sec[0]++; comp_off(); // Выключаем компаратор dac_off(); // Выключаем ЦАП TIM_ClearITPendingBit(TIM9, TIM_IT_Update); Power.Pump_active=DISABLE; } }
/*----------------------------------------------------------------------------*/ void system_sleep(void) { #if OSC_CLOCK == 24000000L #else dac_off(); //关闭DAC,需要约3S钟才没有杂音,如果功放有mute功能,也可以将此句换成mute功放.由于dac_off()调用了delay_10ms,所以在这之前不能关中断 EA = 0; DACCON0 = 0xc0; //再次关DAC,如果没有执行dac_off(),DAC同样可以被关掉,只是会有杂音,但如果控制了功放的mute,也不会有杂音 DACCON1 = 0; DACCON2 = 0; Delay(20000); USBCON0 = 0; //关USB ADCCON = 0; //关ADC P0DIR = 0xFF; //关IO,具体的原则为:所有IO必须为数字功能,并设成输出,如果IO已经被外围电路拉成了固定状态(如一个用于选择FM芯片的IO口,已经通过外部电阻接到地), P1DIR = 0xFF; //则不用再作其它处理,但如果IO是悬空的,则需要将其上拉或下拉打开,保证其电平不会处于浮空。 P2DIR = 0xFF; P3DIR = 0xFF; P4DIR = 0xFF; P0IE = 0xff; P0PU = 0; P1PU = 0; P2PU = 0xff; P3PU = 0; P4PU = 0xff; P0PD = 0x7f; //本例中,P07正常时作为ADKEY使用,sleep后,作为数字口,通过下降沿来reset系统,因ADKEY外部有上拉,所以内部不能开上,下拉 P1PDB = 0; P1PDA = 0xff; P3PD = 0xff; #if OSC_CLOCK == 7600000L PLL_input(PLL_IN_76M); #endif #if OSC_CLOCK == 12000000L PLL_input(PLL_IN_12M); #endif Delay(1000); P3IE = 0x7F; #if OSC_CLOCK == 32768L mainclock_select(MAIN_CLK_32K); #else CLKCON |= 0X4; mainclock_select(MAIN_CLK_RC); #endif CLKCON &= ~0x36; WKUPPND &= 0xf0; WKUPCON |= BIT(2) | BIT(6); //本例使用P07作为唤醒IO PCON = 1; #endif }