// ======================================================= // Прерывание при конце интервала одного импульса накачки void TIM9_IRQHandler(void) { #ifdef debug Wakeup.tim9_wakeup++; #endif if((TIM9->CCER & (TIM_CCx_Enable << TIM_Channel_1)) && !poweroff_state) { current_pulse_count++; pump_counter_avg_impulse_by_1sec[0]++; if(COMP->CSR & COMP_CSR_INSEL) // если компаратор активен { if(Power.Pump_active==DISABLE) Pump_now(DISABLE); }else{ comp_on(); } } TIM_ClearITPendingBit(TIM9, TIM_IT_Update); }
void sleep_mode(FunctionalState sleep) { if(Settings.Sleep_time>0 && !Power.USB_active) { Power.Pump_deny=ENABLE; if(Power.Pump_active)Pump_now(DISABLE); set_msi(); if(sleep) { RTC_ITConfig(RTC_IT_WUT, DISABLE); Power.led_sleep_time=0; GPIO_SetBits(GPIOC,GPIO_Pin_13);// Выключаем подсветку display_off(); // выключить дисплей GPIO_ResetBits(GPIOA,GPIO_Pin_7);// Фиксируем режим 1.8 вольта, с низким потреблением ножки delay_ms(1000); // подождать установки напряжения DataUpdate.Need_batt_voltage_update=ENABLE; // разрешить работу АЦП adc_check_event(); // запустить преобразование delay_ms(100); // подождать установки напряжения PWR_FastWakeUpCmd(DISABLE); PWR_UltraLowPowerCmd(ENABLE); PWR_PVDCmd(DISABLE); RTC_ITConfig(RTC_IT_WUT, ENABLE); } else { RTC_ITConfig(RTC_IT_WUT, DISABLE); GPIO_SetBits(GPIOA,GPIO_Pin_7);// Переключаем в режим 3 вольта delay_ms(400); // подождать установки напряжения display_on(); // включить дисплей DataUpdate.Need_batt_voltage_update=ENABLE; // разрешить работу АЦП DataUpdate.Need_display_update=ENABLE; adc_check_event(); // запустить преобразование RTC_ITConfig(RTC_IT_WUT, ENABLE); sound_deactivate(); } Power.Pump_deny=DISABLE; } }
//////////////////////////////////////// // Секундный тик //////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void RTC_Alarm_IRQHandler(void) { // Тик каждые 4 секунды int i; #ifdef debug Wakeup.rtc_wakeup++; #endif if(RTC_GetITStatus(RTC_IT_ALRA) != RESET) { RTC_ClearITPendingBit(RTC_IT_ALRA); EXTI_ClearITPendingBit(EXTI_Line17); if(!poweroff_state) { Set_next_alarm_wakeup(); // установить таймер просыпания на +4 секунды DataUpdate.Need_display_update=ENABLE; if(Power.USB_active) { USB_not_active++; // Счетчик неактивности USB madorc_impulse+=Detector_massive[Detector_massive_pointer]; // Счетчик импульсов для передачи по USB } // Счетчик времени для обновления напряжения АКБ (каждые 4 минуты) if(DataUpdate.Batt_update_time_counter>75) { DataUpdate.Need_batt_voltage_update=ENABLE; DataUpdate.Batt_update_time_counter=0; } else DataUpdate.Batt_update_time_counter++; // Счетчик времени для обновления счетчика импульсов накачки if(DataUpdate.pump_counter_update_time>14) { #ifdef debug Wakeup.total_wakeup=0; Wakeup.total_cycle=0; Wakeup.rtc_wakeup=0; Wakeup.tim9_wakeup=0; Wakeup.pump_wakeup=0; Wakeup.comp_wakeup=0; Wakeup.sensor_wakeup=0; #endif if(!Power.USB_active)madorc_impulse=0; pump_counter_avg_impulse_by_1sec[1]=pump_counter_avg_impulse_by_1sec[0]; pump_counter_avg_impulse_by_1sec[0]=0; DataUpdate.pump_counter_update_time=0; if(pump_counter_avg_impulse_by_1sec[1]==0) //затычка на случай глюка с накачкой { dac_init(); Pump_now(DISABLE); while(RTC_WakeUpCmd(DISABLE)!=SUCCESS); RTC_SetWakeUpCounter(0xF96); // Установить таймаут просыпания = 2 секунды current_pulse_count=0; while(RTC_WakeUpCmd(ENABLE)!=SUCCESS); } } else DataUpdate.pump_counter_update_time++; // Счетчик дней if(DataUpdate.days_sec_count>=24600) // каждые 24 часа минут { DataUpdate.days_sec_count=0; working_days++; } else DataUpdate.days_sec_count++; // Сдвиг массива дозы if(DataUpdate.doze_sec_count>=150) // каждые 10 минут (150) { DataUpdate.Need_update_mainscreen_counters=ENABLE; // ----------------------------------------------------- DataUpdate.doze_count++; if(DataUpdate.doze_count>=doze_length) // Запись страницы во Flash //if(DataUpdate.doze_count>1) // Запись страницы во Flash { DataUpdate.doze_count=0; flash_write_page(DataUpdate.current_flash_page); DataUpdate.current_flash_page++; if(DataUpdate.current_flash_page > ((FLASH_END_ADDR-FLASH_START_ADDR)/FLASH_PAGE_SIZE)) // если за границами диапазона DataUpdate.current_flash_page=0; } // ----------------------------------------------------- for(i=doze_length;i>0;i--) { ram_Doze_massive[i]=ram_Doze_massive[i-1]; // сдвиг массива дозы ram_max_fon_massive[i]=ram_max_fon_massive[i-1]; // сдвиг массива максимального фона } ram_Doze_massive[0]=0; ram_max_fon_massive[0]=0; DataUpdate.doze_sec_count=1; //// !!!!! 0 } else DataUpdate.doze_sec_count++; //////////////////////////////////////////////////// //////////////////////////////////////////////////// if(Detector_massive[Detector_massive_pointer]>9) { if(Detector_massive[Detector_massive_pointer]>199) // деление на 9 при фоне более 10 000 { if(auto_speedup_factor!=10)auto_speedup_factor=9; } else { if(Detector_massive[Detector_massive_pointer]>99) // деление на 5 при фоне более 5 000 { if(auto_speedup_factor!=5)auto_speedup_factor=5; } else { if(Detector_massive[Detector_massive_pointer]>19) // деление на 3 при фоне более 1 000 { if(auto_speedup_factor!=3)auto_speedup_factor=3; } else { // деление на 2 при фоне более 500 if(auto_speedup_factor!=2)auto_speedup_factor=2; } } } if(auto_speedup_factor!=1)recalculate_fon(); // пересчет фона, если активированно ускорение } else { // если ускорение не требуется if(auto_speedup_factor!=1){auto_speedup_factor=1;recalculate_fon();} else { fon_level+=Detector_massive[Detector_massive_pointer];} } Detector_massive_pointer++; if(Detector_massive_pointer>=(Settings.Second_count>>2)) { if(auto_speedup_factor==1)fon_level-=Detector_massive[0]; Detector_massive[0]=0; Detector_massive_pointer=0; }else { if(auto_speedup_factor==1)fon_level-=Detector_massive[Detector_massive_pointer];
// ======================================================= // Прерывание по импульсу от датчикав 1 и кнопки 2 void EXTI9_5_IRQHandler(void) { extern __IO uint8_t Receive_Buffer[64]; extern __IO uint32_t Receive_length ; extern __IO uint32_t length ; #ifdef debug Wakeup.sensor_wakeup++; #endif if(EXTI_GetITStatus(EXTI_Line8) != RESET) { EXTI_ClearITPendingBit(EXTI_Line8); if(!poweroff_state) { Detector_massive[Detector_massive_pointer]++; // Добавляем пойманную частицу к счетчику ram_Doze_massive[0]++; // Увеличение суточного массива дозы if(Power.Pump_active==DISABLE) { if(last_count_pump_on_impulse>3) { pump_on_impulse=ENABLE; Pump_now(ENABLE); } else last_count_pump_on_impulse++; } if(Settings.Sound && !(Alarm.Alarm_active && !Alarm.User_cancel)) { if(Power.Display_active) { sound_activate(); } } } } if(EXTI_GetITStatus(EXTI_Line6) != RESET) { EXTI_ClearITPendingBit(EXTI_Line6); if(!poweroff_state) { if(Power.Display_active) { key|=0x2; // Кнопка + } Sound_key_pressed=ENABLE; check_wakeup_keys(); } } #ifdef version_401 if(EXTI_GetITStatus(EXTI_Line9) != RESET) // Подключено USB { EXTI_ClearITPendingBit(EXTI_Line9); if(!poweroff_state) { sound_activate(); Power.sleep_time=Settings.Sleep_time; Power.led_sleep_time=Settings.Sleep_time-3; } } #endif }